2012-11-23 2 views
0

SetWindowPos 또는 MoveWindow을 호출 할 때 창이 표시되는 것을 확인한 후에 ShowWindow에 전화하기 전에 창이 WM_CREATE 메시지로 표시됩니다. 약간의 점검 후에, 나는 그것이 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 스타일). [...]