Alle Kindvenster verstecken
-
gibt es einen Befehl, der alle Kindfenster eines Fenster versteckt (wie ShowWindow(hwnd, SW_HIDE) allgemein für alle Kindfenster)?
Ich glaube mal so etwas gesehen zu habe, leider erinnere ich mich nicht wo,
und ich kann auch nirgens sowas finden...
-
Wenn Du das Elternfenster mit ShowWindow(hwnd, SW_HIDE) versteckst, dann werden die Kindfenster automatisch mit ausgeblendet.
-
das schon, aber das Elternfenster soll erhalten bleiben, ich will nur all die Buttons, Editfelder und Scrollbars verschwinden lassen
-
Dann EnumChildWindows verwenden und in der Callbackfunktion die Fenster anzeigen/ausblenden.
-
oke, habs versucht, und hat beinahe in einer katastrophe geendet xD
jedes Fenster wurde versteckt, absolut jedes... Das passiert laut MSDN wenn das angegebene Elternhandle 0 ist... Nur sollte es das in meinem Fall nicht gewesen sein...
hättest du per Zufall ein Codebeispiel für die richtige anwendung?
:: edit ::
danke für deine Bemühungen, schaffe es jetzt (hoffentlich) selber
:: edit 2 ::
doch noch ein Problem: Wenn ich EnumChildWindows in WM_CREATE aufrufe funktioniert es nicht, dagegen in WM_COMMAND schon, wieso?
-
Du musst bei EnumChildWindows als Elternfenster natürlich Dein Fenster angeben. 0 entspricht HWND_DESKTOP, und da alle Fenster im System dem Desktopfenster untergeordnet sind...
Vermutlich sind die Kindfenster in WM_CREATE noch nicht erstellt. Lässt sich leicht durch einen Breakpoint in der Callbackfunktion feststellen. Dort sieht man, welche Fenster alle ermittelt werden.
-
hmm, wo könnte ich es dann sonst einbauen, das gleich zu begin die kindfenster versteckt werden?
-
Wenn es ein Dialog ist, mach es bei WM_INITDIALOG
Ansonsten ist GetWindow weitaus leichter zu bedienen als EnumChildWindows!
-
so wie ich das verstehe, und es ist gut möglich dass ich das falsch verstehe, gibt mir diese funktion, nur das oberste Kindfenster zurück, ich brauche aber alle...
Ich kann auch alle Kindfenster mit ShowWindow(hwndchild, SW_HIDE) verstecken, aber ab einer gewissen Anzahl von Kindfenstern wird das echt mühsam.. von dem her wäre die EnumChildWindows funktion schon das richtige...
:: edit ::
hab jetzt eine Lösung gefunden, auch wenns warscheindlich nicht die beste ist:
ich hab die EnumChildWindows funktion unt WM_NULL reingepackt und in WinMain sende ich diese Message einfach, nachdem das Fenster erstellt wurde
-
// Alle Childfenster sichtbar/unsichtbar machen void HideAllChildWindows(HWND hWnd, BOOL fHide) { // Erstes Childfenster ermitteln HWND hWndChild = GetWindow(hWnd, GW_CHILD); // Solange Childfenster vorhanden sind... while (NULL != hWndChild) { // Fenster anzeigen/verbergen ShowWindow(hWndChild, fHide ? SW_HIDE : SW_SHOW); // Naechstes Childfenster ermitteln hWndChild = GetWindow(hWndChild, GW_HWNDNEXT); } }
-
venster, venster, lol, du machst mal ganz große karriere später.
-
noch einmal eine Fensterfrage, dachte mache nicht extra ein neues Thema dafür auf:
Wie kriege ich die handles der Fenster, die gerade sichtbar sind, also solche, welche in der Taskleiste vorhanden sind?
Ich hab schon verschiedenes Probiert mit GetForegroundWindow, GetNextWindow, usw. ich kriege aber immer auch fenster die versteckt sind, irgendwelche windowsanwendungne und die Taskleiste..
-
Hier noch Code zum obrigen Problem, meine Ansätze:
... void HIDE::HideWindows(HWND main, int anzahl) { int i = 0; HWND test = GetWindow(main, GW_HWNDFIRST); while (test != NULL && i < anzahl) { if (IsWindowVisible(test) != NULL) { i++; } test = GetNextWindow(test, GW_HWNDNEXT); } e = i+1; i = 0; hwnd = new HWND[e]; test = GetWindow(main, GW_HWNDFIRST); while (test != NULL && i < e) { while (IsWindowVisible(test) == NULL) { test = GetWindow(test, GW_HWNDNEXT); } i++; hwnd[i] = test; } for (int x = 0; x < e; x++) { ShowWindow(hwnd[x], SW_MINIMIZE); } } void HIDE::UnhideWindows() { for (int i = 0; i < e; i++) { ShowWindow(hwnd[i], SW_SHOW); } delete[] hwnd; }