gpt4 book ai didi

c++ - Wndproc 处理事件代码少

转载 作者:可可西里 更新时间:2023-11-01 11:25:45 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以缩短这段代码,是否有办法制作一个 #define 来缩短我在消息开关中执行 if 语句的方式。我检查我是否已经设置了一个函数,如果有我就调用它这只是我的 wndproc 的一部分,它要大得多

LRESULT Base::WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_CREATE:
{
if (this->onCreate != NULL)
{
if (onCreate(hwnd, (LPCREATESTRUCT)lParam))
return 1;
}
}break;

case WM_DESTROY:
{
if (onDestroy != NULL)
{
if (onDestroy(hwnd))
return 1;
}
this->Destroy();
}break;

case WM_SIZE:
{
if (onSize != NULL)
{
if (onSize(hwnd, wParam, lParam))
return 1;
}
}break;

case WM_CLOSE:
{
if (onClose != NULL)
{
if (onClose(hwnd))
return 1;
}
}break;

default:
{

}break;

}

return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
}

这样定义的指针

LRESULT(*onCreate) (HWND, LPCREATESTRUCT);

然后我像这样添加它们

LRESULT onCreate(HWND, LPCREATESTRUCT)
{

return true;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR pCmdLine, int nCmdShow)
{
Window mainWindow;
mainWindow.onCreate = onCreate;

return 0;
}

最佳答案

使用 <WindowsX.h> 中定义的 message-cracker macros 。这实际上不会使代码运行得更快,也不会真正导致代码行的净损失,但它肯定会使代码更易于阅读,这是重要的部分.没有人愿意查看 1000 行的 switch 语句。此外,这些宏从 WPARAM 和 LPARAM 中提取每条消息的参数,从而增强可读性、减少错误并简化您​​必须记住的内容。

宏非常简单,一点也不高科技(它们起源于 16 位 Windows 时代):

#define HANDLE_MSG(hwnd, message, fn)    \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

但是它们是为所有最常见的消息预定义的(如果您发现需要它们,您可以为它们省略的两三个消息添加您自己的),因此您不必处理丑陋。您只会得到漂亮、可读的代码:

#include <Windows.h>
#include <WindowsX.h> // for the message cracker macros

...

void Base::OnClose(HWND hWnd)
{
// ...
}

BOOL Base::OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
// ...

return TRUE;
}

void Base::OnDestroy(HWND hWnd)
{
// ...
}

void Base::OnSize(HWND hWnd, UINT state, int cx, int cy)
{
// ...
}

LRESULT Base::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_CLOSE, OnClose);
HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
HANDLE_MSG(hWnd, WM_DESTROY, OnDestroy);
HANDLE_MSG(hWnd, WM_SIZE, OnSize);
// TODO: Add more message crackers here to handle additional messages.

default:
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}

头文件还包含显示处理函数签名的注释。但是看看 Hernán Di Pietro's Message Cracker Wizard 让你的生活更轻松。它列出了所有消息,允许您将它们过滤到您要查找的消息,并且会自动将模板代码复制到剪贴板!

关于c++ - Wndproc 处理事件代码少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37879874/

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