Bonjour,
Prenant une petite pause conçernant mon gros projet de lecteur mp3 (un bug graphique impossible à résoudre conçernant le visualiseur), j'ai décidé de faire un petit programme de gestion de la BDR. Seulement, je ne sais pas pourquoi (je deviens dingue), les positions des contrôles sont par rapport au bureau ! 8O
Je m'explique : le bouton que j'ai créé s'affiche bien dans la fenêtre (j'ai mis pas mal de temps à le voir) mais le fait que sa position soit aléatoire m'a mis la puce à l'oreille... en fait, vu que la position de la fenêtre parent (et principale) est en CW_USEDEFAULT, et donc aléatoire (enfin qui change pour la cascade quoi....), elle permettait d'apercevoir de temps à autre le bouton qui lui, est fixé à la position par rapport au bureau.
C'est assez difficile à expliquer, comme si le bouton était "accroché" à une position définie sur le bureau (mais non visible puisque la fenêtre n'était pas dessus), et que l'on le voyait seulement s'il rentrait dans la zone active de la fenêtre...
Conclusion : le bouton est créé et bien affiché dans la fenêtre (on peut le voir en agrandissant la fenêtre), mais aux positions normalement prévues pour le bureau. Le système métrique change alors. Vraiment bizarre...
Quelqu'un peut m'aider ?
Voici le code (sans MFC, j'ai quand même voulu utiliser des classes pour les onglets, sinon c'était "le bordel") :
main.cpp:
Interface.h:Code:
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
112
113
114
115 #include <windows.h> #include <commctrl.h> #include "constants.h" #include "Interface.h" HINSTANCE hInst; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; MSG messages; WNDCLASSEX wincl; hInst = hThisInstance; wincl.hInstance = hThisInstance; wincl.lpszClassName = NAME; 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)(1 + COLOR_BTNFACE); if (!RegisterClassEx (&wincl)) return 0; hwnd = CreateWindowEx ( 0, NAME, NAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 542, 373, HWND_DESKTOP, NULL, hThisInstance, NULL ); ShowWindow (hwnd, 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) { static HWND hTabs = NULL; static IconsTab iconsTab(hwnd); switch (message) { case WM_CREATE: TC_ITEM tci; InitCommonControls(); hTabs = CreateWindowEx(0 , WC_TABCONTROL, "", WS_CHILD | WS_VISIBLE, 0, 0, 536, 341, hwnd, NULL, hInst, NULL); tci.mask = TCIF_TEXT; tci.pszText = #ifdef ENGLISH "Startup" #elif defined FRENCH "Démarrage" #endif ; TabCtrl_InsertItem(hTabs, 1, &tci); tci.pszText = #ifdef ENGLISH "Icons" #elif defined FRENCH "Icônes" #endif ; TabCtrl_InsertItem(hTabs, 2, &tci); tci.pszText = "Associations"; TabCtrl_InsertItem(hTabs, 3, &tci); iconsTab.show(true); return 0; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
Interface.cpp:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef INTERFACE_H #define INTERFACE_H #include <windows.h> #include "constants.h" class IconsTab { public: IconsTab(HWND); void show(bool); private: HWND _etchedFrames[3]; HWND _icon; HWND _path; HWND _extension; HWND _buttons[2]; HWND _parentWindow; }; #endif
Sans bien sûr parler du manifest.h et resource.rc permettant l'affichage "windows XP style".Code:
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 #include "Interface.h" extern HINSTANCE hInst; IconsTab::IconsTab(HWND parent) : _parentWindow(parent) { _buttons[0] = CreateWindow("BUTTON", #ifdef ENGLISH "Apply" #elif defined FRENCH "Appliquer" #endif , BS_PUSHBUTTON | WS_CHILD, 620, 300, #ifdef ENGLISH 70 #elif defined FRENCH 14*8 #endif , 30, _parentWindow, (HMENU)NULL, hInst, NULL); } void IconsTab::show(bool state) { ShowWindow(_buttons[0], (state==true)?SW_SHOW:SW_HIDE); return; }
Merci d'avance.
P.S : Je précise que le contrôle Tab s'affiche correctement aux coordonnées voulues (c'est à dire (0;0)). Cela vient t il de la gestion de la classe ? Soyez indulgent, je suis fatigué et étourdi en ce moment ;)
[edit] Je confirme, il s'agit de l'implémentation en classes... sans, tout marche. Je ne peux tout de même pas me passer de ceci ! Pourquoi ???