Bonjour,
J'aimerai pouvoir changer par exemple la couleur de fond d'une fenetre, ou d'un bouton crééer par la fonction
createwindow("buton",.....
Enfin personalisé l'affichage de la fenetre et de ses éléments.
Et ce sans MFC.
Merci.
Bonjour,
J'aimerai pouvoir changer par exemple la couleur de fond d'une fenetre, ou d'un bouton crééer par la fonction
createwindow("buton",.....
Enfin personalisé l'affichage de la fenetre et de ses éléments.
Et ce sans MFC.
Merci.
Il faut sous-classer la fenetre (si c'est un bouton par exemple), et faire son propre traitement dans le WM_PAINT
Voila j'ai essayéEnvoyé par nico-pyright(c)
Donc j'aimerai que mon groupBox2 ai par exemple un fond noir.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 //La classe que je déclare avec un fond noir WNDCLASS BoxGroup2; BoxGroup2.lpszClassName = "button"; BoxGroup2.hbrBackground = (HBRUSH) GetStockObject BLACK_BRUSH); //on enregistre celle-ci RegisterClass(&BoxGroup2);//on enregistre cette classe //Ici un GroupBox qui est creer ds ma fenetre principale(hFenetre) hWndButtonGRP2 = CreateWindow("button", "Choise", WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 450,295,150,70,hFenetre,0,((LPCREATESTRUCT)lParam)->hInstance ,NULL);
La couleur de fond ne change pas.
J'ai implémenté ce code ds WM_CREATE.
alors, en fait, je ne pensais pas à ca
Ce que je te proposais, c'était d'affecter une windowProc à ton bouton : à sa création :puis de rédéfinir le paint dans ta nouvelle callback
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 but = CreateWindowEx(0, "BUTTON", "Appuyer ici", WS_VISIBLE|WS_CHILD| WS_BORDER, 20, 100, 200, 40, hwnd, (HMENU)ID_BUTTON, ghInstance, NULL); ancienneButProc = (WNDPROC) SetWindowLong(but,GWL_WNDPROC,(long)butProc);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 WNDPROC ancienneButProc; BOOL CALLBACK butProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch(mssg) { case WM_PAINT: hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); SelectObject(hdc, GetStockObject(BLACK_BRUSH)); Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); EndPaint (hwnd, &ps); return 0; } return CallWindowProc(ancienneButProc, hwnd, mssg, wParam, lParam); }
Merci beaucoup "nico-pyright(c)" , super cool ca fontionne.
Juste encore une question je veux personaliser ma couleurEnvoyé par nico-pyright(c)
pour ce faire j'utiliser ses lignes:
Lors de la compilation:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Déclarations ajoutées aux existante: #include <Wingdi.h> //pour le GDI #pragma comment( lib, "Gdi32.lib" ) ..... ::SelectObject(hdc,GetStockObject(DC_BRUSH)); ::SetDCBrushColor(hdc,RGB(00,0xff,00));
error C2065: 'DC_BRUSH' : undeclared identifier
error C2039: 'SetDCBrushColor' : is not a member of '`global namespace''
error C2065: 'SetDCBrushColor' : undeclared identifier
pourtant la fonction est disponnible quand je fait les "::" je la voi.
De plus je suis sur windows XP donc je suis authorisé à l'utilisé d'apres MSDN.
normalement, tu n'as pas besoin de l'opérateur de résolution de portée ::
et comme tu peux le constatersi ton _WIN32_WINNT est supérieur à 5 (donc pour 2000 et plus), ca devrait marcher ; vérifie bien que c'est le casEnvoyé par wingdi.h
Il n'est pas nécessaire d'appeler GetStockObject mais on peut affecter directement à BLACK_BRUSH ( faut que je fasse l'essai ).BoxGroup2.hbrBackground = (HBRUSH) GetStockObject
BLACK_BRUSH);
Est-ce que BoxGroup2.hbrBackground est bien affecté ?? ( F9 déboguage ? )
Merci mais j'essai la méthode de nico qui ne passe plus par la classe de la fenetre, dailleur je ne sais pas si c'est facilement implémentable pour des boutons,... vu que ca ne fonctionnai pas.Envoyé par mat.M
Celle ci peu etre util si par exemple on veu changer aussi le curseur de la souri lorsque l'on passe sur un éléments bouton,...
Mais je n'ai pas reussi a implémenter une WNDCLASS à un bouton ou GRPBOX.
Ok j'utilisai l'opérateur de résolution de portée pour voir si la fonction était bien disponnible.Envoyé par nico-pyright(c)
Je l'ai enlevé et j'ai toujours l'erreur comme quoi SetDCBrushColor est pas déclaré.
J'ai mis ton code au debut dans les déclarations et dans ma fonction aussi mais je pense qu'elle se met en déclaration.
J'ai aussi essayer sans le if là j'ai comme erreur:
error LNK2001: unresolved external symbol "__declspec(dllimport) unsigned long __stdcall SetDCBrushColor(struct HDC__ *,unsigned long)" (__imp_?SetDCBrushColor@@YGKPAUHDC__@@K@Z)
Debug/prog.exe: fatal error LNK1120: 1 unresolved externals
Et toujours DC_BRUSH non déclaré.
Merci beaucoup pour votre aide
La technique de personnalisation du dessin des controles standards c'est le owner drawing. Crée ton bouton avec le style BS_OWNERDRAW et gère l'évènement WM_DRAWITEM.
http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/buttons/usingbuttons.asp
J'ai un peu chercher donc si j'ai bien compris j'ajoute dans la creation de mon bouton unEnvoyé par Aurelien.Regat-Barrel
Et dans ma boucle de gestion des évenements :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //Global ... HBITMAP hbm1; ... GroupBoxA = createwindow("buton",...,...|BS_OWNERDRAW|...,...); ...
Je n'ai aucunes erreur à la compilation mais que ce soit un groupbox, un bouton, ou radiobox la couleur ne change pas elle ne prend pas celle que 'jai dans le bitmap (que j'ai paint de couleur unie pour le test).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 WinProc(...) { //Local ... HDC hdcMem; LPDRAWITEMSTRUCT lpdis; ... ... Switch(param): ... case WM_CREATE: ... case WM_PAINT: ... case WM_INITDIALOG: // hinst, hbm1 and hbm2 are defined globally. hbm1 = LoadBitmap((HANDLE) hinst, "c:\monimage.bmp"); Return true; case WM_DRAWITEM: lpdis = (LPDRAWITEMSTRUCT) lParam; hdcMem = CreateCompatibleDC(lpdis->hDC); SelectObject(hdcMem, hbm1); // Destination StretchBlt( lpdis->hDC, // destination DC lpdis->rcItem.left, // x upper left lpdis->rcItem.top, // y upper left // The next two lines specify the width and // height. lpdis->rcItem.right - lpdis->rcItem.left, lpdis->rcItem.bottom - lpdis->rcItem.top, hdcMem, // source device context 0, 0, // x and y upper left 32, // source bitmap width 32, // source bitmap height SRCCOPY); // raster operation DeleteDC(hdcMem); return TRUE;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager