2012-11-23 106 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樣式到窗口)。 [...]