Here is code I use to restore a saved window position, which includes checks to make sure the user hasn't saved a window position at one screen resolution and then restored it at a different screen resolution (which might cause the window's frame controls to be completely off the display -- we've all seen that, right???):
BOOL SetWindowPosition (const HAB hab, const HWND hwndFrame, const SWP swpConfig) { SWP swp ; APIRET ulRC ; // Initialize the window positioning flags. swp.fl = SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ; /* Check for saved user preferences for screen width/height in * config file. Did user want to start maximized? */ if (swpConfig.fl & SWP_MAXIMIZE) { // Get maximized frame window position and size. ulRC = WinGetMaxPosition (hwndFrame, &swp) ; if (!ulRC) { // Report error, and then ... return TRUE ; } swp.fl |= SWP_MAXIMIZE ; } // Did user want to start minimized? else if (swpConfig.fl & SWP_MINIMIZE) { // Get minimized frame window position and size. ulRC = WinGetMinPosition (hwndFrame, &swp, (PPOINTL) NULL) ; if (!ulRC) { // Report error, and then ... return TRUE ; } swp.fl |= SWP_MINIMIZE ; } // Did user have a saved starting position and size? else if (swpConfig.cy || swpConfig.cx || swpConfig.x || swpConfig.y) { LONG cxClientMax ; LONG cyClientMax ; LONG cyTitleBar ; LONG cxSizeBorder ; LONG cySizeBorder ; // Get maximum client window size. cxClientMax = WinQuerySysValue (HWND_DESKTOP, SV_CXFULLSCREEN) ; cyClientMax = WinQuerySysValue (HWND_DESKTOP, SV_CYFULLSCREEN) ; cyTitleBar = WinQuerySysValue (HWND_DESKTOP, SV_CYTITLEBAR) ; cxSizeBorder = WinQuerySysValue (HWND_DESKTOP, SV_CXSIZEBORDER) ; cySizeBorder = WinQuerySysValue (HWND_DESKTOP, SV_CYSIZEBORDER) ; // Maximum client window size excludes title bar. cyClientMax += cyTitleBar ; // Make sure x origin is within display boundaries. swp.x = swpConfig.x ; if (swp.x < -cxSizeBorder) swp.x = 0 ; // Make sure window isn't too wide, or negative value. swp.cx = swpConfig.cx ; if (swp.cx >= cxClientMax || swp.cx < 0) { swp.cx = cxClientMax ; swp.x = 0 ; } if ((swp.x + swp.cx) > (cxClientMax + cxSizeBorder)) swp.x = cxClientMax + cxSizeBorder - swp.cx ; // Make sure y origin is within display boundaries. swp.y = swpConfig.y ; if (swp.y < -cySizeBorder) swp.y = 0 ; // Make sure window isn't too high, or negative value. swp.cy = swpConfig.cy ; if (swp.cy > cyClientMax || swp.cy < 0) { swp.cy = cyClientMax ; swp.y = 0 ; } if ((swp.y + swp.cy) > (cyClientMax + cySizeBorder)) swp.y = cyClientMax + cySizeBorder - swp.cy ; } // No saved position -- move window to FCF_SHELLPOSITION location. else { // Get default window size and position. ulRC = WinQueryTaskSizePos (hab, 0, &swp) ; if (ulRC) { // Report error, and then ... return TRUE ; } swp.fl = SWP_ACTIVATE | SWP_MOVE | SWP_SIZE | SWP_SHOW ; } // Position and size this frame window. ulRC = WinSetWindowPos (hwndFrame, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy, swp.fl) ; if (!ulRC) { // Report error, and then ... return TRUE ; } return FALSE ; }
Credit: Wayne Kovsky