MFC:在ON_COMMAND函数混淆?

好吧,这是这个function

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

因此,在这里,CurrentMessage的wParam的LOWORD应该包含消息的ID,没关系,但是m_nCurrentColor = nID _ ID_COLOR_RED是什么意思; 手段? 对于红色,绿色或蓝色,m_nCurrentColor可以分别为0,1或2 …
所以首先我们在第一个语句中将消息ID转换为UINT,但是我们在第二个函数中使用m_nCurrentColor = nID _ID_COLOR_RED来做什么?
谁能解释一下吗?

Solutions Collecting From Web of "MFC:在ON_COMMAND函数混淆?"

我不知道代码做什么。 主要是因为m_nCurrentColor = nID _ ID_COLOR_RED不会编译。 你在nIDID_COLOR_RED之间有一个下划线( _ )。 这对编译器没有任何意义。 你的意思是输入一个减号( - ),而不是?

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

  • id ,这是命令ID
  • memberFxn ,这是命令映射到的message- memberFxn函数的名称

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

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

我无法从你的问题中ID_COLOR_RED哪一个ID_COLOR_RED (及其同胞)对应于这个问题。
但这并不重要。 无论哪种方式,它看起来像代码试图设置一个成员变量( m_nCurrentColor ),跟踪用户当前选择的颜色,基于发送最后通知的项目的ID。 如果我们假设这是一个号,那么事情就会开始变得有点焦点:

代码正在做的是获取发送消息的项目的ID( nID ),并从中减去该组中的第一个值( 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。

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

对于你的例子,我将使用ON_COMMAND_EX宏与链接功能内的switch(nID) 。 如果某个选项的ID最终改变了,你不会担心。