La création d'un Transparent fenêtre Enfant sur le haut de la non-transparence de la Fenêtre Parent ( win 32 )
J'ai un programme qui n'est pas écrit par moi. Je n'ai pas la source et le développeur de ce programme est de développer de façon indépendante. Il me donne la HWND
et HINSTANCE
poignées de ce programme.
J'ai créé une fenêtre enfant SUR sa fenêtre, à l'aide de win32
api.
La première chose que j'ai besoin est de faire de cet enfant de la fenêtre de la transparence sur une certaine zone et opaque sur une autre zone(comme un Heads-up display(HUD) pour un jeu), de sorte que l'utilisateur peut voir les choses dans les deux fenêtres.
la Deuxième chose que j'ai besoin est de diriger tous les commentaires à la fenêtre parent. De ma fenêtre enfant a besoin d'aucune entrée.
je sais que WS_EX_TRANSPARENT
seulement à l'enfant de dessiner à la fin comme dans les peintres de l'algorithme.
je ne peux pas utiliser WS_EX_LAYERED
parce que c'est un enfant de la fenêtre.
merci d'avance 🙂
p.s.
j'ai cherché partout mais n'ai pas trouvé de solution si il y avait des questions similaires autour de l'internet.
effectivement, c'est une PALETTE comme chose pour ce jeu. je ne peux pas dessiner directement sur la fenêtre parent en raison de la complexité avec multi-threads tout pour de nombreuses autres raisons.
-- EDIT ---------------------------
Hé les gars,
je travaille toujours sur elle. essayez différentes façons avec ce que vous avez tous a suggéré.
Est-il un moyen de combiner directX
et SetWindowRgn()
fonction ou directx
avec BitBlt()
fonction. je pense que cela va faire l'affaire.
actuellement, je suis en train de tester toutes les choses comme un enfant de la fenêtre et une fenêtre superposée.
- Son laid, mais vous pouvez créer un cadre de plus haut niveau au cours de la fenêtre et de suivi de mouvement de la fenêtre en dessous. Ensuite configurer les régions transparentes: codeguru.com/cpp/w-d/dislog/non-rectangulardialogs/article.php/...
- Si vous faites la fenêtre transparente qui vous permettra seulement de voir la fenêtre parent. Êtes-vous essayer de faire un trou dans la fenêtre parent?
- Eh bien, vous avez besoin d'au moins WS_EX_TRANSPARENT. Un problème que vous aurez à traiter avec, que l'auteur va effacer sa fenêtre sur le message WM_ERASEBKGND et effacer les pixels du fond que vous avez appris de la style de drapeau. De sorte que vous aurez besoin à la sous-classe de sa procédure de fenêtre et de supprimer ou de remplacer ce message. Si ce qui est dessiné avec WM_PAINT fonctionne encore bien est une question ouverte, vous aurez besoin de trouver par vous-même. Les chances sont faibles si elle contient du texte ou des graphiques avec contours lissés. Poster un commentaire, étant donné les faibles chances de succès.
- WS_EX_TRANSPARENT est l'un des plus déroutants de la fenêtre des styles. Il ne fait pas une fenêtre transparente, elle change juste l'ordre de rendu.
- oui et il fait des Test de collision transparent.. pas la visibilité.. hehe
Vous devez vous connecter pour publier un commentaire.
OK les amis, enfin j'ai fait des choses folles pour y arriver. mais ce n'est pas très efficace comme l'utilisation de direct x directement pour le dessin.
ce que j'ai fait,
(WS_EX_ TRANSPARENT | WS_EX_LAYERED | WS_EX_ TOOLWINDOW)
et ()sur CreateWindowEx
(WS_EX_DLGMODALFRAME |
à partir de la fenêtre styles et aussiWS_EX_CLIENTEDGE | WS_EX_STATICEDGE)
retiré
(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE |
de fenêtre étendue de styles.WS_EX_APPWINDOW)
la barre des tâches. aussi le hittest est passé à tout ce qui est derrière mon
de la fenêtre.
WM_CLOSE
,WM_DESTROY
, pour envoyer leWM_CLOSE
ouWM_DESTROY
respectivement à la fenêtre de monWM_SIZE
,WM_MOVE
, de les redimensionner et de déplacer ma fenêtre selon l'une à l'autrefenêtre
WM_LBUTTONUP
,WM_RBUTTONUP
,WM_MBUTTONUP
, pour faire ma fenêtre porté à la tête, et toujours garder le focus sur l'autre fenêtre, de sorte que ma fenêtre n'est pas se caché derrière l'autre fenêtrecela fonctionne parfaitement, la seule chose, c'est son pas très à rendre les choses transparentes.
et l'autre problème est de donner alpha blending pour les objets dessinés.
mais vous pouvez facilement définir le toatal alpha(transparence) à l'aide de SetLayeredWindowAttributes fonction.
merci pour toute l'aide que vous les gars ont donné, toutes les choses que u gars dit a été utilisé et ils m'ont guidé comme u peut voir. 🙂
la chose triste est, nous avons décidé de ne pas utiliser cette méthode en raison de problèmes d'efficacité 🙁
mais j'ai appris beaucoup de choses et c'était une expérience extraordinaire. et c'est tout ce qui compte pour moi 🙂
merci 🙂
Vous pouvez utiliser
WS_EX_LAYERED
pour enfant de windows à partir de Windows 8 et.À l'appui des versions antérieures de windows, il suffit de créer un niveau de la fenêtre superposée comme un popup (sans chrome) et assurer sa positionné au dessus de la fenêtre de jeu à l'endroit approprié. La plupart des utilisateurs ne pas déplacer les fenêtres, ils travaillent tout le temps, donc, bien que vous aurez besoin de surveiller la fenêtre parent en mouvement, et re position de la PALETTE, ce ne doit pas être un frein.
Ne pas prendre le focus (dans le cas d'un enfant de la fenêtre), ou l'activation (dans le cas d'être un popup) est plus intéressante, mais encore tout à fait faisable:- Le système d'exploitation n'est pas fait automatiquement attribuer le focus, ou à l'activation, à un cliqué sur la fenêtre de Windows WindowProc prend toujours l'accent, ou à l'activation, en appelant
SetFocus
, ou des variantes deSetActiveWindow
ouSetForegroundWindow
sur lui-même. La chose importante ici est, si vous consommez tous les souris et non client de la souris messages sans les transmettre sur DefWindowProc, votre HUD ne sera jamais voler l'activation ou le focus du clavier de la fenêtre de Jeu suite à un clic.Comme une fenêtre pop-up, ou d'une fenêtre sur un autre thread, vous pourriez avoir à gérer manuellement les messages de souris que la fenêtre de votre proc ne se, et les poster à la fenêtre de jeu. Sinon, pour répondre à
WM_NCHITTEST
avecHTTRANSPARENT
(un effet similaire à celui quiWS_EX_TRANSPARENT
atteint), vous pouvez obtenir le système pour tenir sur la souris passe au message en bas de la pile jusqu'à ce qu'il trouve une cible.Vous pouvez faire un trou dans le parent de la fenêtre à l'aide de
SetWindowRgn
.Aussi, juste parce que ce n'est pas votre fenêtre ne signifie pas que vous ne pouvez pas en faire une fenêtre superposée.
http://msdn.microsoft.com/en-us/library/ms997507.aspx
Enfin, vous pouvez prendre le contrôle d'une autre fenêtre par l'aide de sous-classement - essentiellement-vous remplacer votre Wndproc à la place de leur, de gérer les messages que vous souhaitez gérer, puis passer le reste de leur origine wndproc.