winapi - Flytter et vindue med SetWindowPos den 'normale måde' at gøre?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg spekulerer på, om følgende for at flytte et vindue (ms-windows) med Win32 API 20 px til højre og 40 px nedad, er følgende
funktionsopkald ville være hvordan man gør det:


SetWindowPos(
  /* hWnd             */  hChildDlg2, 
  /* hWndInsertAfter  */ (HWND) -1,
  /* X                */ 20,
  /* Y                */ 40,
  /* cx               */ -1,
  /* cy               */ -1,
  /* uFlags           */  SWP\_NOSIZE |  // Ignore cx, cy
                          SWP\_NOZORDER  // and hWndInsertAfter
);


Jeg spørger, fordi det forekommer mig, at der kun kan fungere en HWND og en x og y som parametre.

Bedste reference


Ja, det er den normale måde, og vinduet får en WM\_WINDOWPOSCHANGING besked (med de parametre, der blev ændret). Der er også den ældre MoveWindow, men den er mindre fleksibel og tvinger dig faktisk til at indstille størrelsen. [15]


For korrekt lagring og gendannelse af vinduestørrelser skal du bruge henholdsvis GetWindowPlacement og SetWindowPlacement.

Andre referencer 1


Ja, det er stort set, hvordan det er gjort. Du bør foretrække at bruge SetWindowPos(), da det giver dig ret kontrol over, hvordan vinduet skal flyttes/ændres. [16]


Jeg bruger typisk det som sådan (del af en lille ramme jeg skrev):


// Window member function
void Window::Move(int x, int y)
{
    if(hwnd != 0)
    {
        ::SetWindowPos(hwnd, 0, x, y, 0, 0, 
            SWP\_NOZORDER | SWP\_NOSIZE | SWP\_NOACTIVATE);
    }
}


Der er også en MoveWindow() funktion, der gør stort set det samme. Med funktionen SetWindowPos() er den nu mere praktisk end noget andet. [17] [18]

Andre referencer 2


Du mener som MoveWindow? [19]


Det kræver hwnd, x, y, bredde, højde, da der ikke er nogen SWP\_NOSIZE flag, er det faktisk mere kompliceret at bruge det til bare at flytte vinduet, da du også skal hente størrelsen.