如何为 MFC 中的多个按钮编写一个消息处理程序?
Posted
技术标签:
【中文标题】如何为 MFC 中的多个按钮编写一个消息处理程序?【英文标题】:How to write one message handler for multiple buttons in MFC? 【发布时间】:2012-07-21 17:54:20 【问题描述】:我有一些按钮,我想为所有按钮编写一个消息处理程序。有什么方法可以找出点击了哪个按钮?在 C# 中,有一个参数(发送者),MFC 有类似的东西吗?还是我必须为所有按钮单独编写相同的消息处理程序?
【问题讨论】:
【参考方案1】:最好的选择可能是给所有按钮连续的 ID 号,然后使用 ON_COMMAND_RANGE(FIRST_BUTTON_ID, LAST_BUTTON_ID, HandlerFunction)。然后 HandlerFunction 将采用 UINT nID ,这将是调用处理程序的按钮的 ID 号。更多信息here
【讨论】:
【参考方案2】:对于典型的 WM_COMMAND 消息,消息的 lParam 成员应该保存发送者的 HWND——如果发送者是一个窗口。正如@Redeye 回答的那样,您可以将所有按钮放在一个范围内,并在消息表中写入一个 ON_COMMAND_RANGE() 条目和一个 OnCommand(UINT nCmd) (或您命名的任何名称)作为窗口、对话框、视图的成员函数、框架或文档类。按钮不一定要在一个范围内。您可以为每个按钮 ID 放置一个条目作为 ON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON1)
-- 或任何标识符。这个宏并没有规定开始和停止范围必须不同。
您可以编写自己的消息破解宏,它基本上完成了 ON_COMMAND_RANGE() 的工作,但只需要一个条目。
您还可以在处理程序中调用 CWnd::GetCurrentMessage() 并在处理程序中对其进行破解以检索命令。消息的 wParam 成员的 LOWORD 保存控制标识符。消息的 lParam 成员持有发送控件 HWND——如果它是一个窗口。对于工具栏之类的东西,工具栏按钮不是真正的按钮,而是由工具栏绘制的,因此 lParam 将始终是工具栏的 HWND。
【讨论】:
【参考方案3】:如果我正确理解了这个问题,这很简单:在属性编辑器中分配 OnCommand 事件时,不要再次单击(让向导添加另一个消息处理程序,而是选择现有处理程序之一。如果可以不让这个工作(不知道你的 VStudio 版本和设置),你可以手动完成:正常创建新的处理程序,保存,然后进入 .cpp 和 .h 文件,删除类头中的声明和.cpp 文件中的实现,转到消息映射并更改 ON_COMMAND 条目,以便它使用现有(旧/通用)处理程序。对于 ON_UPDATE_UI 处理程序也非常有用,其中有几个 UI 对象(菜单项、工具栏按钮等) 可以基于相同的条件启用/禁用/检查/等(因此可以将它们分组并为所有处理程序设置一个处理程序,每个处理程序对应一个处理程序)。
编辑:也许我错了,如果问题只是关于未解决的外部问题,OnSignButton() 是作为 CTabTwo 的成员实现的吗?如果您发布的实现(代码)在类声明之外,那么它不是。将其声明为 void CTabTwo::OnSignButton(UINT ID)...
【讨论】:
【参考方案4】:刚好看到这个帖子。 这是另一种方法吗? 使用虚函数 OnCommand。
BOOL CKeyboard::OnCommand(WPARAM wParam, LPARAM lParam)
// TODO: Add your specialized code here and/or call the base class
//
if (HIWORD(wParam)==BN_CLICKED)
switch(LOWORD(wParam))
case IDC_BUTTON1:
break;
case IDC_BUTTON2:
break;
case IDC_BUTTON3:
break;
return CView::OnCommand(wParam, lParam);
【讨论】:
以上是关于如何为 MFC 中的多个按钮编写一个消息处理程序?的主要内容,如果未能解决你的问题,请参考以下文章