好的,所以这是这个功能
. . 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做什么?
有人可以解释一下吗?
答案 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的文档。它说wParam
和lParam
参数的含义取决于消息的来源。它们具有不同的含义,具体取决于用户是从菜单中选择项目,键入加速键击,还是控件正在向其父窗口发送通知消息。
我无法从你的问题中确切地告诉我们ID_COLOR_RED
(及其兄弟)中的哪一个对应。
但这并不重要。无论哪种方式,看起来像,就像代码试图设置一个成员变量(m_nCurrentColor
)一样,根据项目的ID跟踪用户当前选择的颜色发送了最后一个通知。如果我们假设这是减去符号,那么事情就会开始变得更加突出:
代码正在做的是获取发送消息的项目的ID(nID
),并从中减去中的 first 值(ID_COLOR_RED
)。这意味着如果nID
= ID_COLOR_RED
,则m_nCurrentColor
将为0。
如果ID_COLOR_RED
,ID_COLOR_GREEN
和ID_COLOR_BLUE
的值顺序(这是一个很大的,如果,很好的理由为什么你不应该写这样的代码),那么如果nID
= ID_COLOR_GREEN
,m_nCurrentColor
将是1.同样,如果nID
= ID_COLOR_BLUE
,然后m_nCurrentColor
将是2。
答案 1 :(得分:0)
这个答案是我对这个问题的评论的延续。
对于您的示例,我将在链接函数中使用ON_COMMAND_EX
宏和switch(nID)
。如果某个选项的ID最终改变,你不会担心。