2 winapi design-patterns messages
我使用C工作一些项目并使用Win32API,使用不同的语言或任何其他库,如MFC,GTK,QT等,不是一个选项.
我正在寻找一种处理Windows消息/信号/事件的好方法,例如:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg) {
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(wparam) {
case ID_OK_BUTTON:
DoSomething(hwnd);
break;
case ID_FOO_BUTTON:
DoFoo(hwnd);
break;
/*
....
It's only getting more complex
....
*/
case ID_BAR_BUTTON:
DoBar(hwnd);
break;
case ID_EXIT_BUTTON:
SendMessage(hwnd, WM_CLOSE, wparam, lparam);
break;
case ID_OPEN_BUTTON:
OpenFile(hwnd);
break;
}
break;
default:
return DefWindowProc(hwnd, msg, wparam, lparam);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这部分变得越来越复杂和丑陋.你知道如何简化它,也许就像我在许多GUI库中总是看到的那样:
some_magic(some_object, message, callback);
Run Code Online (Sandbox Code Playgroud)
任何简单的建议都将是一个很大的帮助.
MFC,ATL,WTL使用映射概念以开发人员友好的方式定义消息到成员映射.宏隐藏消息/命令/通知代码的比较,并且在标准满意度上调用相应的成员函数.
我希望这可以解释它是如何工作的.一组MAP_ENTRY线应该看起来不那么难看.
#define MAP_ENTRY(message, callback) if(msg == message) return callback(wnd, msg, wparam, lparam);
// ...
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
MAP_ENTRY(WM_INITDIALOG, OnInitDialog)
MAP_ENTRY(WM_DESTROY, OnDestroy)
MAP_ENTRY(WM_TIMER, OnTimer)
return DefWindowProc(hwnd, msg, wparam, lparam);
}
LRESULT OnInitDialog(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
// ...
}
LRESULT OnDestroy(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
// ...
}
LRESULT OnTimer(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)