0

電話をかけるとウィンドウが表示されるのを見つけました。SetWindowPosつまり、メッセージを送信する前に、電話をかける前にMoveWindowウィンドウが表示されます。少し調べてみたところ、と関係があることがわかりました。WM_CREATEShowWindowSetWindowRedraw

次に例を示します。

#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);

その後、ウィンドウは非表示のままになります。

誰かがこれを説明できますか?

4

1 に答える 1

2

SetWindowRedraw()WM_SETREDRAW(を使用して)メッセージをSendMessage()ウィンドウに送信するマクロです。

ウィンドウがそのようなメッセージを受信すると、そのスタイルのセットはスタイルをWS_VISIBLE追加します。

MSDNの逐語的表現(WM_SETREDRAW):

[...]アプリケーションがWM_SETREDRAWメッセージを非表示のウィンドウに送信すると、ウィンドウが表示されます(つまり、オペレーティングシステムがWS_VISIBLEスタイルをウィンドウに追加します)。[...]

于 2012-11-23T14:13:02.123 に答える