gpt4 book ai didi

c++ - 如何正确处理 win32 GUI 消息循环?

转载 作者:太空宇宙 更新时间:2023-11-03 10:45:25 25 4
gpt4 key购买 nike

为了好玩,我正在制作一个简单的文本编辑器 win32 应用程序。我的程序有一个特殊问题。看来我的程序在退出时没有返回零。相反,它返回 1385929。当我的主 GUI 窗口被销毁时,我使用 PostQuitMessage( 0 ),但似乎这不是我主函数的 message.wParam< 中返回的内容。到目前为止,这是我的代码,

#define WIDTH 500
#define HEIGHT 400

#define EDIT_ID 10

LRESULT CALLBACK windowProc( HWND window, UINT message, WPARAM wParam, LPARAM lParam )
{
static HDC deviceContext = INVALID_HANDLE_VALUE;
static HWND editControl = INVALID_HANDLE_VALUE;

switch ( message )
{
case WM_CREATE :
deviceContext = GetDC( window );

if ( !deviceContext )
{
showWindowsError( "Creating Device Context", FALSE );
DestroyWindow( window );
}

editControl = CreateWindow(
"EDIT",
NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_LEFT |
ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL,
0,
0,
0,
0,
window,
( HMENU )EDIT_ID,
( HINSTANCE )GetWindowLong( window, GWL_HINSTANCE ),
NULL
);

if ( !editControl )
{
showWindowsError( "Creating Edit Control", TRUE );
DestroyWindow( window );
}

return 0;
break;

case WM_COMMAND :
switch ( wParam )
{
case WM_UNDO :
SendMessage( editControl, WM_UNDO, 0, 0 );
break;

case WM_CUT :
SendMessage( editControl, WM_CUT, 0, 0 );
break;

case WM_COPY :
SendMessage( editControl, WM_COPY, 0, 0 );
break;

case WM_PASTE :
SendMessage( editControl, WM_PASTE, 0, 0 );
break;

case WM_CLEAR :
SendMessage( editControl, WM_CLEAR, 0, 0 );
break;

default:
return DefWindowProc( window, message, wParam, lParam );
}

case WM_SIZE :
MoveWindow( editControl, 0, 0, LOWORD( lParam ), HIWORD( lParam ), TRUE );

return 0;
break;

case WM_DESTROY :
ReleaseDC( window, deviceContext );
DestroyWindow( editControl );
PostQuitMessage( 0 );

return 0;
break;
}

return DefWindowProc( window, message, wParam, lParam );
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdArgs, int nCmdShow )
{
WNDCLASSEX windowClass = { 0 };
HWND window = INVALID_HANDLE_VALUE;

MSG message = { 0 };
HBRUSH windowColor = CreateSolidBrush( GetSysColor( COLOR_WINDOW ) );

windowClass.cbSize = sizeof( windowClass );
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = windowProc;
windowClass.hInstance = hInstance;
windowClass.hCursor = LoadCursor( NULL, IDC_ARROW );
windowClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
windowClass.hbrBackground = windowColor;
windowClass.lpszClassName = "TextEditorWindow";

if ( !RegisterClassEx( &windowClass ) )
{
DeleteObject( windowColor );
showWindowsError( "Registering Windows Class", TRUE );
}

window = CreateWindow(
"TextEditorWindow",
"Text Editor",
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
WIDTH,
HEIGHT,
NULL,
NULL,
hInstance,
NULL
);

if ( !window )
{
DeleteObject( windowColor );
showWindowsError( "Creating GUI", TRUE );
}

ShowWindow( window, SW_SHOW );
UpdateWindow( window );

do
{
TranslateMessage( &message );
DispatchMessage( &message );
} while ( GetMessage( &message, window, 0, 0 ) > 0 );

DeleteObject( windowColor );
return message.wParam;
}

最佳答案

您对 GetMessage() 的调用将第二个参数设置为您窗口的 HWND,这将接收到的消息仅限于发送到该窗口的消息 - 请参阅 the documentation API 函数。

另一方面,

WM_QUIT 是发送到运行消息泵的线程的消息,没有任何特定窗口。由于该过滤器,您不会收到它,并且 message.wParam 永远不会设置为 0

但是为什么循环结束并且程序还是关闭了呢?因为 window 中的 HWND 在窗口关闭后失效,所以 GetMessage() 以错误结束并返回 -1.


此外,您当前正在使用 message 调用 TranslateMessage()DispatchMessage(),然后再用任何正确的数据填充它,在第一次迭代。循环应该是这样的:

while ( GetMessage( &message, NULL, 0, 0 ) > 0 )
{
TranslateMessage( &message );
DispatchMessage( &message );
}

关于c++ - 如何正确处理 win32 GUI 消息循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com