我有一些按钮,我想为所有按钮编写一个消息处理程序。有什么方法可以找出点击了哪个按钮?在 C# 中,有一个参数(发送者),MFC 有类似的东西吗?还是我必须为所有按钮单独编写相同的消息处理程序?
4 回答
最好的选择可能是给所有按钮连续的 ID 号,然后使用 ON_COMMAND_RANGE(FIRST_BUTTON_ID, LAST_BUTTON_ID, HandlerFunction)。然后 HandlerFunction 将采用 UINT nID ,这将是调用处理程序的按钮的 ID 号。更多信息在这里
对于典型的 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。
如果我正确理解了这个问题,这很简单:在属性编辑器中分配 OnCommand 事件时,不要再次单击(并让向导添加另一个消息处理程序,而是选择现有处理程序之一。如果你不能做到这一点工作(不知道你的VStudio版本和设置),你可以手动做:正常创建新的处理程序,保存,然后进入.cpp和.h文件,删除类头中的声明和实现.cpp 文件,转到消息映射并更改 ON_COMMAND 条目,以便它使用现有(旧/通用)处理程序。对于 ON_UPDATE_UI 处理程序也非常有用,其中可能存在多个 UI 对象(菜单项、工具栏按钮等)基于相同条件启用/禁用/检查/等(因此可以对它们进行分组并为所有处理程序提供一个处理程序,instrad 每个处理程序一个处理程序)。
编辑:也许我错了,如果问题只是关于未解决的外部问题,OnSignButton() 是作为 CTabTwo 的成员实现的吗?如果您发布的实现(代码)在类声明之外,那么它不是。将其声明为 void CTabTwo::OnSignButton(UINT ID)...
刚好看到这个帖子。这是另一种方法吗?使用虚函数 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);
}