Article ID: 108315
Article Last Modified on 7/11/2005
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;
}
Method 2: Install a timer for the MDI windows and reset the Z-order of
the window when processing the WM_TIMER message.
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;
}
For additional information on changing the Z-order of child pop-up windows,
please see the following article(s) in the Microsoft Knowledge Base:
66943 Determining the Topmost Pop-Up Window
Keywords: kbhowto kbwndw kbmdi KB108315