Salut tout le monde !
Je croi que tout est dans le titre !
Merci d'avance !?
Salut tout le monde !
Je croi que tout est dans le titre !
Merci d'avance !?
Bonjour,
On dirai bienEnvoyé par Tenguryu
Les source d'emule ne sont t'elle pas dispo .... c'est peut etre dedans ??
lanonyme
Je me permets de faire remonter ce sujet, car j'ai peut être un début de solution :
.dans le .h:
.dans le .cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void __fastcall DessinBouton(int State); void __fastcall OnNCLBUTTONDOWN(TMessage& msg); void __fastcall OnNCLBUTTONUP(TMessage& msg); void __fastcall OnNCMOUSEMOVE(TMessage& msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_NCLBUTTONDOWN,TMessage,OnNCLBUTTONDOWN) MESSAGE_HANDLER(WM_NCLBUTTONUP,TMessage,OnNCLBUTTONUP) MESSAGE_HANDLER(WM_NCMOUSEMOVE,TMessage,OnNCMOUSEMOVE) END_MESSAGE_MAP(TForm)
Pour le dessin du bouton, avec deux états possibles (enfoncé, relaché):
La gestion des messages:
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 void __fastcall TForm7::DessinBouton(int State) { HDC hdc; HWND whdc; whdc = this->Handle; // tagRECT *arect = new tagRECT; tagRECT pRect; //positionnement du bouton tagRECT topRect; //positionnement de la barre haut tagRECT bottomRect; //positionnement de la barre bas //On alimente le pointeur 'arect' avec les coordonnées de toute la fenêtre //c'est a dire la zone client classique - accessible par la Canvas d'une TForm par ex - //mais aussi toutes les parties 'externes' telles que la barre de titre : GetWindowRect(whdc, arect); // On détermine les coordonnées auxquelles on veut dessiner le //bouton : pRect.left = arect->left + 963; pRect.top = arect->top + 10; pRect.right = arect->left + 980; pRect.bottom = arect->top + 24; //Pour les 'décorations'...du bouton //coordonées pour la barre du haut topRect.left = arect->left + 965; topRect.top = arect->top + 12; topRect.right = arect->left + 976; topRect.bottom = arect->top + 15; //coordonnées pour la barre du bas bottomRect.left = arect->left + 965; bottomRect.top = arect->top + 19; bottomRect.right = arect->left + 976; bottomRect.bottom = arect->top + 22; //GetWindowDC permet de récuperer une 'zone de travail complète' //(incluant donc la TitleBar, les Menus et Scroll-bars) //sur laquelle nous pourrons effectivement dessiner //nos éléments : hdc = GetWindowDC(whdc); // switch (State) { case 0: DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_BUTTONPUSH); break; case 1: DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_PUSHED | DFCS_ADJUSTRECT); break; } DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_RECT); DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_RECT); // ReleaseDC(hdc, whdc); delete arect; }
Pour finir quelques appels :
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 void __fastcall TForm7::OnNCLBUTTONDOWN(TMessage& msg) { tagPOINTS *points = new tagPOINTS; points->x = msg.LParamLo; points->y = msg.LParamHi; if ( (points->x > 955 && points->x < 970) && (points->y > 1 && points->y < 12) ) { DessinBouton(1); } else { DessinBouton(0); this->DefaultHandler(&msg); } delete points; } //--------------------------------------------------------------------------- void __fastcall TForm7::OnNCLBUTTONUP(TMessage& msg) { tagPOINTS *points = new tagPOINTS; points->x = msg.LParamLo; points->y = msg.LParamHi; if ( (points->x > 955 && points->x < 970) && (points->y > 1 && points->y < 12) ) { DessinBouton(0); } else { this->DefaultHandler(&msg); } delete points; } //--------------------------------------------------------------------------- void __fastcall TForm7::OnNCMOUSEMOVE(TMessage& msg) { tagPOINTS *points = new tagPOINTS; points->x = msg.LParamLo; points->y = msg.LParamHi; if ( (points->x < 955 || points->x > 970) || (points->y < 1 || points->y > 12) ) { DessinBouton(0); } this->DefaultHandler(&msg); delete points; } //---------------------------------------------------------------------------
NB : le fait que le bouton soit redessiné dans OnNCMOUSEMOVE est assez (voir tres) important puisque si le click sur ce bouton provoque un appel a un ShowMessage(...) ou MessageDlg, ou une autre Form modale du même genre,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void __fastcall TForm7::FormPaint(TObject *Sender) { DessinBouton(0); } //--------------------------------------------------------------------------- void __fastcall TForm7::FormResize(TObject *Sender) { DessinBouton(0); } //---------------------------------------------------------------------------
au retour sur la Form je perdais ce bouton.
En effet, on ne repasse pas par le OnPaint de la Form, ni un autre évènement facilement accessible.
Avec le MouseMove, le bouton sera redessiné...
Je continuerais a chercher pour le coup du 'points' et des valeurs lors du test du positionnement de la souris, qui n'est pas tres beau.
En attendant vos remarques, et suggestions...
@ +
Pour regler le problème du test du positionnement de la souris sur le bouton (ou non), je propose ceci :
.dans le .h, ajout de ceci :
.dans le .cpp, dans la fonction DessinBouton(...), apres la déclaration concernant le tagRect pour le dessin du bouton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 tagRECT StockRect;
et donc les gestion des messages seraient ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // On détermine les coordonnées auxquelles on veut dessiner le //bouton : pRect.left = arect->left + 963; pRect.top = arect->top + 10; pRect.right = arect->left + 980; pRect.bottom = arect->top + 24; ---> //Stock des coordoonnées du Rect représentant le bouton... StockRect.left = pRect.left; StockRect.top = pRect.top; StockRect.right = pRect.right; StockRect.bottom = pRect.bottom;
Voili, voilou...
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 void __fastcall TForm7::OnNCLBUTTONDOWN(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; if (PtInRect(&StockRect, point)) { DessinBouton(1); } else { DessinBouton(0); this->DefaultHandler(&msg); } } //--------------------------------------------------------------------------- void __fastcall TForm7::OnNCLBUTTONUP(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; if (PtInRect(&StockRect, point)) { DessinBouton(0); } else { this->DefaultHandler(&msg); } } //--------------------------------------------------------------------------- void __fastcall TForm7::OnNCMOUSEMOVE(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; if (!PtInRect(&StockRect, point)) { DessinBouton(0); } this->DefaultHandler(&msg); } //---------------------------------------------------------------------------
Voici quelques modifications, qui permettent que le bouton suive bien lorsque la fenêtre est redimensionnée.
Mais surtout, lors du click() sur le bouton, la position de la souris semble effectivement bien repérée quelle que soit la position du bouton.
Il me reste a travailler pour les TForms 'spéciales', pour celles ayant comme valeur a BorderStyle autre chose que bsSizeable.
.dans le .h:
.dans le .cpp:
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 private: // Déclarations de l'utilisateur int State; int nbButtons; int nbEspace; tagRECT StockRect; void __fastcall DessinBouton(int AState); void __fastcall CalculTailleCB(HWND aH, tagRECT *pRect); void __fastcall OnNCLBUTTONDOWN(TMessage& msg); void __fastcall OnNCLBUTTONUP(TMessage& msg); void __fastcall OnNCMOUSEMOVE(TMessage& msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_NCLBUTTONDOWN,TMessage,OnNCLBUTTONDOWN) MESSAGE_HANDLER(WM_NCLBUTTONUP,TMessage,OnNCLBUTTONUP) MESSAGE_HANDLER(WM_NCMOUSEMOVE,TMessage,OnNCMOUSEMOVE) END_MESSAGE_MAP(TForm)
Ce qui serait sympa, éventuellement, c'est que quelqu'un teste et vois si il y a quelquechose qui flanche, autre que le point que j'ai cité.
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 void __fastcall TfrmSkin::DessinBouton(int AState) { State = AState; HDC hdc; HWND whdc; whdc = this->Handle; // tagRECT *arect = new tagRECT; // tagRECT pRect; //positionnement bouton // On détermine les coordonnées auxquelles on veut dessiner le //bouton : CalculTailleCB(whdc, &pRect); tagRECT topRect; //positionnement de la barre haut tagRECT bottomRect; //positionnement de la barre bas //On alimente le pointeur 'arect' avec les coordonnées de toute la fenêtre //c'est a dire la zone client classique - accessible par la Canvas d'une TForm par ex - //mais aussi toutes les parties 'externes' telles que la barre de titre : GetWindowRect(whdc, arect); //Stock des coordoonnées du Rect représentant le bouton... StockRect.left = pRect.left - 2; StockRect.top = pRect.top; StockRect.right = pRect.right - 2; StockRect.bottom = pRect.bottom; //Pour les 'décorations'...du bouton //coordonées pour la barre du haut topRect.left = pRect.left + 2; topRect.top = pRect.top + 1; topRect.right = pRect.left + 14; topRect.bottom = pRect.top + 5; //coordonnées pour la barre du bas bottomRect.left = pRect.left + 2; bottomRect.top = pRect.top + 8; bottomRect.right = pRect.left + 14; bottomRect.bottom = pRect.top + 12; //GetWindowDC permet de récuperer une 'zone de travail complète' //(incluant donc la TitleBar, les Menus et Scroll-bars) //sur laquelle nous pourrons effectivement dessiner //nos éléments : hdc = GetWindowDC(whdc); // switch (State) { case 0: DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_BUTTONPUSH); break; case 1: DrawFrameControl(hdc, &pRect, DFC_BUTTON, DFCS_PUSHED | DFCS_ADJUSTRECT); break; } DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_TOPLEFT); DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_TOPLEFT); // ReleaseDC(hdc, whdc); delete arect; } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect) { int PosLeft; GetWindowRect(aH, pRect); int WBordure = pRect->right - pRect->left; int WBoutonType = GetSystemMetrics(SM_CXSIZE); int HBoutonType = GetSystemMetrics(SM_CYSIZE); int PosTop = 6; // if (!BorderIcons.Contains(biSystemMenu)) { PosLeft = WBordure - WBoutonType - 6; } else { nbButtons = 2; nbEspace = 2; if (BorderIcons.Contains(biHelp)){ nbButtons ++; } if (BorderIcons.Contains(biMaximize)){ nbButtons ++; }else { nbEspace = 4; } if (BorderIcons.Contains(biMinimize)){ nbButtons ++; }else { nbEspace = 4; } PosLeft = WBordure - (nbButtons * WBoutonType)- nbEspace; } pRect->left = PosLeft; pRect->right = PosLeft + WBoutonType; pRect->top = PosTop; pRect->bottom = PosTop + HBoutonType - 4; // } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::FormPaint(TObject *Sender) { DessinBouton(0); } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::FormResize(TObject *Sender) { DessinBouton(0); } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::OnNCLBUTTONDOWN(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; tagPOINT apoint = ScreenToClient(point); point.x = apoint.x; if (point.x > StockRect.left && point.x < StockRect.right) { DessinBouton(1); } else { DessinBouton(0); DefaultHandler(&msg); } } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::OnNCLBUTTONUP(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; tagPOINT apoint = ScreenToClient(point); point.x = apoint.x; if (point.x > StockRect.left && point.x < StockRect.right) { DessinBouton(0); } else { DefaultHandler(&msg); } } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::OnNCMOUSEMOVE(TMessage& msg) { tagPOINT point; point.x = msg.LParamLo; point.y = msg.LParamHi; tagPOINT apoint = ScreenToClient(point); point.x = apoint.x; if ( (point.x < StockRect.left || point.x > StockRect.right) ) { DessinBouton(0); } DefaultHandler(&msg); } //--------------------------------------------------------------------------- void __fastcall TfrmSkin::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { DessinBouton(0); } //---------------------------------------------------------------------------
Il reste aussi le dessin dans le bouton a améliorer...
@+![]()
pas mal ca m"interesse aussi !!![]()
dés que j'ai un peu de temps, je test ca...
++
Une petite modif, sur le positionnement du bouton en fonction de la propriété BorderStyle :
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 void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect) { int PosLeft, PosTop, WBoutonType, HBoutonType; GetWindowRect(aH, pRect); int WBordure = pRect->right - pRect->left; if (this->BorderStyle == bsToolWindow) { WBoutonType = GetSystemMetrics(SM_CXSMSIZE); HBoutonType = GetSystemMetrics(SM_CYSMSIZE); } if (this->BorderStyle == bsSizeToolWin) { WBoutonType = GetSystemMetrics(SM_CXSMSIZE); HBoutonType = GetSystemMetrics(SM_CYSMSIZE); } if (this->BorderStyle == bsSingle || this->BorderStyle == bsSizeable || this->BorderStyle == bsDialog) { WBoutonType = GetSystemMetrics(SM_CXSIZE); HBoutonType = GetSystemMetrics(SM_CYSIZE); } if (this->BorderStyle == bsToolWindow) { PosTop = 5; } if (this->BorderStyle == bsSizeToolWin) { PosTop = 6; } if (this->BorderStyle == bsSingle || this->BorderStyle == bsDialog) { PosTop = 5; } if (this->BorderStyle == bsSizeable) { PosTop = 6; } // if (!BorderIcons.Contains(biSystemMenu)) { PosLeft = WBordure - WBoutonType - 6; } else { nbButtons = 2; nbEspace = 2; if (this->BorderStyle == bsDialog) { PosLeft = WBordure - (nbButtons * WBoutonType)- 4; } if (this->BorderStyle == bsToolWindow) { PosLeft = WBordure - (nbButtons * WBoutonType)- 5; } if (this->BorderStyle == bsSizeToolWin) { PosLeft = WBordure - (nbButtons * WBoutonType)- 6; } if (this->BorderStyle == bsSizeable || this->BorderStyle == bsSingle) { if (BorderIcons.Contains(biHelp)){ nbButtons ++; } if (BorderIcons.Contains(biMaximize)){ nbButtons ++; }else { nbEspace = 4; } if (BorderIcons.Contains(biMinimize)){ nbButtons ++; }else { nbEspace = 4; } PosLeft = WBordure - (nbButtons * WBoutonType)- nbEspace; } } pRect->left = PosLeft; pRect->right = PosLeft + WBoutonType; pRect->top = PosTop; pRect->bottom = PosTop + HBoutonType - 4; // }
Bon, j'ai fait quelques tests pour ce qui est du 'dessin' dans le bouton....
Je pense qu'il est envisageable de garder les méthodes avec DrawEdge(...), afin d'obtenir des structures d'effet 3D grisées et de complémenter avec par exemple :
.dans le .h, ajout de:
et dans le .cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void __fastcall DessinDeco(HWND aH, tagRECT *pRect);
puis, on remplace un des deux appels a DrawEdge(...) par cette fonction en lui fournissant les coordonnées a remplir par la surface représentée par une des deux structures de type tagRect, pour cette exemple : bottomRect.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void __fastcall TfrmSkin::DessinDeco(HDC aHDC, tagRECT *pRect) { for (int i = pRect->top + 1; i < pRect->bottom - 1; i ++) { MoveToEx(aHDC, pRect->left + 5, i, NULL); LineTo(aHDC, pRect->right, i); } }
Après ...hé bien c'est au choix et en fonction des besoins pour travailler avec MoveToEx et LineTo afin de faire ce que l'on a besoin d'afficher...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 DrawEdge(hdc, &topRect, BDR_SUNKENINNER, BF_TOPLEFT); //DrawEdge(hdc, &bottomRect, BDR_SUNKENINNER, BF_TOPLEFT); -> //on remplace par : DessinDeco(hdc, &bottomRect);
(bon, on peut dire que je me les casses pas trop la, mais je suis déja assez content d'être arrivé ici...)
Important :
Il faut remplacer dans la fonction :
la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 void __fastcall TfrmSkin::CalculTailleCB(HWND aH, tagRECT *pRect)
par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (BorderIcons.Contains(biHelp)){ nbButtons ++; }
Voili, voilou...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (BorderIcons.Contains(biHelp) && (!BorderIcons.Contains(biMaximize)&&!BorderIcons.Contains(biMinimize)) ){ nbButtons ++; }
En espérant que cela plaise...![]()
@ +
//EDIT :
You know what ?....I'm happy....lol
Testé !![]()
Alors Bravo ca marche impec il faudra juste améliorer le design pas la suite mais c'est super !
++
Envoyé par virtuA
Merci...c'est cool.
Il faut effectivement - je pense - jongler entre DrawEdge et le code dans 'DessinDeco(...)' afin d'obtenir ce qu'on veut comme dessin sur le bouton.
A moins que quelqu'un n'ait la 'vrai' solution ? ....![]()
@ +
Partager