在开发“518抽奖软件”的时候,需要用到主窗口上含对话框时最小化的功能。 本来很简单的一行代码 ShowWindow(SW_MINIMIZE) 即可,但是这个代码在XP系统下不能用,一旦执行,最小化后就无法再恢复窗口了(窗口无法再打开了)。 所以在XP下采用了其它的方法,详情如下:
窗口创建阶段源码
if (g_app.m_osVer <= 5)
{
WNDCLASSEX wcex = { 0 };
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wcex.lpfnWndProc = (WNDPROC)Proc_minimized;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MY518CJ);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = L"518cjMinimized";
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
RegisterClassEx(&wcex);
m_hMinimized = CreateWindow(L"518cjMinimized", g_title, WS_POPUP, 0, 0, 300, 150, NULL, NULL, m_hInst, NULL);
}
主窗口上含对话框时最小化源码
static list wnds;
void Tapp::minimize_app()
{
if (g_app.m_osVer >= 6)
{
ShowWindow(m_hMain, SW_MINIMIZE);
return;
}
wnds.clear();
HWND h = GetLastActivePopup(m_hMain);
if (h != m_hMain)
{
wnds.push_back(h);
REGET:
h = GetWindow(h, GW_OWNER);
if (h && h != m_hMain)
{
wnds.push_back(h);
goto REGET;
}
}
list::iterator pos = wnds.begin();
while (pos != wnds.end())
{
ShowWindow((*pos), SW_HIDE);
pos++;
}
ShowWindow(m_hMain, SW_HIDE);
ShowWindow(m_hMinimized, SW_MINIMIZE);
}
LRESULT CALLBACK Proc_minimized(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (message)
{
case WM_QUERYOPEN:
{
list::iterator pos = wnds.begin();
while (pos != wnds.end())
{
ShowWindow((*pos), SW_SHOW);
pos++;
}
ShowWindow(g_app.m_hMain, SW_SHOW);
ShowWindow(hWnd, SW_HIDE);
break;
}
case WM_PAINT:
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}