无法调整 win 32 window

Unable to resize win 32 window

我正在尝试学习如何在 win 32 中创建 window。这就是我所了解的。我面临的问题是我无法创建可以由用户调整大小的 window。我希望有人能帮我解决这个新手问题。

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
std::string msg = "";
UINT width = 0;
UINT height = 0;
switch(uMsg)
{
case WM_SIZE:
   width = LOWORD(lParam);
   height = HIWORD(lParam);
   if(width<(height*600)/800) SetWindowPos(hWnd, NULL, 0, 0, width, height, SWP_NOMOVE|SWPNOZORDER);
   return true;
case WM_SIZING:
   width = LOWORD(lParam);
   height = HIWORD(lParam);
   if(width<(height*600)/800) SetWindowPos(hWnd, NULL, 0, 0, width, height, SWP_NOMOVE|SWPNOZORDER);
   return true;
case WM_DESTROY:
   PostQuitMessage(0);
   return true;
default:
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR lpCmdLine, INT nCmdShow)
{
    WNDCLASSEX wnd = {0};
    wnd.lpszClassName = "WindowLearn";
    wnd.hInstance = hInstance;
    wnd.lpfnWndProc = windowProc;
    wnd.cbSize = sizeof(WNDCLASSEX);
    wnd.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClassEx(&wnd);
    HWND hWnd = CreateWindowEx(NULL, "WindowLearn", "WindowLearnChild", WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, 0, 0, 800, 600, NULL, NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);

    MSG msg = {0};
    float pTime = 0.0f;
    BOOL result;
    while(msg.message != WM_QUIT)
    {
     TranslateMessage(&msg);
     DispatchMessage(&msg);
    }
}

Window 创建成功,但是当我尝试调整 window 大小时,window 卡在鼠标上。

您似乎想要空闲处理,这意味着当事件循环中没有事件时为您的 directX 应用程序完成一些任务。

有两种不同的方法:

  • 为后台处理指定一个单独的线程。它增加了多处理的复杂性,但允许将所有处理作为单个代码进行,并让系统将时间片影响到事件循环和后台处理。

  • 使用修改后的事件循环,在没有事件存在时进行 后台处理。 PeekMessage 是这里的关键:

      ...
      MSG msg = {0};
      for (;;)
      {
          if (PeekMessage(&msg, NULL, 0, 0, 0, 0) {
              if (! GetMessage(&msg, NULL, 0, 0, 0)) break; // msg is WM_QUIT
              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }
          else {
              // do some idle processing for a short time
              // no event will be processing during that
              ...
          }
      }
    

    好的一点是你不需要任何多线程,但你必须在短时间片中明确地分割背景处理。