GetSystemMetrics() und Dialogfeldgrößen



  • die größe eines dialogfeldes kann man mit GetWindowRect() ermitteln.

    die rechte kannte des dialogfeldes ist aber leider nicht CRect::Width() meines fensters. kann ich da nicht einfach sagen

    int RechteKannte = CRect::Width() - GetWindowRect(X)
    

    oder ähnliches ?
    mir geht es um den wirklichen wert meiner rechten kannte



  • Wenn ich jetzt nicht total daneben liege, dann würde ich das so sehen:

    GetWindowRect() liefert die doch unter anderem die linke obere Position (rect.left) und die Breite des Dialogs (rect.Width()).
    Die linke obere Ecke + die Breite des Dialogs gibt dann theoretisch die rechte obere Ecke.

    CRect rect;
    GetWindowRect(&rect);
    int rechte_Ecke = rect.left + rect.Width();
    


  • so gesehen denke ich schon, aber das währe dann wahrscheinlich das gleiche wie rect.right

    ich will ja die controls im dialogfeld automatisch der fenstergröße anpassen. da die koordinate (0|0) die obere linke ecke des fenster ist, kann ich leider nicht rect.left + rect.Width(); benutzen.

    wenn ich jetzt sage:

    CRect meinButton;
    GetDlgItem(IDC_MEIN_BUTTON)->GetWindowRect(meinButton);
    

    dann müsste es theoretisch so gehen:

    CRect rWindowRect;
    
    GetWindowRect(rWindowRect);
    GetDlgItem(IDC_MEIN_BUTTON)->SetWindowPos(NULL, rWindowRect.right - meinButton.Width(), rWindowRect.top, NULL, NULL, SWP_NOSIZE);
    

    aber dann ist das button ein bischen aus dem fenster rausgeschoben, also nach rechts versetzt. das will ich vermeiden



  • Wenn ich dich richtig verstehe möchtest du deinen Dialog je nach Auflösung des Benutzers anzeigen lassen und vorhandene Steuerelemente anpassen. Ich würde das so lösen:

    - Den Dialog in einer Grösse entwerfen, z.B 800600
    - 2 Variablen für die Dialogklasse anlegen, z.B int nZusatzBreite und int nZusatzHoehe.
    - Die Auflösung des Benutzers abfragen und je nachdem die Grösse des Dialogs anpassen
    - Wenn der Benutzer eine Auflösung von 1024
    768 benutzt, dann rechne: 1024-800 für nZusatzBreite und 768-600 für nZusatzHoehe. In den 2 Variablen steht also die Differenz Auflösung Benutzer - Auflösung eigener Dialog

    Mit diesen Werten müsstest du eigentlich die Steuerelemente variabel anpassen können. Ich zeige dir das mal anhand von Code den ich hier habe. Das ist alles mit MoveWindow(), aber kannste ja umbauen wie du es brauchst. Ich lasse jetzt mal die Abfrage mit GetSystemMetrics() weg, die müsstest du dann auch noch einbauen und trage die Differenzen von Hand ein (das musst du dann natürlich in der Anwendnung errechnen). Angenommen mein Dialog hat eine Grösse von 800*600, der Benutzer benutzt 1024*768, dann sieht der Code so aus:

    // ------ Dialog an Auflösung des Benutzers anpassen ------
    
    // Daten des Dialogs ermitteln 
    CRect CDlgRect;
    GetWindowRect(&CDlgRect);
    
    // Auflösung des Benutzers ermitteln, mit GetSystemMetrics()
    ...
    // Mit der Auflösung des Benutzers und der Grösse deines Dialogs kannste 
    // die Differenz ermitteln. Ich habs jetzt von Hand eingetragen
    // Breite mein Dialog=800, Breite Auflösung Benutzer=1024, also 1024-800
    nZusatzBreite=224;
    // Höhe mein Dialog=600, Höhe Auflösung Benutzer=768, also 768-600
    nZusatzHoehe=168;
    
    // Dialog an Auflösung des Benutzer anpassen    
    MoveWindow(CDlgRect.left , CDlgRect.top , CDlgRect.Width() + nZusatzBreite, CDlgRect.Height() + nZusatzHoehe, TRUE);
    

    Der Dialog ist jetzt an die Auflösung des Nutzers angepasst. Wenn ich jetzt z.B einen Button habe, der sich auch anpassen soll, dann würde ich das so machen:

    CRect CBtnRect;
    
    // Zeiger auf Button erstellen und den Button zuweisen
    CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON2);
    
    // Maße des Buttons ermitteln
    pButton->GetWindowRect(CBtnRect);
    
    // Ermittelte Koordinaten bzw Maße umwandeln
    ScreenToClient(&CBtnRect);
    
    // Button verschieben
    pButton->MoveWindow(CBtnRect.left+nZusatzBreite, CBtnRect.top, CBtnRect.Width(), CBtnRect.Height(), TRUE);
    

    Der Button wurde jetzt also um genau den Wert nach rechts verschoben, um wieviel sich der Dialog vergrössert hat. Damit ist er wieder an der gleichen Stelle wie vorher. Wenn du jetzt den Dialog zentrierst müsstest du eigentlich mit der Variable nZusatzHoehe den Button auf die gleiche Höhe bekommen wo er vorher stand. Wie gesagt, den Code hatte ich hier, vielleicht bringt er dir was



  • mit movewindow() kann ichs mal versuchen. habe es bisher so ähnlich gemacht wie beschrieben. mal scheuen morgen 🙂 danke


Anmelden zum Antworten