ID: Q108315
The information in this article applies to:
When creating a multiple document interface (MDI) window, there are no styles available to have the new window stay on top of the other MDI windows. Alternatively, two methods are available to achieve this functionality:
MDICREATESTRUCT has the field "style", which can be set with the styles for the new MDI window. Extended styles, such as WS_EX_TOPMOST, are not available in MDI windows. This field of MDICREATESTRUCT is passed to CreateWindowEx() in the dwStyle parameter. The dwExStyle field is set to 0L. The two methods shown below cannot be used at the same time in the same application.
Method 1: Process the WM_WINDOWPOSCHANGED message and call SetWindowPos() to change the Z-order of the window.
   LRESULT CALLBACK MdiWndProc (HWND hWnd, UINT message, WPARAM wParam,
                       LPARAM lParam)
   {
       static HWND hWndAlwaysOnTop = 0;
       switch (message)
        {
        case WM_CREATE :
            if (!hWndAlwaysOnTop)
             {
             SetWindowText (hWnd, "Always On Top Window");
             hWndAlwaysOnTop = hWnd;
             }
               break;
        case WM_WINDOWPOSCHANGED :
            if (hWndAlwaysOnTop)
             {
             WINDOWPOS FAR* pWP = (WINDOWPOS FAR*)lParam;
             if (pWP->hwnd != hWndAlwaysOnTop)
                 SetWindowPos (hWndAlwaysOnTop, HWND_TOP, 0, 0, 0, 0,
                         SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
             }
            break;
        // 
        // Other Messages to process here.
        // 
        case WM_CLOSE :
            if (hWndAlwaysOnTop == hWnd)
             hWndAlwaysOnTop = NULL;
        default :
            return DefMDIChildProc (hWnd, message, wParam, lParam);
        }
       return 0L;
   }
   LRESULT CALLBACK MdiWndProc (HWND hWnd, UINT message, WPARAM wParam,
                       LPARAM lParam)
   {
       static HWND hWndAlwaysOnTop = 0;
       switch (message)
        {
        case WM_CREATE :
            SetTimer (hWnd, 1, 200, NULL);
            if (!hWndAlwaysOnTop)
             {
             SetWindowText (hWnd, "Always On Top Window");
             hWndAlwaysOnTop = hWnd;
             }
               break;
        case WM_TIMER :
            if (hWndAlwaysOnTop)
             {
             SetWindowPos (hWndAlwaysOnTop, HWND_TOP, 0, 0, 0, 0,
                        SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
             }
            break;
        case WM_DESTROY:
            KillTimer (hWnd, 1) ;
            break;
        // 
        // Other Messages to process here.
        // 
        case WM_CLOSE :
            if (hWndAlwaysOnTop == hWnd)
             hWndAlwaysOnTop = NULL;
        default :
            return DefMDIChildProc (hWnd, message, wParam, lParam);
        }
       return 0L;
   }
   ARTICLE-ID: Q66943
   TITLE     : Determining the Topmost Pop-Up Window
Keywords          : kbcode kbMDI kbNTOS kbGrpUser kbWinOS kbWndw 
Issue type        : kbhowtoLast Reviewed: December 26, 1998