[gelöst] GetWindow Z-Ordner umgekehrt
-
Hallo,
wenn ich mittels getWindow und GW_HWNDFIRST und GW_HWNDNEXT. damit bekomme ich alle childs eines Windows...soweit so gut.
nur bekomme ich diese in der falschen Reihenfolge (nach Z-Order), also das zuletzt hinzugefügte Child-Window zuerst.
ich dachte nun ich kann die Flags GW_HWNDLAST und GW_HWNDPREV verwenden und bekomme dann die childs andersherum, aber nix da.hat da jemand Erfahrung?
Gruß Frank
-
Laut Doku liegst du mit der Vermutung aber richtig. Kannst du den relevanten Codeteil zur Verfügung stellen?
-
Ausrichtung der client-Controls beim WM_SIZE....horizontal/vertical hintereinander.
case WM_SIZE: { if (fAutomaticReorder) { int c=GetChildCount(); int part_size; if (fVerticalReorder) {part_size=HIWORD(lParam)/c;}else {part_size=LOWORD(lParam)/c;} HWND hChild=GetWindow( hMainform,GW_CHILD | GW_HWNDLAST );//first control has lowest Z-Order int actual_child=1; while (hChild) { //only vertical reorder if (fVerticalReorder) { MoveWindow(hChild, 0, (actual_child-1)*part_size, LOWORD(lParam), part_size, TRUE); }else { MoveWindow(hChild, (actual_child-1)*part_size, 0, part_size, HIWORD(lParam), TRUE); } hChild = GetWindow( hChild, GW_HWNDPREV ); //first control has lowest Z-Order actual_child++; } } }break;das komplette Programm ist hier
der Ausschnitt ist in der cwindow.cxx
bei HWNDPREV in Verbindung mit HWNDLAST wird nur eins der beiden Controls gefunden. HWNDNEXT zusammen mit HWNDLAST oder HWNDFIRST gibt das gleiche Resultat (Controls werden verkehrtherum angeordnet, erst child2 dann child1).
Gruß Frank
-
Wir wäre es mit Doku lesen?
uCmd [in]
UINT
The relationship between the specified window and the window whose handle is to be retrieved. This parameter can be one of the following values.Du darfst nur GW_CHILD verwenden. Eine Kombination mit anderen Werten ist nicht erlaubt.
Danach kannst Du von mir aus auch noch GW_HWNDLAST machen. Dann stehst Du auf dem letzten Control!Ansonsten selt es keine Rolle in welcher Reihenfolge Du die Controls in der Größe veränderst.
Was soll dies ändern, als einfach die Z-Order so durch zu gehen...
Deine Berechnung kannst Du auch anders machen!
-
Danke für den Hinweis,
mir ist auch klar, warum es nicht ging...
GW_CHILD(5) or GW_HWNDLAST(1) = GW_CHILD(5) or GW_HWNDFIRST(0)
(letztes bit ist durch GW_CHILD schon gesetzt, daher hat GW_HWNDLAST keinen Einfluss)hab halt irgendwo den Code zu GetWindow mit HWNDFIRST gefunden, und hab das halt so angepasst

hab die Seite zwar studiert, aber dieses Detail ist mir irgendwie entgangen

für die, die es interessiert hier der aktuelle Code:
HWND hChild=GetWindow( hMainform,GW_CHILD);//first (=GW_HWNDFIRST) control has lowest Z-Order hChild=GetWindow( hChild,GW_HWNDLAST );//get last Childcontrol int actual_child=1; while (hChild) { //only vertical reorder ShowWindowInfo(hChild); if (fVerticalReorder) { MoveWindow(hChild, 0, (actual_child-1)*part_size, LOWORD(lParam), part_size, TRUE); }else { MoveWindow(hChild, (actual_child-1)*part_size, 0, part_size, HIWORD(lParam), TRUE); } hChild = GetWindow( hChild, GW_HWNDPREV); //first control has lowest Z-Order actual_child++; }natürlich kann ich die berechnung anders machen
Position= (Breite bzw. Höhe des Fensters) - actual_child*part_sizeaber ich finde von links nach rechts/oben nach unten liest es sich besser

Gruß und Danke