如何为MFC中的多个按钮编写一个消息处理程序?

时间:2012-07-21 17:54:21

标签: visual-c++ mfc

我有一些按钮,我想为所有这些按钮编写一个消息处理程序。有没有办法找出点击了哪个按钮?在C#中,有一个参数(发送者),MFC有类似的东西吗?或者我是否必须为所有按钮单独编写相同的消息处理程序?

4 个答案:

答案 0 :(得分:6)

最好的选择可能是给所有按钮连续的ID号然后使用ON_COMMAND_RANGE(FIRST_BUTTON_ID,LAST_BUTTON_ID,HandlerFunction)。然后HandlerFunction将获取一个UINT nID,它将是调用处理程序的按钮的ID号。更多信息here

答案 1 :(得分: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。

答案 2 :(得分:1)

如果我正确理解了这个问题,那很简单:在属性编辑器中分配OnCommand事件时,不要再次单击(让向导添加另一个消息处理程序,而是选择一个现有的处理程序。如果可以的话不要让它工作(不知道你的VStudio版本和设置),你可以手动完成:正常创建新的处理程序,保存,然后到.cpp和.h文件,删除类头中的声明和在.cpp文件中的实现,转到消息映射并更改ON_COMMAND条目,以便它使用现有的(旧/通用)处理程序。对于ON_UPDATE_UI处理程序也很有用,其中有几个UI对象(菜单项,工具栏按钮等) )可以根据相同的条件启用/禁用/检查/等等(因此可以对它们进行分组,并为每个处理器设置一个处理程序,每个处理程序的instrad为一个)。

编辑:也许我错了,如果问题只是关于未解决的外部问题,那么OnSignButton()是作为CTabTwo的成员实现的吗?如果您发布的实现(代码)在类声明之外,那么它不是。将其声明为void CTabTwo :: OnSignButton(UINT ID)...

答案 3 :(得分:0)

恰好看到这篇文章。 这是另一种方法吗? 使用虚函数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); 
}