FENETRE NON RECTANGULAIRE (WIN32)

cs_Boing Messages postés 15 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 3 janvier 2007 - 25 févr. 2005 à 09:14
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 - 10 déc. 2006 à 13:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29750-fenetre-non-rectangulaire-win32

Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
10 déc. 2006 à 13:06
Salut:

Très bonne source. (8/10)

Juste une question: Comment ajouter des boutons sans pourtant gâcher l'images utiliser comme fond?
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
15 août 2005 à 00:10
J'en ai aucune idée, faudrais que tu vois ça avec un utilisateur de dev-cpp...
Dans cette source j'utilise LoadBitmap(..), y'a rien de mystique si tu connais le Win32.

Ciao
pixelinf Messages postés 15 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 30 avril 2006
14 août 2005 à 23:25
Salut, Urgo repartons du bon pied ok, j'ai 21 ans voilà pour info :).

Donc enfait, je sais pas si ça vient de moi, mais desfois il ne prend pas en compte le fait que j'appuis sur echap, je suis sous devcpp, c'est pas ton exe qui marche pas, c'est quand je je prend ton code et je compile, il faut peut être faire une manip particuliere pour la compile ou direct ? De plus quand je met l'image dans le fichier ressource ça marche pas, il n'affiche pas la fenêtre, je susi obligé de charger une image de l'extérieure, tu sais c'est dû à quoi ?

(Cependant ton code est super c'est ce que je cherchais).

Merci d'avance.
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
14 août 2005 à 23:10
Gros malin, j'ai été tout à fait correct dans ma réponse, excepté le fait que je ne t'ai pas vouvoyer, mais vu que tu n'as pas voulu donner ton âge je me suis accordé cette liberté.
Et puis ce genre de commentaire "ça marche pas", ça m'avance vachement...
Ca te fait ça uniquement avec mon exe, ou aussi lorsque tu compiles? Tu travailles sous dev, sous vs....?
Oui effectivement je suis direct dans mes propos et ça dérange, mais si tu n'es pas content tu peux toujours aller voir ailleurs, rien ne t'en empêche.

Je n'ai jamais refuser d'aider qqun lorsque cela était dans mes capacités.
pixelinf Messages postés 15 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 30 avril 2006
14 août 2005 à 20:56
tu es susceptible on dirait, je n'ai pas critiqué ce que tu as fait, mais c'est juste chez moi il y a un problème, enfin bref!
En attendant, tu aurais dû t'abstenir de mettre ce genre de "commentaire".
Tu as le droit de fermer ta bouche mec ok :)

Bonne soirée
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
14 août 2005 à 18:14
OUI, tu es "le seul" (Da Only One) à avoir ce problème, merci de finir cette conversation par mp (si besoin est) afin d'éviter toute pollution avec des commentaires HS.
pixelinf Messages postés 15 Date d'inscription samedi 30 avril 2005 Statut Membre Dernière intervention 30 avril 2006
9 août 2005 à 22:41
Petit probleme sur le programme, il ne prend plus en compte les messages, par exemple pour le traitement de la touche espace :

case WM_KEYDOWN:
if(wParam == VK_ESCAPE) PostMessage(hWnd, WM_CLOSE, 0, 0);
return 0;

ça ne marche pas, est ce que vous avez rencontré le même problème ou je suis le seul ? merci d'avance.
s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 3
10 mars 2005 à 18:30
oui, merci, tout marche maintenant, j'ai trouvé une source qui l'expliquai ^^

merci, a+
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
10 mars 2005 à 17:19
Pour Jonathan :

#define LWA_COLORKEY 0x01

et

SLWA_FUNC MySetLayeredWindowAttributes;
HMODULE hUser32 = GetModuleHandle("USER32.DLL");
if (!hUser32) return false;
MySetLayeredWindowAttributes = (SLWA_FUNC)GetProcAddress(hUser32, "SetLayeredWindowAttributes");

J'espère que ça te servira.

YOYO, @+.
s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 3
10 mars 2005 à 15:53
Un autre probleme :
SetLayeredWindowAttributes n'est pas déclarée non plus...
Quelqu'un pourait m'aider?
s@ldon Messages postés 140 Date d'inscription samedi 1 novembre 2003 Statut Membre Dernière intervention 30 septembre 2009 3
10 mars 2005 à 15:41
J'utilise devc++, et apparement LWA_COLORKEY n'est pas déclaré...
J'ai cherché dans windows.h et winuser.h mais je ne l'ai pas trouvé.
Meme sur msdn, j'ai trouvé un exemple, mais pas le code de LWA_COLORKEY...
Je pourré savoir le nombre que cette constante défini? ^^

merci!
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
7 mars 2005 à 23:01
Source mise à jour (sans doute la dernière).
Je te remerci Benoît pour ton aide!

Ciao
Christian
cs_Boing Messages postés 15 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 3 janvier 2007
7 mars 2005 à 09:46
Hello Urgo,

Juste un petite remarque supplémentaire, Lorsque tu utilises SelectObject, tu dois sauvegarder le Handle de l'objet précédent et le rétablir une fois que tu as fini. De cette façon, GDI est capable de faire le nettoyage.

donc :
HBITMAP OldBmp = NULL;
hMemDC = CreateCompatibleDC(hDC);
OldBmp = (HBITMAP)SelectObject(hMemDC, hBmp);
BitBlt(hDC, 0, 0, SizeBmp.cx, SizeBmp.cy, hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, OldBmp);
DeleteDC(hMemDC);

Le gros problème, c'est que le debugger intégré à Visual ne gère pas les ressources et GDI donc on ne sait jamais ce qui se passe vraiment sauf à regarder les ressources de l'OS qui diminuent... Ou alors il faut utiliser un autre debugger.

Petite astuce aussi :
Tu interceptes WM_LBUTTONDOWN et tu le transfères sur WM_NCLBUTTONDOWN, tu peux utiliser WM_NCHITTEST et renvoyer HTCAPTION. C'est pratique, tu peux renvoyer la valeur que tu veux, HTCLOSE pour une zone de fermeture, HTNOWHERE pour une zone non cliquable...

A+
Benoît
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
6 mars 2005 à 10:36
Bravo Urgo,

très bonne source.
Moi je dis ça vaut bien un 8/10.

YOYO, @+.
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
26 févr. 2005 à 14:45
Ok, cette fois-ci j'ai compris. Merci à toi!

Le code sera mis à jour d'ici demain.

Bye
Urgo
cs_Boing Messages postés 15 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 3 janvier 2007
26 févr. 2005 à 13:54
Hello Urgo,

C justement parceque tu mets hbrBackground à 0 (ou NULL) que tu devrais faire ton affichage du bitmap de fond de la fenêtre dans WM_ERASEBKGND...
C pas obligatoire, c'est juste plus optimisé.

Quand au support de Windows 98... Ca dépend de l'utilisateur visé. Je suis d'accord avec toi, si tu ne vises pas 98 le code que tu proproses est mieux. D'ailleurs je t'ai mis 8/10 pour la simplicité et la clareté de l'exemple.

a+
Benoît
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
25 févr. 2005 à 21:03
1Ko = 1024 octets
W2K = Windows 2000

Faut lire la description de la source avant de se ruer sur le code...

Va faire un tour sur http://msdn.microsoft.com si tu ne connais pas, tu y trouveras ton bonheur...

Télécharge JR4 et CP5 (si c'est pas déjà fait), ici :
http://brunews.free.fr/brunews/index.htm
(site de notre cher admin CS (Codes-Sources, pas le FPS non de dieu! :p) : le fabuleux BruNews)

Bye
Urgo
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 févr. 2005 à 20:28
ok merci (mais c'est sans doute l'expression W2K que je ne comprend pas). Cela dit ces commentaire seront bien mieux dans le code.
cs_Urgo Messages postés 780 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 16 avril 2009 1
25 févr. 2005 à 18:55
C'est pourtant clair :

DWORD VerifWin2KMini() // Vérifie si l'OS est W2K minimum (cf description de la source), l'appli ne démarrera pas si tu as Windows 98 par exemple.
Pk cette fonction? Tout simplement à cause de l'API SetLayeredWindowAttribute (pour la transparence) => VOIR MSDN

#define _WIN32_WINNT 0x0500 // Instruction qui indique que l'on utilise W2K ou supérieur, permet une compilation sans erreur => VOIR MSDN pour précisions

SIZE SizeBmp = {128, 128}; // Largeur puis hauteur du bmp utilisé

Voir http://www.cppfrance.com/code.aspx?ID=10721 pour comparer le nombre de lignes de code; moi je ne tourne plus sur Windows 98 depuis un bon moment!

Ici je ne suis pas obligé de traiter le message WM_ERASEBKGND, car le membre hbrBackground de la structure WNDCLASSEX est passé à zéro lors de la création de la classe de la fenêtre.

Bye
Urgo
minet03 Messages postés 415 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 2 décembre 2005 3
25 févr. 2005 à 18:20
ah quel dommage !!! c'est un code si intéressant, le seul problème c'est que tu ne commente rien dedans !!! c'est très dommage. Si tu pouvais juste rajouter des commentaire sur les ligne les plus importante, et pourquoi pas expliqué à quoi servent les fonctions (surtout la troisième, celle après l'enregistrement de la classe). 6/10
cs_Boing Messages postés 15 Date d'inscription mardi 3 août 2004 Statut Membre Dernière intervention 3 janvier 2007
25 févr. 2005 à 09:14
Hello,

Tu devrais plutôt afficher ton Bitmap en réponse à WM_ERASEBKGND comme ça tu évites plus tard des réaffichages intempestifs car WM_PAINT est appelé pour toutes les invalidations et WM_ERASEBKGND uniquement lorsqu'on invalide avec erase = TRUE.

Pour faire la "même" chose à peu prés et que cela fonctionne en plus sous 98 on utilise la fonction SetWindowRgn. On calcul la région du bitmap de fond et on restreint la fenêtre à cette région. Par contre, avec SetWindowRgn, on ne gère pas les transparences partielles.

Benoît
Rejoignez-nous