MFC: ON_COMMAND函数中的混淆

MFC: Confusion in an ON_COMMAND function?

本文关键字:函数 COMMAND ON MFC      更新时间:2023-10-16

好了,这就是这个函数

<>之前..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应该包含消息的ID,这是可以的,但是m_nCurrentColor = nid_ ID_COLOR_RED;意味着什么?m_nCurrentColor可以分别为0、1或2表示红色、绿色或蓝色。
所以首先我们在第一个语句中将消息的ID转换为UINT,但是我们在第二个语句中用m_nCurrentColor = nid_ ID_COLOR_RED尝试做什么?
有人能解释一下吗?

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


但更普遍的是,ON_COMMAND宏用于处理WM_COMMAND消息。宏接受两个参数:

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

看起来你已经准备好了。所有三个命令id(红色、绿色和蓝色)都由同一个OnColor函数处理。


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

我真的不能从你的问题中分辨出那些ID_COLOR_RED(和它的兄弟)对应于哪个。
但这并不重要。无论哪种方式,它看起来就像代码试图设置一个成员变量(m_nCurrentColor),该成员变量根据发送最后一次通知的项目的ID跟踪用户当前选择的颜色。如果我们假设这是一个减去符号,事情就开始变得清晰了:

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

如果ID_COLOR_RED, ID_COLOR_GREENID_COLOR_BLUE的值是顺序(这是一个很大的 If ,这是你不应该这样写代码的一个很好的理由),那么如果nID = ID_COLOR_GREEN, m_nCurrentColor将是1。同理,如果nID = ID_COLOR_BLUE,则m_nCurrentColor = 2。

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

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