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
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à (?) :s'affichent et s'ajustent sous ma Form
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 bureau
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 HWND hwndBureau = GetDesktopWindow();
Pourquoi deux valeurs differentes, comment obtenir le Handle du bureau que l'on voit
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : 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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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, utilise
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.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 FAQ
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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");
Quelle est alors la différence entre :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Edit1 -> Text = (int)GetDesktopWindow() ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 .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
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 : 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
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
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 ??
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