Vincent Torri a écrit :
Donc voici le code:
http://www.maths.univ-evry.fr/pages_perso/vtorri/files/layer.c
[...]
il y a sûrement quelque chose d'invalide dans les HDC utilisés
dans le code montré, ainsi que dans sa séquence - les coordonnées dans
'client' par exemple sont négative du fait de l'appel précédent à
SetWindowLongPtr(w, GWL_EXSTYLE, WS_EX_LAYERED).
Vincent Torri a écrit :
Donc voici le code:
http://www.maths.univ-evry.fr/pages_perso/vtorri/files/layer.c
[...]
il y a sûrement quelque chose d'invalide dans les HDC utilisés
dans le code montré, ainsi que dans sa séquence - les coordonnées dans
'client' par exemple sont négative du fait de l'appel précédent à
SetWindowLongPtr(w, GWL_EXSTYLE, WS_EX_LAYERED).
Vincent Torri a écrit :
Donc voici le code:
http://www.maths.univ-evry.fr/pages_perso/vtorri/files/layer.c
[...]
il y a sûrement quelque chose d'invalide dans les HDC utilisés
dans le code montré, ainsi que dans sa séquence - les coordonnées dans
'client' par exemple sont négative du fait de l'appel précédent à
SetWindowLongPtr(w, GWL_EXSTYLE, WS_EX_LAYERED).
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
j'ai un code qui tombe en marche avec
UpdateLayeredWindow(...,ULW_ALPHA) mais pas avec ULW_COLORKEY, je
regarderais (p.e.) demain.
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence, mais
le bord de la fenetre disparait (la partie non-client)
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec le
contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour forcer
l'affichage, mais ca ne marche pas.
3) quand j'appuie une 3eme fois sur 't', j'active la transparence, mais
la fenetre est plus petite (comme si la partie non-client etait integre
dans la partie client, a cause de l'etape 2.
Ca avance lentement, mais ce n'est pas parfait.
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence, mais
le bord de la fenetre disparait (la partie non-client)
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec le
contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour forcer
l'affichage, mais ca ne marche pas.
3) quand j'appuie une 3eme fois sur 't', j'active la transparence, mais
la fenetre est plus petite (comme si la partie non-client etait integre
dans la partie client, a cause de l'etape 2.
Ca avance lentement, mais ce n'est pas parfait.
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence, mais
le bord de la fenetre disparait (la partie non-client)
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec le
contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour forcer
l'affichage, mais ca ne marche pas.
3) quand j'appuie une 3eme fois sur 't', j'active la transparence, mais
la fenetre est plus petite (comme si la partie non-client etait integre
dans la partie client, a cause de l'etape 2.
Ca avance lentement, mais ce n'est pas parfait.
Vincent Torri a écrit :
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence,
mais le bord de la fenetre disparait (la partie non-client)
oui cela semble être toujours le cas avec UpdateLayeredWindow, à tout
le moins lorsque le filtre ne joue que sur des extrêmes transparent
et opaque - SetLayeredWindowAttributes en jouant sur le canal alpha
permet d'obtenir un frame translucide.
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec
le contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour
forcer l'affichage, mais ca ne marche pas.
il faut donc sauvegarder les épaisseurs du cadre pour redimensionner
la fenêtre et forcer le réaffichage du cadre - SetWindowPos permet
de faire cela.
Vincent Torri a écrit :
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence,
mais le bord de la fenetre disparait (la partie non-client)
oui cela semble être toujours le cas avec UpdateLayeredWindow, à tout
le moins lorsque le filtre ne joue que sur des extrêmes transparent
et opaque - SetLayeredWindowAttributes en jouant sur le canal alpha
permet d'obtenir un frame translucide.
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec
le contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour
forcer l'affichage, mais ca ne marche pas.
il faut donc sauvegarder les épaisseurs du cadre pour redimensionner
la fenêtre et forcer le réaffichage du cadre - SetWindowPos permet
de faire cela.
Vincent Torri a écrit :
Neanmoins, il y a 3 problemes (peut-etre lies):
1) La premiere fois que j'appuie sur 't', j'active la transparence,
mais le bord de la fenetre disparait (la partie non-client)
oui cela semble être toujours le cas avec UpdateLayeredWindow, à tout
le moins lorsque le filtre ne joue que sur des extrêmes transparent
et opaque - SetLayeredWindowAttributes en jouant sur le canal alpha
permet d'obtenir un frame translucide.
2) la deuxieme fois que j'appuis sur 't', c'est cense desactiver la
transparence, mais ca ne re-affiche pas correctement la fenetre avec
le contenu initial. J'ai essaye d'envoyer le message WM_PAINT pour
forcer l'affichage, mais ca ne marche pas.
il faut donc sauvegarder les épaisseurs du cadre pour redimensionner
la fenêtre et forcer le réaffichage du cadre - SetWindowPos permet
de faire cela.
J'ai trouve un site qui en parle et j'ai relu le code de Christian qui en
parle aussi. Apparemment, il faut envoyer le message WM_PRINT avec
PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
La partie non client est bien affichee mais dans la partie client :-).
Apparemment, il faut agrandir la partie geree par UpdateLayeredWindow a
non plus la seule partie client, mais la totalite de la fenetre. Bon, il
y a de l'espoir :-)
J'ai trouve un site qui en parle et j'ai relu le code de Christian qui en
parle aussi. Apparemment, il faut envoyer le message WM_PRINT avec
PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
La partie non client est bien affichee mais dans la partie client :-).
Apparemment, il faut agrandir la partie geree par UpdateLayeredWindow a
non plus la seule partie client, mais la totalite de la fenetre. Bon, il
y a de l'espoir :-)
J'ai trouve un site qui en parle et j'ai relu le code de Christian qui en
parle aussi. Apparemment, il faut envoyer le message WM_PRINT avec
PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
La partie non client est bien affichee mais dans la partie client :-).
Apparemment, il faut agrandir la partie geree par UpdateLayeredWindow a
non plus la seule partie client, mais la totalite de la fenetre. Bon, il
y a de l'espoir :-)
le probleme peut-il venir du fait que les couleurs doivent etre pre-
multipliees ? dans ce cas, il est peut-etre possible de s'en sortir avec
ULW_ALPHA, mais en remplissant correctement le mask_bitmap
le probleme peut-il venir du fait que les couleurs doivent etre pre-
multipliees ? dans ce cas, il est peut-etre possible de s'en sortir avec
ULW_ALPHA, mais en remplissant correctement le mask_bitmap
le probleme peut-il venir du fait que les couleurs doivent etre pre-
multipliees ? dans ce cas, il est peut-etre possible de s'en sortir avec
ULW_ALPHA, mais en remplissant correctement le mask_bitmap
Vincent Torri a écrit :
J'ai trouve un site qui en parle et j'ai relu le code de Christian
qui en parle aussi. Apparemment, il faut envoyer le message WM_PRINT
avec PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
oui, je commence à comprendre également.
parce que la fenêtre complète est mise en cache, il faut évidemment
donner une bitmap complète de la fenêtre à UpdateLayeredWindow,
ie que le HDC source (mask_dc) contienne une bitmap (mask_bitmap)
représentant toute la fenêtre, or ton 'mask_bitmap' est créé avec
la dimension de la zone cliente, il faut ici le zone complète
(GetWindowRect et non GetClientRect).
également il faut dessiner le frame dans cette bitmap, via un
WM_PRINT(PRF_NONCLIENT) ou directement par un DrawFrameControl,
et finalement la zone cliente en calculant son origine.
tu répondais précedemment:
"Ce petit programme est pour moi un prelude a l'integration
"de la gestion des fenetres non rectangulaire et translucides
"dans cette bibliotheque"
ma compréhension (la logique?) voudrait qu'une fenêtre non
rectangulaire ne dispose pas de cadre (en tout cas pas celui
de la zone non-client d'une fenêtre normale, un cadre custom
pouvant être dessiné selon le patatoïde de la fenêtre créée).
la question de la NC-area est donc a priori irrévélante pour
de telles fenêtres; tout en étant nécessaire pour les fenêtres
rectangulaires et translucides; ces 2 types de fenêtres demandant
donc 2 gestions.
Vincent Torri a écrit :
J'ai trouve un site qui en parle et j'ai relu le code de Christian
qui en parle aussi. Apparemment, il faut envoyer le message WM_PRINT
avec PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
oui, je commence à comprendre également.
parce que la fenêtre complète est mise en cache, il faut évidemment
donner une bitmap complète de la fenêtre à UpdateLayeredWindow,
ie que le HDC source (mask_dc) contienne une bitmap (mask_bitmap)
représentant toute la fenêtre, or ton 'mask_bitmap' est créé avec
la dimension de la zone cliente, il faut ici le zone complète
(GetWindowRect et non GetClientRect).
également il faut dessiner le frame dans cette bitmap, via un
WM_PRINT(PRF_NONCLIENT) ou directement par un DrawFrameControl,
et finalement la zone cliente en calculant son origine.
tu répondais précedemment:
"Ce petit programme est pour moi un prelude a l'integration
"de la gestion des fenetres non rectangulaire et translucides
"dans cette bibliotheque"
ma compréhension (la logique?) voudrait qu'une fenêtre non
rectangulaire ne dispose pas de cadre (en tout cas pas celui
de la zone non-client d'une fenêtre normale, un cadre custom
pouvant être dessiné selon le patatoïde de la fenêtre créée).
la question de la NC-area est donc a priori irrévélante pour
de telles fenêtres; tout en étant nécessaire pour les fenêtres
rectangulaires et translucides; ces 2 types de fenêtres demandant
donc 2 gestions.
Vincent Torri a écrit :
J'ai trouve un site qui en parle et j'ai relu le code de Christian
qui en parle aussi. Apparemment, il faut envoyer le message WM_PRINT
avec PRF_NONCLIENT:
SendMessage(layer_window, WM_PRINT, (WPARAM)mask_dc,
PRF_NONCLIENT);
oui, je commence à comprendre également.
parce que la fenêtre complète est mise en cache, il faut évidemment
donner une bitmap complète de la fenêtre à UpdateLayeredWindow,
ie que le HDC source (mask_dc) contienne une bitmap (mask_bitmap)
représentant toute la fenêtre, or ton 'mask_bitmap' est créé avec
la dimension de la zone cliente, il faut ici le zone complète
(GetWindowRect et non GetClientRect).
également il faut dessiner le frame dans cette bitmap, via un
WM_PRINT(PRF_NONCLIENT) ou directement par un DrawFrameControl,
et finalement la zone cliente en calculant son origine.
tu répondais précedemment:
"Ce petit programme est pour moi un prelude a l'integration
"de la gestion des fenetres non rectangulaire et translucides
"dans cette bibliotheque"
ma compréhension (la logique?) voudrait qu'une fenêtre non
rectangulaire ne dispose pas de cadre (en tout cas pas celui
de la zone non-client d'une fenêtre normale, un cadre custom
pouvant être dessiné selon le patatoïde de la fenêtre créée).
la question de la NC-area est donc a priori irrévélante pour
de telles fenêtres; tout en étant nécessaire pour les fenêtres
rectangulaires et translucides; ces 2 types de fenêtres demandant
donc 2 gestions.
oui, j'en suis venu a cette conclusion aussi, sans pour autant avoir les
reponses exactes :-) J'ai un peu essaye et je n'ai pas reussi a gerer
correctement les bords.
Ha, la encore, c'est un manque de precision de ma part. La gestion des
bords sous Linux est faite independamment de la fenetre (c'est le
gestionnaire de fenetre qui s'en occuppe), c'est une des tres grosses
differences entre les fenetres sous Windows et sous Unix. Donc, une
fenetre sous linux correspondrait uniquement a la partie client d'une
fenetre de Windows. Donc une fenetre transparente sous Linux peut tres
facilement avoir un bord, et c'est en effet le comportement par defaut si
on gere la transparence et si on n'enleve pas les bords.
Neanmoins, je suis d'accord avec toi, une fenetre non rectangulaire ne
devrait pas avoir de bords. [...]
Mais bon, c'est vraiment tres tres galere sous Windows.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je porte
sous Windows les bibliotheques utilisees par le gestionnaire de fenetres
Enlightenment. Un exemple d'utilisation de ces bibliotheques (orientees
graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
oui, j'en suis venu a cette conclusion aussi, sans pour autant avoir les
reponses exactes :-) J'ai un peu essaye et je n'ai pas reussi a gerer
correctement les bords.
Ha, la encore, c'est un manque de precision de ma part. La gestion des
bords sous Linux est faite independamment de la fenetre (c'est le
gestionnaire de fenetre qui s'en occuppe), c'est une des tres grosses
differences entre les fenetres sous Windows et sous Unix. Donc, une
fenetre sous linux correspondrait uniquement a la partie client d'une
fenetre de Windows. Donc une fenetre transparente sous Linux peut tres
facilement avoir un bord, et c'est en effet le comportement par defaut si
on gere la transparence et si on n'enleve pas les bords.
Neanmoins, je suis d'accord avec toi, une fenetre non rectangulaire ne
devrait pas avoir de bords. [...]
Mais bon, c'est vraiment tres tres galere sous Windows.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je porte
sous Windows les bibliotheques utilisees par le gestionnaire de fenetres
Enlightenment. Un exemple d'utilisation de ces bibliotheques (orientees
graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
oui, j'en suis venu a cette conclusion aussi, sans pour autant avoir les
reponses exactes :-) J'ai un peu essaye et je n'ai pas reussi a gerer
correctement les bords.
Ha, la encore, c'est un manque de precision de ma part. La gestion des
bords sous Linux est faite independamment de la fenetre (c'est le
gestionnaire de fenetre qui s'en occuppe), c'est une des tres grosses
differences entre les fenetres sous Windows et sous Unix. Donc, une
fenetre sous linux correspondrait uniquement a la partie client d'une
fenetre de Windows. Donc une fenetre transparente sous Linux peut tres
facilement avoir un bord, et c'est en effet le comportement par defaut si
on gere la transparence et si on n'enleve pas les bords.
Neanmoins, je suis d'accord avec toi, une fenetre non rectangulaire ne
devrait pas avoir de bords. [...]
Mais bon, c'est vraiment tres tres galere sous Windows.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je porte
sous Windows les bibliotheques utilisees par le gestionnaire de fenetres
Enlightenment. Un exemple d'utilisation de ces bibliotheques (orientees
graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
en fait c'est simple: quand on a (enfin) des bords, on n'en veut plus!
<http://cjoint.com/?ffolcvSNTT>
selon l'image .bmp source, j'utilise SetLayeredWindowAttributes
si 24 bits (pas de canal alpha) ou UpdateLayeredWindow si 32 bits.
l'avantage de SetLayeredWindowAttributes est que l'on update
facilement le contenu; avec UpdateLayeredWindow et contrairement
à ce que je pensais, il n'y a pas moyen d'updater ce contenu,
il faut recréer un layer - en altérant la bitmap kivabien si
c'est possible ou en le recréant.Mais bon, c'est vraiment tres tres galere sous Windows.
mais non.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je
porte sous Windows les bibliotheques utilisees par le gestionnaire de
fenetres Enlightenment. Un exemple d'utilisation de ces bibliotheques
(orientees graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
si c'est pour proposer un window manager de remplacement à Win Vista
ou Win.7, j'ai peur que cela soit énormément d'effort pour rien ...
de même, si la lib. vise à faciliter le dév. de widgets, des APIs
MS récentes le font; reste une lib. générique pour construire son GUI,
la mode chez les gamins est plutôt win.form ou net.form (ou je sais
pas quoi mais une horreur), bref c'est pas gagné,
les frameworks tels
Qt sont très peu utilisés sous Win32/64, cela reste néanmoins un beau
défi. courage.
en fait c'est simple: quand on a (enfin) des bords, on n'en veut plus!
<http://cjoint.com/?ffolcvSNTT>
selon l'image .bmp source, j'utilise SetLayeredWindowAttributes
si 24 bits (pas de canal alpha) ou UpdateLayeredWindow si 32 bits.
l'avantage de SetLayeredWindowAttributes est que l'on update
facilement le contenu; avec UpdateLayeredWindow et contrairement
à ce que je pensais, il n'y a pas moyen d'updater ce contenu,
il faut recréer un layer - en altérant la bitmap kivabien si
c'est possible ou en le recréant.
Mais bon, c'est vraiment tres tres galere sous Windows.
mais non.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je
porte sous Windows les bibliotheques utilisees par le gestionnaire de
fenetres Enlightenment. Un exemple d'utilisation de ces bibliotheques
(orientees graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
si c'est pour proposer un window manager de remplacement à Win Vista
ou Win.7, j'ai peur que cela soit énormément d'effort pour rien ...
de même, si la lib. vise à faciliter le dév. de widgets, des APIs
MS récentes le font; reste une lib. générique pour construire son GUI,
la mode chez les gamins est plutôt win.form ou net.form (ou je sais
pas quoi mais une horreur), bref c'est pas gagné,
les frameworks tels
Qt sont très peu utilisés sous Win32/64, cela reste néanmoins un beau
défi. courage.
en fait c'est simple: quand on a (enfin) des bords, on n'en veut plus!
<http://cjoint.com/?ffolcvSNTT>
selon l'image .bmp source, j'utilise SetLayeredWindowAttributes
si 24 bits (pas de canal alpha) ou UpdateLayeredWindow si 32 bits.
l'avantage de SetLayeredWindowAttributes est que l'on update
facilement le contenu; avec UpdateLayeredWindow et contrairement
à ce que je pensais, il n'y a pas moyen d'updater ce contenu,
il faut recréer un layer - en altérant la bitmap kivabien si
c'est possible ou en le recréant.Mais bon, c'est vraiment tres tres galere sous Windows.
mais non.
PS: Au cas ou tu te demanderais ce que sont ces bibliotheques, je
porte sous Windows les bibliotheques utilisees par le gestionnaire de
fenetres Enlightenment. Un exemple d'utilisation de ces bibliotheques
(orientees graphisme) permet de faire ce genre de choses:
http://calaos.fr/pub/video/calaos_media_music.ogg
http://calaos.fr/pub/video/calaos_widgets.ogg
si c'est pour proposer un window manager de remplacement à Win Vista
ou Win.7, j'ai peur que cela soit énormément d'effort pour rien ...
de même, si la lib. vise à faciliter le dév. de widgets, des APIs
MS récentes le font; reste une lib. générique pour construire son GUI,
la mode chez les gamins est plutôt win.form ou net.form (ou je sais
pas quoi mais une horreur), bref c'est pas gagné,
les frameworks tels
Qt sont très peu utilisés sous Win32/64, cela reste néanmoins un beau
défi. courage.