2012-11-23 78 views
0

我发现了一个窗口中显示,当我打电话SetWindowPosMoveWindow,我指的是窗口中WM_CREATE讯息话题显示之前,我有机会打电话ShowWindow。一点点检查后,我发现它是与SetWindowRedraw奇怪的显示窗口的行为

下面是一个例子:

#include <Windows.h> 
#include <windowsx.h> 

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 
BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct); 
void MainWindow_OnDestroy(HWND hWnd); 
void MainWindow_OnSize(HWND hWnd, UINT state, int cx, int cy); 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASSEX wcex = { sizeof(wcex) }; 
    HWND hWnd; 
    BOOL ret; 
    MSG msg; 

    wcex.lpfnWndProc = MainWindowProc; 
    wcex.hInstance = hInstance; 
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wcex.hbrBackground = GetSysColorBrush(COLOR_WINDOW); 
    wcex.lpszClassName = TEXT("MainWindow"); 
    wcex.hIconSm = wcex.hIcon; 

    RegisterClassEx(&wcex); 
    hWnd = CreateWindow(wcex.lpszClassName, TEXT("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL); 

    // ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0) 
    { 
    if (ret == -1) 
    { 
     return 1; 
    } 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
    } 
    return msg.wParam; 
} 

LRESULT CALLBACK MainWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    HANDLE_MSG(hWnd, WM_CREATE, MainWindow_OnCreate); 
    HANDLE_MSG(hWnd, WM_DESTROY, MainWindow_OnDestroy); 
    HANDLE_MSG(hWnd, WM_SIZE, MainWindow_OnSize); 
    default: 
    return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    } 
} 

BOOL MainWindow_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) 
{ 
    SetWindowPos(hWnd, NULL, 100, 100, 300, 300, SWP_NOREDRAW | SWP_NOZORDER); 
    return TRUE; 
} 

void MainWindow_OnDestroy(HWND hWnd) 
{ 
    PostQuitMessage(0); 
} 

void MainWindow_OnSize(HWND hWnd, UINT state, int cx, int cy) 
{ 
    SetWindowRedraw(hWnd, FALSE); 
    SetWindowRedraw(hWnd, TRUE); 
    RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN) ; 
} 

运行它,一个窗口将显示,而无需调用ShowWindow。但是,如果评论

SetWindowRedraw(hWnd, FALSE); 
SetWindowRedraw(hWnd, TRUE); 

那么窗口会被隐藏起来。

有人可以解释一下吗?

回答

2

SetWindowRedraw()是一个将WM_SETREDRAW消息(使用SendMessage())发送到窗口的宏。

当一个窗口收到这样的消息了一组样式被添加的WS_VISIBLE风格。

逐字从MSDN(WM_SETREDRAW):

[...] 如果应用程序发送WM_SETREDRAW消息发送到一个隐藏的窗口, 窗口变得可见(即,操作系统增加了 WS_VISIBLE样式到窗口)。 [...]