[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


  • Mod

    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_size

    aber ich finde von links nach rechts/oben nach unten liest es sich besser 🙂

    Gruß und Danke


Anmelden zum Antworten