SetWindowPos/MoveWindow



  • moin,
    ich will steuerelemente eines dialogs verschieben und ihre grösse verändern. nun verhalten sich die genannten funktionen nicht ganz so wie ich das erwartet habe. im folgenden beispiel sollte der button IDC_TEST meiner meinung nach seine position beibehalten, tut es aber nicht:

    CRect rect;
    GetDlgItem(IDC_TEST)->GetWindowRect(rect);
    GetDlgItem(IDC_TEST)->MoveWindow(rect);
    GetDlgItem(IDC_TEST)->GetWindowRect(rect);
    

    der erste aufruf von GetWindowRect liefert mir folgende koordinaten:
    rect.top = 148
    rect.bottom = 171
    rect.left = 251
    rect.right = 349

    der zweite aufruf (nach MoveWindow) ergibt:
    rect.top = 223
    rect.bottom = 246
    rect.left = 254
    rect.352

    mit

    GetDlgItem(IDC_TEST)->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_SHOWWINDOW );
    

    erhalte ich das gleiche ergebnis.

    wo ist der fehler ?



  • mit GetWindowRect bekommst du die Koordinaten des Fensters relativ zur oberen linken BILDSCHIRM Ecke,
    mit Move Window setzt du die Koordinaten relativ zur obern linken Ecke des aktiven FENSTERS.

    Greez



  • ach so, d.h. ich muss mir noch die koordinaten des aktiven fensters holen und ein wenig rechnen. oder gibt es eine möglichkeit, die koordinaten des buttons bezogen auf die linke obere ecke des aktiven fensters zu ermitteln? noch besser wäre für meine zwecke eine funktion die einen dialog inklusive aller steuerelemente neu skaliert, aber die gibts wohl nicht.

    schönen dank schon mal!



  • schau dir doch mal die Funktion

    ScreenToClient(..)
    

    an.

    Greez


Anmelden zum Antworten