无法调整 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
...
}
}
好的一点是你不需要任何多线程,但你必须在短时间片中明确地分割背景处理。
我正在尝试学习如何在 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 ... } }
好的一点是你不需要任何多线程,但你必须在短时间片中明确地分割背景处理。