2012-07-21 37 views

回答

5

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

2

对于典型的WM_COMMAND消息,消息的lParam成员应该保存发件人的HWND - 如果发件人是窗口。正如@Redeye所回答的那样,你可以将所有的按钮放在一个范围内,并在消息表和一个OnCommand(UINT nCmd)(或者任何你命名的)中写入一个ON_COMMAND_RANGE()条目作为窗口,对话框,视图的成员函数,框架或文档类。按钮不一定必须在一个范围内。您可以将每个按钮ID的单个条目作为ON_COMMAND_RANGE(IDC_BUTTON1, IDC_BUTTON1) - 或任何标识符。 Thjust ere对于那个宏来说并不是一个规则,即开始和结束范围必须不同。你可以编写自己的消息破解宏,它基本上做ON_COMMAND_RANGE()所做的事情,但只需要一个条目。

您也可以在您的处理程序中调用CWnd :: GetCurrentMessage(),并在处理程序中将其检索以检索该命令。消息的wParam成员的LOWORD持有控制标识符。消息的lParam成员拥有发送控件HWND - 如果它是一个窗口。对于类似于工具栏的东西,工具栏按钮不是真正的按钮,而是由工具栏绘制,这样lParam将始终是工具栏的HWND。

1

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

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

+0

感谢康斯坦丁为你的答案,你救了我,我不是为什么我犯了这个错误!非常感谢。 – 2012-07-23 12:17:38

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); 
} 
相关问题