Bonjour j'aimerais savoir comment faire pour ajouter par exemple des barre
Progress Bar ou autre dans des controle -> List View, Statu Bar
etc...
Bonjour j'aimerais savoir comment faire pour ajouter par exemple des barre
Progress Bar ou autre dans des controle -> List View, Statu Bar
etc...
Ben, normalement, un simple CreateWindow() avec l'autre contrôle en parent suffit.
Le problème, c'est que tu ne pourras pas recevoir les notifications (WM_COMMAND et WM_NOTIFY), puisque c'est l'autre contrôle qui les recevra...
Sinon, tu peux juste créer le contrôle "par-dessus" l'autre (histoires de Z-order etc.), mais tu devras peut-être spécifier le style WS_CLIPSIBLINGS dans la fenêtre parent...
Aie d'accord. oui si je ne peux pas recevoir les messages c'est énervant . Il n'y as pas d'autre moyen ?
Tu peux toujours créer un contrôle perso qui forwarde les messages vers une fenêtre de ton choix, puis créer une progressbar dans ce contrôle et créer le tout dans la statusbar...
De toute façon, il me semble qu'une statusbar ne renvoit rien au parent.
C'est plus gênant si tu veux un bouton, par exemple...
aie je débute, je n'ai pas tout compris. tu n'aurais pas un petit exemple pour me montrer ceci ?
Je n'ai rien sous la main, désolé...
Je viens de faire un code assez rapidement :
C'est comme ca que tu voulais dire
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 #include <windows.h> LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK BarreProcedure (HWND, UINT, WPARAM, LPARAM); char szClassName[ ] = "MainWindowsApp"; char szClassNameBarre[ ] = "barre"; HINSTANCE hThisInstance = 0 ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { hThisInstance = hInstance; HWND hwnd; HWND hwnd2; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof (WNDCLASSEX); wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if (!RegisterClassEx (&wincl)) return 0; wincl.lpszClassName = szClassNameBarre; wincl.lpfnWndProc = BarreProcedure; if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx(NULL, szClassName, "fenetre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hThisInstance, NULL ); hwnd2 = CreateWindowEx(NULL, szClassNameBarre, "fenetre", WS_OVERLAPPEDWINDOW | WS_CHILD , 30, 30, 100, 100, hwnd, NULL, hThisInstance, NULL ); if( hwnd2 == NULL ) return 0 ; ShowWindow (hwnd, nFunsterStil); ShowWindow (hwnd2, nFunsterStil); while (GetMessage (&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; } LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } LRESULT CALLBACK BarreProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: MessageBox(hwnd,"","",MB_OK); CreateWindow("BUTTON", "Action", WS_CHILD | WS_VISIBLE, 100,100, 100,100, hwnd, NULL, hThisInstance, NULL); break; case WM_COMMAND: break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
(attention, WS_OVERLAPPED et WS_CHILD ne peuvent être utilisés en même temps).
Non, plutôt à un truc de ce genre:
Naturellement, ce pseudocode ne risque pas de compiler. Mais c'est l'idée générale.
Code pseudocode : 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 WinMain() { RegisterClassEx(FenetrePrincipale) RegisterClassEx(HoteDeControle) CreateWindow(FenetrePrincipale, WS_OVERLAPPEDWINDOW) BoucleDeMessages() } ProcFenetrePrincipale() { case WM_CREATE: CreateWindow(StatusBar, WS_CHILD, hWnd) CreateWindow(HoteDeControle, WS_CHILD, StatusBar, lpParam=hWnd) CreateWindow(Button, WS_CHILD, HoteDeControle) break; case WM_COMMAND: case Button: MessageBox(hWnd, "Coucou!", "!", MB_OK); break; } ProcHoteDeControle() { case WM_CREATE: { LPCREATESTRUCT pCs = lParam; SetWindowLongPtr(hWnd, GWLP_USERDATA, pCs->lpCreateParams); } break; case WM_COMMAND: { HWND hFenetrePrincipale = GetWindowLongPtr(hWnd, GWLP_USERDATA); if(hFenetrePrincipale != NULL) SendMessage(hFenetrePrincipale, WM_COMMAND, wParam, lParam); } break; //Et la même chose pour WM_NOTIFY }
De plus, au lieu de GWLP_USERDATA, tu peux utiliser directement des valeurs dans wincl.cbWndExtra, puisque tu définis toi-même la classe...
D'accord merci. je viens de tester en faisant de que tu m'as dit :
fenetre -> dedant une statue barre -> dans la statue une ' fenetre perso '
mais elle n'apparait pas...
Je ne sais pas me servir de :
cbClsExtra
cbWndExtra
A quoi servent-ils en faites...
je les met à 0 tout le temps
cbWndExtra sert avec SetWindowLong()/GetWindowLong().
Mais si tu utilises GWLP_USERDATA, tu n'en as pas besoin.
PS: Idéalement, la fenêtre perso contient juste le contrôle que tu veux afficher, et elle est visible, sans barre de titre ni contour, et de la même taille.
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