Childwindow in "MainWindow" vergrößern
-
Liebe Forum-Mitglieder,
in der Main-Funktion meiner Windows-Applikation erzeuge ich vorerst ein "MainWindow", dem ich dann eine Dialogbox hinzufüge.
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdArgs, int cmdShow) { ... mainWindow.create(); ::CreateDialogParam(hInst, ... ); //Dialogbox ... }
Die Dialogbox soll dabei immer in der linken unteren Ecke erscheinen. Dies funktioniert auch solange bis das Hauptfenster vergrößert/verkleinert wird. Die Dialogbox bleibt dabei leider noch fix!
Beim vergrößern/verkleinern des Hauptfensters wird afaik dieCALLBACK
-Funktion aufgerufen, jedoch nicht dieCALLBACK
-Funktion der Dialogbox, sodass ich dort erst garnicht die MessageWM_SIZE
o.ä. erhalte. In dieser könnte ich schließlich meine Dialogbox entsprechend mitSetWindowPos
neu positionieren.Ich habe vorerst ein
handle
zur Dialogbox global definiert und positioniere meine Dialogbox fortlaufend in meinerMessageLoop
. Dies führt selbstverständlich zu augenunfreundlichem Flackern (<-könnte durch bestimmte Abfragen vermieden werden)....Daher die Frage an Euch:
Wie kann ich elegant einChildwindow
positionieren, wenn sich die Parameter des Hauptfensters ändern.p.s.: Die Idee in der
CALLBACK
-FunktionWM_SIZE
desMainWindow
dashandle
meiner Dialogbox zu greifen schlug auch fehlp.s.s.: Für jeden Hinweis bin ich dankbar
Gruß maggus
-
maggus schrieb:
p.s.: Die Idee in der
CALLBACK
-FunktionWM_SIZE
desMainWindow
dashandle
meiner Dialogbox zu greifen schlug auch fehlUnd wie hast Du es gemacht. Es sollte eigentlich funktionieren.
-
Schön, dass Du Dir die Mühe gemacht und mein Problem studiert hast. Dafür schonmal ein Danke.
In der
CALLBACK
-Funktion vonmainWin
kann ich wie folgt das Fenster neu positionieren:... case WM_SIZE: RECT rect; ::GetWindowRect("aktuellesHandle", &rect); HWND childWind = FindWindowEx("aktuellesHandle", 0, NULL, L"NAME von MAINWIN"); SetWindowPos( childWind,0,0,0,rect.right-rect.left,300,SWP_NOZORDER); ...
Meine Dialogbox hat eine andere
CALLBACK
-Funktion und leider auch keinen Namen (vgl. 4ter Parameter von FindWindowEx).
Ich frage mich gerade, wie ich an einhandle
einerResource
finden kann, da meiner Dialogbox ein Resource-File zugrunde liegt....
-
Bei CreateDialogParam(...) bekommst du doch das Handle auf deinen Dialog zurück gegeben. warum nutzt du diesen nicht bei SetWindowPos sondern suchst umständlich über FindWindow deinen Dialog?
Also die Rückgabe von CreateDialogParam in einer Variable so merken das du diese später wieder verwenden kannst und dein problem sollte sich erledigt haben
-
Dann werde ich mal versuchen das zurückgegebene Handle der Funktion CreateDialogParam(...) als Parameter der
CALLBACK
-Funktion vonmainWindow
zu übergeben. Dann dürfte ich mit SetWindowPos(...) gewünschtes Ziel erreichen.Vielen Dank CTecS
bis denne
maggusp.s. ich melde mich nochmal.
-
Der
CALLBACK
-Funktion einen weiteren Parameter zu übergeben war natürlich nicht möglich.
Das Handel meiner Dialogbox erhalte ich in derCALLBACK
-Funktion vonmainWindows
mittelsget
-Funktion, die ich in der Klasse implementiert habe die mein Dialog mit ::CreateDialogParam(...) erzeugt.
Hier noch eben ein paar Codeschnipsel:-----main.h--------
#include ... //Funktionsdeklarationen, unter anderem auch: HWND getDialog();
-----main.cpp------
HWND hDialog; //global definiertes Handel int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdArgs, int cmdShow) { ... mainWindow.create(); hDialog = CreateDialogParam(...); //Dialogbox ... } HWND getDialog() {return hDialog;}
-----procedure.cpp--------
LRESULT CALLBACK Win::windowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT returnValue = 0; // return value // Controller des window Handle's static Controller *ctrl; ctrl = (Controller*)::GetWindowLongPtr(hwnd, GWL_USERDATA); HWND childWindow = getDialog(); // handle der Dialogbox HWND canvas = FindWindowEx(hwnd, 0, NULL, L"Zeichenfläche"); // handle einer Zeichfläche switch(msg) { ... case WM_SIZE: returnValue = ... SetWindowPos(glWindow,HWND_BOTTOM,0,0,200,300,NULL); SetWindowPos(canvas, HWND_TOP, 0, HIWORD(lParam)-160,300,160,NULL); break; ... } }
Ich hoffe, dass ich dem Forum gerecht geworden bin und soweit alles richtig gemacht habe. Ein Problem wäre damit vorerst gelöst
Euch noch viel Spaß beim Programmieren, wünscht euch
maggus