好了,这就是这个函数
<>之前..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
无法编译。在nID
和ID_COLOR_RED
之间有一个下划线(_
)。这对编译器来说没有任何意义。你的意思是输入一个减号(-
),而不是?
但更普遍的是,ON_COMMAND
宏用于处理WM_COMMAND
消息。宏接受两个参数:
-
id
,即命令ID -
memberFxn
,这是命令映射到的消息处理函数的名称
看起来你已经准备好了。所有三个命令id(红色、绿色和蓝色)都由同一个OnColor
函数处理。
因此,让我们看一下WM_COMMAND
消息的文档。它说wParam
和lParam
参数的含义取决于消息的来源。它们具有不同的含义,取决于用户是从菜单中选择项、键入加速键还是控件正在向其父窗口发送通知消息。
我真的不能从你的问题中分辨出那些ID_COLOR_RED
(和它的兄弟)对应于哪个。
但这并不重要。无论哪种方式,它看起来就像代码试图设置一个成员变量(m_nCurrentColor
),该成员变量根据发送最后一次通知的项目的ID跟踪用户当前选择的颜色。如果我们假设这是一个减去符号,事情就开始变得清晰了:
代码正在做的是获取发送消息的项目的ID (nID
),并从中减去集合中的第一个值(ID_COLOR_RED
)。这意味着如果nID
= ID_COLOR_RED
,那么m_nCurrentColor
将为0。
如果ID_COLOR_RED
, ID_COLOR_GREEN
和ID_COLOR_BLUE
的值是顺序(这是一个很大的 If ,这是你不应该这样写代码的一个很好的理由),那么如果nID
= ID_COLOR_GREEN
, m_nCurrentColor
将是1。同理,如果nID
= ID_COLOR_BLUE
,则m_nCurrentColor
= 2。
这个回答是我对这个问题的评论的延续。
对于您的示例,我将在链接函数内使用ON_COMMAND_EX
宏和switch(nID)
。如果某个选项的ID最终改变了,您就不必担心了。