bonsoir
J'ai cree une fenetre sans barre de titre qui s'affiche en haut de l'ecran la Form est initialisee a " fsStayOnTop ", mais j'aimerais que les autres fenetres s'affichent et s'ajustent sous ma Form, je cherche une piste
Version imprimable
bonsoir
J'ai cree une fenetre sans barre de titre qui s'affiche en haut de l'ecran la Form est initialisee a " fsStayOnTop ", mais j'aimerais que les autres fenetres s'affichent et s'ajustent sous ma Form, je cherche une piste
Salut !
Dans ce sens là (?) :Citation:
s'affichent et s'ajustent sous ma Form
Code:
1
2
3
4
5
6
7
8
9
10
11
12 __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { SetBounds(0,0,Screen->Width, 100); } //-- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { Form2->Show(); }
Pour interdire le déplacement de Form2 il suffirait d'intercepter et de gérer l'événement WM_WOVING.Code:
1
2
3
4
5 void __fastcall TForm2::FormShow(TObject *Sender) { SetBounds(0,Form1->Height, Width, Height); }
(toujours sur BCB3 Pro donc ...)
A plus !
Salut !
Sinon, en interprétant le problème autrement :
Pour gérer le positionnement des autres forms par rapport à cette form, l'interception de WM_MOVING reste d'actualité !Code:
1
2
3
4
5
6
7
8 void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { Form2->Show(); // peu importe Form3->Show(); // peu importe à ce stade Application->NormalizeAllTopMosts(); // << y compris Form1 Form3->FormStyle = fsStayOnTop; // << Replace et demeure au premier plan }
A plus !
Merci pour tes reponses henderson
Je me suis tres mal explique la fenetre que je cree va me servir de Zoom et se place en haut de l'ecran elle est redimensionnable, ce que je cherche, c'est que les fenetres presente se redimensionnes dans l'espace restant sur l'ecran de meme pour celles qui vont se charger la fenetre de Zoom deja presente, je regarde du cote des API Window je pense que c'est ce qu'il faut utiliser mais je ne vois pas lequelles
En faisant des testes je me retrouve devant un probleme si je fais ceci pour obtenir le Handle du bureau j'ai cette valeur " 00010014 "
Si je fais ceci pour obtenir le Handle pointe par le curseur en faisant ce qui suit j'ai cette valeur " 00010088 ", j'avais pris la precotion de deplacer les fenetre pour verifier que cela pointe sur le bureauCode:
1
2 HWND hwndBureau = GetDesktopWindow();
Pourquoi deux valeurs differentes, comment obtenir le Handle du bureau que l'on voitCode:
1
2
3
4
5
6
7
8 // on positionne le curseur sur la barre de titre // a 10 du bord gauche et 10 du bord haut TPoint Pt; Pt.x = 10; Pt.y = 10; // on recupere le Handle de la fenetre affichee HWND hwndAppli = WindowFromPoint(Pt); // on recupere le Handle du composant sous le curseur
Salut !
DeskTop ... ???
En supposant que cette fenêtre Zoom ne concerne que ton application, le plus simple serait quand même que ton application gère ses propres fenêtres.
Ca peut se faire "facilement" en mettant les OnResize en guirlande :
Zoom étant maître du positionnement des autres fenêtres elle lancera donc la OnResize de la première fenêtre qui lancera la OnResize de la deuxième fenêtre ... la OnResize de la dernière fenêtre ne lancera aucune OnResize.
Cette daisy-chain doit respecter une condition : Zoom doit être la dernière fenêtre créée et il faudra donc inhiber l'action des OnResize avec un flag que Zoom validera lors de sa construction (pour éviter d'utiliser une fenêtre qui ne serait pas encore construite à cause de ce montage en daisy-chain).
Dès que la OnResize de cette Zoom sera solicitée (inévitablement après sa construction), toutes les fenêtres se positionneront les unes par rapport aux autres (et l'une après l'autre)... à faire donc dans chaque OnResize (donc pour chacune d'elle) avant de solliciter la OnResize de "sa" suivante dans la daisy-chain.
Je me limite ici à n'en décrire que le principe (comme j'ai testé ce principe avec mon BCB3 Pro ...) !
Si on travaille dans un contexte MDI ... c'est encore plus simple ... puisque la MDIForm est maître de son contenu (on peut développer pour faire beaucoup plus que Cascade et Tile ) !!!
A plus !
La seule et unique fenetre que je cree est la fenetre de Zoom, les autres fenetres seront par exemple celle de Word ou Excel ..., c'est pour cela que je teste si il y a une fenetre ou si c'est celle du bureau,
si c'est celle du bureau je ne redimensionne pas, si c'est Word ou Excel ..., je redimensionne la fenetre Word Excel ..., je n'ai besoin de redimensionner que la fenetre qui est sous celle de Zoom, je sais que cela est faisable j'ai un programme de traduction qui fonctionne comme cela.
D'ou mon probleme je dois recuperer le Handle du bureau " GetDesktopWindow(); " et " WindowFromPoint(Pt); " revoient deux Handle differents (voir mon post precedent)
Bonjour,
Tu as posé un problème sérieux.
Il ya une solution qui consiste à faire une boucle pour récupérer la liste des fenettres affichées, verifier une/une si elle est visible, et qu'elle ne soit pas celle du bureau.
Si la condition est verifiée, on la déplace soit par :
ou bien :Code:
1
2
3
4
5
6
7
8
9 MoveWindow( HWND hWnd, // handle of window int X, // horizontal position int Y, // vertical position int nWidth, // width int nHeight, // height BOOL bRepaint // repaint flag );
Code:MoveWindowOrg(HDC DC, int DX, int DY);
Pour avoir la liste des fenetre affichée, il ya un exemple livrer avec Builder,
sur un bouton tu ajoute :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 bool __stdcall EnumProc(HWND hWnd,/*LPARAM*/long/*lp*/) { unsigned long* pPid; //LPDWORD unsigned long result; //DWORD void *hg; //HGLOBAL unsigned long id; if(hWnd==NULL) return false; hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long)); pPid = (unsigned long *)GlobalLock(hg); result = GetWindowThreadProcessId(hWnd,pPid); if(result){ char title[110]; char className[95]; char totalStr[256]; GetClassName(hWnd,className,95); GetWindowText(hWnd,title,110); id=*pPid; ultoa(id,totalStr,10); strcat(totalStr,"\t"); if(title){ strcat(totalStr,title); strcat(totalStr,"\t"); } strcat(totalStr,className); FormMain->ListBox1->Items->Add((AnsiString)totalStr); } else{ GlobalUnlock(hg); GlobalFree(hg); return false; } GlobalUnlock(hg); GlobalFree(hg); return true; } //---------------------------------------------------------------------
Attention, ce prog donne la liste des processus en cours d'execution ;Code:
1
2
3
4
5 long lp=0; ListBox1->Enabled=true; ListBox1->Clear(); EnumWindows((WNDENUMPROC)EnumProc,lp);
Re, j'ai pas eu le temps de tester ce prog, mais je vais le faire dès mon retour, demain au plus tard.
Bonjour,
voici l'api pour modifier la position d'une fenêtre :
hWnd représente le handle de la fenêtre à deplacer, utiliseCode:
1
2
3
4 RECT *rct = new RECT() ;; GetWindowRect((void*)hWnd, rct) ; MoveWindow((void*)hWnd, 100,100, rct->right-rct->left, rct->bottom-rct->top, true);
pour avoir la liste des fenêtres affichées.Citation:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
Si tu as besoin un peu plus d'aide, j'ai developpé un programme fonctionnel pour ton sujet.
@+
Merci pour tes reponses kmaniche
J'ai trouve comment recupere le Handle du bureau
j'ai trouve la confirmation dans la FAQCode:
1
2
3
4
5
6 // on recupere le Handle de la fenetre du bureau par son nom HWND hwndBureau1 = FindWindow("Progman", "Program Manager"); HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL); hwndBureau3 = FindWindowEx(hwndBureau2, NULL, "SysListView32", "FolderView");
il me reste maintenant les testes
1 - le programme Zoom est le seul programme lance
2 - il y a deja d'autre fenetres d'ouvertes au lancement du programme Zoom
3 - une ou plusieurs fenetres sont ouvertes au dessus du programme Zoom
Il ya aussi plus simplement :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 The GetDesktopWindow function returns the handle of the Windows desktop window. The desktop window covers the entire screen. The desktop window is the area on top of which all icons and other windows are painted. HWND GetDesktopWindow(VOID) Parameters This function has no parameters. Return Values The return value is the handle of the desktop window.
Non " GetDesktopWindow " renvoi un Handle different de
J'ai verifie avec Spy++Code:
1
2
3
4
5
6 // on recupere le Handle de la fenetre du bureau par son nom HWND hwndBureau1 = FindWindow("Progman", "Program Manager"); HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL); hwndBureau3 = FindWindowEx(hwndBureau2, NULL, "SysListView32", "FolderView");
tu peux expliquer un peu le code ?
Quelle est alors la différence entre :
etCode:
1
2 Edit1 -> Text = (int)GetDesktopWindow() ;
Code:
1
2 Edit2 -> Text = (int)FindWindow("Progman", "Program Manager");
Ce que je crois avoir compris, quand tu fais " GetDesktopWindow " tu accede au support des applications qui tournent en tache de fond et le bureau en fait partie regarde avec un utilitaire type WinSight32 de BCB ou Spy++ de VC tu va comprendre en comparent les Handles renvoyes par " GetDesktopWindow " et " FindWindow("Progman", "Program Manager") "
Voici mon programme de zoom qui fonctionne quelque soit la resolution et qui est place en haut de l'ecran
Sur une Form, un PaintBox, un Panel, un Timer.
le .h
le .cppCode:
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TPaintBox *PaintBox1; TTimer *Timer1; TPanel *Panel1; void __fastcall FormCreate(TObject *Sender); void __fastcall PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Timer1Timer(TObject *Sender); void __fastcall Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); int Zoom; POINT MousePos; TPoint Pt; HWND hwndBureau3; HWND hwndAppli; HWND hwndZoom; bool flag; int X; int Y; int nWidth; int nHeight; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { // on recupere le Handle de la fenetre du bureau par son nom HWND hwndBureau1 = FindWindow("Progman", "Program Manager"); HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL); hwndBureau3 = FindWindowEx(hwndBureau2, NULL, "SysListView32", "FolderView"); // on positionne le curseur sur la barre de titre // a 10 du bord gauche et 10 du bord haut Pt.x = 10; Pt.y = 10; X = 0; Y = 50; nWidth = Screen->Width; nHeight = Screen->Height; // on recupere le Handle de la fenetre affichee sous le curseur hwndAppli = WindowFromPoint(Pt); // Si la fenetre au dessous est != du bureau on la redimensionne while(WindowFromPoint(Pt) != hwndBureau3) { hwndAppli = WindowFromPoint(Pt); MoveWindow( hwndAppli, // handle of window X, // horizontal position Y, // vertical position nWidth, // width nHeight, // height true // repaint flag ); } // on affiche la fenetre de Zoom sans barre de titre en haut de l'ecran Form1->BorderStyle = bsNone; Form1->FormStyle = fsStayOnTop; // mettre la Form toujours au premier plan Form1->Left = 0; Form1->Top = 0; Form1->Width = Screen->Width; Form1->Height = 50; // on dimensionne le PaintBox PaintBox1->Top = 5; PaintBox1->Left = 5; PaintBox1->Height = Form1->Height - 10; PaintBox1->Width = Form1->Width - 50; PaintBox1->Visible = true; // on positionne le TPanel Form1->Panel1->Top = 5; Form1->Panel1->Left = Form1->Width - 40; Form1->Panel1->Width = 37; Form1->Panel1->Height = 37; Zoom = 2; // valeur de l'agrandissement par default au demarrage Application->Title = "Loupe"; // Timer1 interval = 150 Timer1->Interval = 150; Timer1->Enabled = true; flag = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbRight) { // Femeture de la fenêtre sur un click droit sur le PaintBox. Close(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbRight) { // Femeture de la fenêtre sur un click droit sur la Form. Close(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { if(flag == true) { // on cree un Canvas pour peindre sur le TPanel TControlCanvas *pCn; pCn = new TControlCanvas(); pCn->Control = Form1->Panel1; pCn->Brush->Color = clRed; pCn->FillRect(Rect(2, 2, 35, 35)); pCn->Pen->Width = 5; pCn->Pen->Color = clWhite; pCn->MoveTo(10, 10); pCn->LineTo(27, 27); pCn->MoveTo(27, 10); pCn->LineTo(10, 27); delete pCn; flag = false; } // on positionne le curseur sur la barre de titre // a 10 du bord gauche et 51 du bord haut Pt.x = 10; Pt.y = 60; HDC DC; int x; int y; TRect Rect; // on recupere le Handle de la fenetre Zoom hwndZoom = WindowFromPoint(Pt); // on recupere les dimensions de la fenetre GetWindowRect(hwndZoom, &Rect); // si la position Top de la fenetre est inf a 50 on redimensionne la fenetre if(Rect.Top <= 50) { hwndAppli = WindowFromPoint(Pt); MoveWindow( hwndAppli, // handle of window X, // horizontal position Y, // vertical position nWidth, // width nHeight, // height true // repaint flag ); } // Création d'un contexte d'affichage non lié à une fenêtre // donc permet d'accéder à l'écran entier DC = CreateDC("DISPLAY", NULL, NULL, NULL); // With PaintBox1 Do Try x = Mouse->CursorPos.x; y = Mouse->CursorPos.y; // prise du point de référence de la souris // limitations de la zone pour ne pas sortir de l'écran if(x >= (Screen->Width - ClientWidth / Zoom)) { x = (Screen->Width - ClientWidth / Zoom) - 1; } if(y >= (Screen->Height - ClientHeight / Zoom)) { y = (Screen->Height - ClientHeight / Zoom) - 1; } // Copie d'une partie de l'écran dans la boite à peindre StretchBlt(PaintBox1->Canvas->Handle // Copie vers le canevas de la boite , 0 // vers X=0 , 0 // et Y=0 ,(ClientWidth * Zoom) - 1 // en multipliant par Zoom la largeur ,(ClientHeight * Zoom) - 1 // en multipliant par Zoom la hauteur ,DC // Copie à partir du canevas global ,x - 5 // de la position de la souris ,y - 10 // ... ,ClientWidth // sur la taille de la boite ,ClientHeight // ,SRCCOPY); // Simple copie sans autre effet. // ne pas ouvbier de libérer le contexte, c'est une ressource rare. DeleteDC (DC); } //--------------------------------------------------------------------------- void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Femeture de la fenêtre sur un click droit sur la Form. Close(); } //---------------------------------------------------------------------------
Bonjour,
le programme à l'air de se planter des fois, j'ai pus avoir une seule bonne execution, depuis que je l'es testé.
??
Salut kmaniche
Bien sur chez moi ca fonctionne :roll:
Alors les questions habituelles quelle version de Window, que fait le programme, en mode pas a pas ou se produit l'erreur ou le mauvais fonctionnement
Bonjour,
Pour les cacatéristiques du système :
WindowsXp SP2, 1Go DDR, Intel P4 3Ghz et VGA Intel 128 Mo Intégrée.
Les anomalies constatées :
1- La fiche ne se positionne pas au pt (0,0),
2- Les dimesions ne sont pas ceux initialisées par le programme (Screen -> Width, et Height = 50).
3- La fiche se positionne en pt(0,50) et Width = Screen -> Width ; et Height = Screen -> Height
4- Des fois, la fenêtre ne s'affiche pas !
5- Des fois, elle s'affiche mais sans l'aperçu (la partie zoomée).
Voilà, j'ai indiqué l'essentiel, reste à confirmer avec d'autres developpeurs !
> Est ce que qu'il a déjà essayé ce programme ??
Salut !
Je pense qu'on peut le faire (à peu de frais) avec :
Par exemple :Citation:
BOOL BringWindowToTop(
HWND hWnd // handle to window
);
Parameters
hWnd
Identifies the window to bring to the top of the Z order.
Pour le positionnement et les dimensions de la fenêtre ça depend donc du contexte.Code:
1
2
3
4
5
6 void __fastcall TForm1::Timer1Timer(TObject *Sender) { BringWindowToTop(Handle); }
A plus !
Merci pour ta reponse henderson
Dans le cas present ce n'est pas necessaire car toutes les fenetres sont redimensionnees et ma Form est posee sur le bureau, j'ai peut etre trouve l'erreur qui se produisait quand on lancait le programme et que la fenetre du bureau etait vide, j'en ai profite pour apporter des ameliorations les fenetres se redimensionnent correctement, j'ai pris en compte la barre de tache, et pour les resolutions de 680 x 800 à 1680 x 1050 on peut selectionner un programme par le Menu demarrer
le .h
le .cppCode:
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 //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TPaintBox *PaintBox1; TTimer *Timer1; TPanel *Panel1; void __fastcall FormCreate(TObject *Sender); void __fastcall PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Timer1Timer(TObject *Sender); void __fastcall Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); int Zoom; POINT MousePos; TPoint Pt; HWND hwndBureau3; HWND hwndAppli; HWND hwndZoom; bool flag; int fX; int fY; int fWidth; int fHeight; TRect RectTray; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
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
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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { RectTray; HWND hwndTray = FindWindow("Shell_TrayWnd", NULL); // on recupere les dimensions de la barre de tache GetWindowRect(hwndTray, &RectTray); // on recupere le Handle de la fenetre du bureau par son nom HWND hwndBureau1 = FindWindow("Progman", "Program Manager"); HWND hwndBureau2 = FindWindowEx(hwndBureau1, NULL, "SHELLDLL_DefView", NULL); hwndBureau3 = FindWindowEx(hwndBureau2, NULL, "SysListView32", "FolderView"); // on positionne le curseur sur la barre de titre // a 10 du bord gauche et 10 du bord haut Pt.x = 10; Pt.y = 10; // parametree des dimensions de la (des) fenetre(s) que l'on va redimensionner fX = 0; fY = 50; fWidth = Screen->Width; fHeight = Screen->Height - 85; // on recupere le Handle de la fenetre affichee sous le curseur hwndAppli = WindowFromPoint(Pt); // Si la (les) fenetre(s) au dessous est != du bureau // on la (les) redimensionne while(WindowFromPoint(Pt) != hwndBureau3) { hwndAppli = WindowFromPoint(Pt); MoveWindow ( hwndAppli, // handle of window fX, // horizontal position fY, // vertical position fWidth, // width RectTray.Top - 50, // height true // repaint flag ); } // on affiche la fenetre de Zoom sans barre de titre en haut de l'ecran Form1->BorderStyle = bsNone; Form1->FormStyle = fsStayOnTop; // mettre la Form toujours au premier plan Form1->Left = 0; Form1->Top = 0; Form1->Width = Screen->Width; Form1->Height = 50; Form1->Color = clSkyBlue; Form1->Caption = "LoupePremierPlanEnHaut"; // on dimensionne le PaintBox pour qu'il s'inscrit dans la Form // en laissant la place pour le Panel PaintBox1->Top = 5; PaintBox1->Left = 5; PaintBox1->Height = Form1->Height - 10; PaintBox1->Width = Form1->Width - 50; PaintBox1->Visible = true; // on positionne le TPanel sur la Form Form1->Panel1->Top = 5; Form1->Panel1->Left = Form1->Width - 40; Form1->Panel1->Width = 37; Form1->Panel1->Height = 37; Form1->Panel1->Caption = ""; Application->Title = "Loupe"; // valeur de l'agrandissement par default au demarrage Zoom = 2; // initialisation Timer Timer1->Interval = 150; Timer1->Enabled = true; flag = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbRight) { // Femeture de la fenêtre sur un click droit sur le PaintBox. Close(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(Button == mbRight) { // Femeture de la fenêtre sur un click droit sur la Form. Close(); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { if(flag == true) { // on cree un Canvas pour peindre sur le TPanel // une croix blanche sur fond rouge TControlCanvas *pCn; pCn = new TControlCanvas(); pCn->Control = Form1->Panel1; pCn->Brush->Color = clRed; pCn->FillRect(Rect(2, 2, 35, 35)); pCn->Pen->Width = 5; pCn->Pen->Color = clWhite; pCn->MoveTo(10, 10); pCn->LineTo(27, 27); pCn->MoveTo(27, 10); pCn->LineTo(10, 27); delete pCn; flag = false; } // on positionne le curseur sur la barre de titre // a 10 du bord gauche et 51 du bord haut Pt.x = 500; Pt.y = 50; HDC DC; int zx; int zy; TRect Rect; // on recupere le Handle de la fenetre sous la fenetre Zoom hwndZoom = WindowFromPoint(Pt); // on recupere les dimensions de la fenetre partiellement masquee GetWindowRect(hwndZoom, &Rect); // si la position Top de la fenetre est inf a 50 on redimensionne la fenetre if(Rect.Top <= 50 && hwndZoom != hwndBureau3) { hwndAppli = WindowFromPoint(Pt); MoveWindow ( hwndAppli, // handle of window fX, // horizontal position fY, // vertical position fWidth, // width RectTray.Top - 50, // height true // repaint flag ); } // Création d'un contexte d'affichage non lié à une fenêtre // donc permet d'accéder à l'écran entier DC = CreateDC("DISPLAY", NULL, NULL, NULL); // prise des coordonnees de la souris zx = Mouse->CursorPos.x; zy = Mouse->CursorPos.y; // limitations de la zone pour ne pas sortir de l'écran if(zx >= (Screen->Width - ClientWidth / Zoom)) { zx = (Screen->Width - ClientWidth / Zoom) - 1; } if(zy >= (Screen->Height - ClientHeight / Zoom)) { zy = (Screen->Height - ClientHeight / Zoom) - 1; } // Copie d'une partie de l'écran dans la boite à peindre StretchBlt(PaintBox1->Canvas->Handle // Copie vers le Canvas du PaintBox1 , 0 // vers X=0 , 0 // et Y=0 ,(ClientWidth * Zoom) - 1 // en multipliant par Zoom la largeur ,(ClientHeight * Zoom) - 1 // en multipliant par Zoom la hauteur ,DC // Copie à partir du canevas global ,zx - 5 // de la position de la souris ,zy - 10 // ... ,ClientWidth // sur la taille de la boite ,ClientHeight // ,SRCCOPY); // Simple copie sans autre effet. // ne pas oublier de libérer le contexte, c'est une ressource rare. DeleteDC (DC); } //--------------------------------------------------------------------------- void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Femeture de la fenêtre sur un click sur le Panel. Close(); } //---------------------------------------------------------------------------
Bonsoir,
Tu peux eventuellement ajouter le .dfm, ça facilite la tache :D
Voici le contenu du fichier
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 object Form1: TForm1 Left = 1360 Top = 181 Width = 252 Height = 91 Caption = 'LoupePremierPlanEnHaut' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False Visible = True OnCreate = FormCreate OnMouseUp = FormMouseUp PixelsPerInch = 96 TextHeight = 13 object PaintBox1: TPaintBox Left = 54 Top = 8 Width = 105 Height = 31 OnMouseUp = PaintBox1MouseUp end object Panel1: TPanel Left = 196 Top = 12 Width = 21 Height = 17 TabOrder = 0 OnMouseDown = Panel1MouseDown end object Timer1: TTimer Enabled = False OnTimer = Timer1Timer Left = 14 Top = 6 end end
Bonjour,
des améliorations possible
1- Essaye de centrer l'affichage du zoom, cad, lorsque le curseur de la souris est au centre de l'écran, sur la fenetre du zoom, on voit un décalage horizontal de l'affichage.
2- Dans OnCreate j'ai ajouté DoubleBuffered = true ;
3- Quelque chose de bisard, si j'arrête le programme par ctrl+alt+suppr, et je le réexecute, rien ne s'affiche ??? il ya lieu de faire le teste de ton coté.
Voici les dernieres modifs
Dans le .h et le .cpp j'ai supprime ceci car non utilise
J'ai modifie ce teste suppression du " = "Citation:
int fHeight; et fHeight = Screen->Height - 85;
On peut modifier l'affichage comme ceciCitation:
// si la position Top de cette fenetre est inf a 50 on redimensionne la fenetre
if(Rect.Top < 50 && hwndZoom != hwndBureau3)
a la fermeture de la Form j'ai ajoute ceciCitation:
// limitations de la zone pour ne pas sortir de l'écran
if(zx >= (Screen->Width - ClientWidth / Zoom))
{
// zx = (Screen->Width - ClientWidth / Zoom) - 1;
PaintBox1->Repaint();
Pour la fermeture par " ctrl+alt+suppr ", dans quelle configuration est tu, y a t'il d'autres fenetres ouverte, et tu sur le bureau seul..., je n'arrive pas a reproduire l'erreurCitation:
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Timer1->Enabled = false;
}
Bonjour,
Si tu utilise PaintBox1->Repaint(); ça provoque des scintillements de l'affichage. j'ai encore rajouter DoubleBuffred = true dans l'évenement de création de la fiche, mais sans succès.
Reste que l'affichage du zoom se trouve aligner sur la gauche par rapport à la position de la fiche. il convient alors de le centrer.
Pour l'arrêt de l'application par Ctrl + Alt + Suppr, le problème vient d'être solutionné :king:.