Fenster minimiert sich einfach
-
Hallo,
ich habe eigentlich schon Ahnung von Fenstern aber nun stehe ich auf dem Schlauch, ich weiß echt nicht weiter.
Ganz einfaches Beispiel: Ein Fenster erstellt eine Art child-window, wobei nicht WS_CHILD angegeben wird, sondern einfach als Parent-Handle das Handle übergeben wird, sodass das Childwindow immer über dem Parent sich befindet.
Nun gibt das ChildWindow eine MessageBox aus.
Wenn der Benutzer nun das ChildWindow schließt, minimiert sich automatisch das Parent.
Warum?Hier ein vereinfachter Code:
#include <windows.h> HWND hParent, hChild; HINSTANCE hInst; LRESULT CALLBACK ParentProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM); TCHAR szParentClass[] = "PC"; TCHAR szChildClass[] = "CC"; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { hInst = hInstance; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground= (HBRUSH)GetStockObject(BLACK_BRUSH); wc.hCursor = LoadCursor(0, IDC_ARROW); wc.hIcon = 0; wc.hIconSm = 0; wc.hInstance = hInstance; wc.lpfnWndProc = ParentProc; wc.lpszClassName= szParentClass; wc.lpszMenuName = 0; wc.style = 0; RegisterClassEx(&wc); wc.lpfnWndProc = ChildProc; wc.lpszClassName= szChildClass; RegisterClassEx(&wc); hParent = CreateWindowEx(0, szParentClass, "Parent", WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0); while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK ParentProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CREATE: hChild = CreateWindowEx(0, szChildClass, "Child", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 10, 10, 100, 100, hwnd, 0, hInst, 0); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(0, "", "", 0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
Wie gesagt, wird die MessageBox nicht ausgelöst, wird das Parent beim Schließen des Child nicht minimiert
.
Thx für Antworten
[ Dieser Beitrag wurde am 23.03.2003 um 14:49 Uhr von Black Shadow editiert. ]
-
sodass das Childwindow immer über dem Parent sich befindet
Dann ist das Verhalten doch völlig ok.
-
Ja, aber warum minimiert sich das Parent beim Schließen des Child?
-
Original erstellt von Black Shadow:
Ja, aber warum minimiert sich das Parent beim Schließen des Child?Macht es doch garnicht.
-
Doch!
Wie gesagt, nur wenn die MessageBox kommt.
Compiliere es, klick auf das Child, dann kommt die MessageBox. Hier klicks du auf ok. Wenn du nun das Child schließt, minimiert sich das Parentfenster[ Dieser Beitrag wurde am 23.03.2003 um 15:03 Uhr von Black Shadow editiert. ]
-
bei mir nicht
-
ach doch, hatte gedacht schließen == minimieren
wie wärs mit SetForegroundWindow?
-
Naja...
Zum einen weiß ich immernoch den Grund nicht, warums nicht geht und zum anderen erzeugt SetForegroundWindow ein hässliches Flackern.Aber warum minimierts sichs eigentlich?
-
bei der begründung kann ich dir nicht helfen, aber ...
1.) mit SetForegroundWindow flackert überhaupt nichts
2.) wird das Fenster nicht minimiert, sondern ist einfach im Hintergrund
-
da muss ich dir wiedersprechen...
- es flackert und verschwindet sogar kurz
- nein. Man muss ja auf die Taskleiste klicken, um es sichtbar zu machen.
-
1.) zeig mal wie du das gemacht hast, bei mir sieht es gut aus und man sieht nichts flackern oder verschwinden
2.) Dann minimiere mal alle anderen Fenster und du wirst sehen, das es einfach nur im Hintergrund liegt, aber nicht minimiert ist
-
genau
-
LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(NULL, "", "", MB_OK); return 0; case WM_DESTROY: SetForegroundWindow(hParent); break; } return DefWindowProc(hwnd, message, wParam, lParam); }
Da flackert nix!
-
LRESULT CALLBACK ChildProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(hParent, "", "", MB_OK); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
geht auch!
-
Was auch geht: Aktiviere mal in deinem Ausgangsprogramm nach Ausgabe der MessageBox dein ParentWindow und schließe dann dein Child.
[ Dieser Beitrag wurde am 23.03.2003 um 16:16 Uhr von WebFritzi editiert. ]
-
Doch, das flackert!
Bei diesem Beispiel zwar nur manchmal, ich habe aber bei meinem eigentlichen Programm ein großes Fenster mit etlichen Controls. Es flackert nicht nur: Es dauert eine halbe Sekunde, bis alles wieder da ist, was nicht normal ist. Der eigentliche Paint-Vorgang geht ja recht schnell.
-
kann man das programm mal ausprobieren?
-
Entschuldigung, die halbe Sekunde kommt durch was anderes zur stande
.
Und bier, du hattest recht, dass das Fenster sich nur hinter einem anderen rückt, ich merkte das nicht, da der Compiler immer offen war. Also braucht es einfach nur den Focus, um nicht zu verschwinden: Durch einen Aufruf von SetFocus() anstatt SetWindowForeground() wird jegliches Flackern unterbindetDanke für eure Bemühungen
-
Original erstellt von Black Shadow:
wird jegliches Flackern unterbindetIck spreken auk guter deutsch.