MFC:ON_COMMAND函数混乱?

时间:2011-04-29 13:30:57

标签: c++ windows visual-studio-2010 winapi mfc

好的,所以这是这个功能

 
.
.
ON_COMMAND (ID_COLOR_RED, OnColor)
ON_COMMAND (ID_COLOR_GREEN, OnColor) 
ON_COMMAND (ID_COLOR_BLUE, OnColor)
.
.
. 
void CMainWindow::OnColor ()
{
    UINT nID = (UINT) LOWORD (GetCurrentMessage ()->wParam);
    m_nCurrentColor = nID _ ID_COLOR_RED;
}

所以,在这里,CurrentMessage的wParam的LOWORD应该包含Message的ID,这没关系,但m_nCurrentColor = nID _ ID_COLOR_RED是什么;手段? m_nCurrentColor可分别为0,1或2,分别为红色,绿色或蓝色......
所以首先我们在第一个语句中将Message的ID转换为UINT,但是我们在第二个语句中尝试用m_nCurrentColor = nID _ ID_COLOR_RED做什么? 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

我不知道该代码的作用是什么。主要是因为m_nCurrentColor = nID _ ID_COLOR_RED无法编译。您在_nID之间有一个下划线(ID_COLOR_RED)。这对编译器没有任何意义。您的意思是键入减号(-),而不是?


但更一般地说,ON_COMMAND macro用于处理WM_COMMAND条消息。宏有两个参数:

  • id,这是命令ID
  • memberFxn,这是命令映射到的消息处理函数的名称

看起来你已经完成了所有设置。所有三个命令ID(红色,绿色和蓝色)都由相同的OnColor函数处理。


那么让我们看一下WM_COMMAND message的文档。它说wParamlParam参数的含义取决于消息的来源。它们具有不同的含义,具体取决于用户是从菜单中选择项目,键入加速键击,还是控件正在向其父窗口发送通知消息。

我无法从你的问题中确切地告诉我们ID_COLOR_RED(及其兄弟)中的哪一个对应。
但这并不重要。无论哪种方式,看起来像,就像代码试图设置一个成员变量(m_nCurrentColor)一样,根据项目的ID跟踪用户当前选择的颜色发送了最后一个通知。如果我们假设这是减去符号,那么事情就会开始变得更加突出:

代码正在做的是获取发送消息的项目的ID(nID),并从中减去中的 first 值(ID_COLOR_RED )。这意味着如果nID = ID_COLOR_RED,则m_nCurrentColor将为0。

如果ID_COLOR_REDID_COLOR_GREENID_COLOR_BLUE的值顺序(这是一个很大的,如果,很好的理由为什么你不应该写这样的代码),那么如果nID = ID_COLOR_GREENm_nCurrentColor将是1.同样,如果nID = ID_COLOR_BLUE ,然后m_nCurrentColor将是2。

答案 1 :(得分:0)

这个答案是我对这个问题的评论的延续。

对于您的示例,我将在链接函数中使用ON_COMMAND_EX宏和switch(nID)。如果某个选项的ID最终改变,你不会担心。