在 My_ResⅥ ew.cpp文件中,读者会看到 D OPER SHOW 对应的 COMMAND消息的绑定,代码如下: BEGIN_MESSAGE_ MAP(CMy_Resview, CView) IKAFX_MSG_ MAP(CMy_Res view) ON_COMMAND(D_OPER_ SHOW, OnOperShow) MNJAFX_MSG_ MAP Standard printing commands ON_COMMAND(D_FILE_PRINT, CView: OnFilePrint ON_COMMAND(D_FILE_PRINT_DIRECT, CView: On FilePrint ON_COMMAND(D_FILE_PRINT_PREVIEW, CView: On FilePrintPreview) END_MESSAGE_MAPO 在My_ Res view. cp文件的最后加入如下代码: void CMy_Res view: OnOper ShowO im_ ashow=Im_ sHow, 重新编译运行程 validate0;∥强制程序重新象口 序,可看到“显 示”菜单项工作
11 在My_ResView.cpp文件中,读者会看到ID_OPER_SHOW 对应的COMMAND消息的绑定,代码如下 : BEGIN_MESSAGE_MAP(CMy_ResView, CView) //{{AFX_MSG_MAP(CMy_ResView) ON_COMMAND(ID_OPER_SHOW, OnOperShow) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() 在My_ResView.cpp文件的最后加入如下代码: void CMy_ResView::OnOperShow() {m_bShow = !m_bShow; Invalidate(); // 强制程序重新窗口 } 重新编译运行程 序,可看到“显 示”菜单项工作 正常
(2) UP DATE COMMAND U消息的响应 UPDATE COMMAND U消息是在窗口将要绘制菜单项的时 候产生,上例中,仅仅只是使用“显示”菜单项来控制是否显 示似乎还不够,如果“显示”菜单项能够配合主程序体现出当 前是否显示的状态可能会更好一些。就像一个文本编辑软件, 菜单上是“10号字”、“12号字”的功能,如果不在菜单上标 识出来,那么使用者可能就搞不清当前的字是多大的。 为|D_ OPER SHOW添加 UPDATE COMMAND U消息。在自动生 成消息处理函数中加入如下代码: void CMy_Res view: OnUpdate Oper Show(CCmdUI* pCmdun pCmdUl-> SetCheck(m_bShow/), 此时可看到随着 m show的值的改变,显示菜单项的状 态与实际是否显示字符串的状态一致了,通过菜单项前面的 “√”标记来体现
12 (2) UPDATE_COMMAND_UI消息的响应 UPDATE_COMMAND_UI消息是在窗口将要绘制菜单项的时 候产生,上例中,仅仅只是使用“显示”菜单项来控制是否显 示似乎还不够,如果“显示”菜单项能够配合主程序体现出当 前是否显示的状态可能会更好一些。就像一个文本编辑软件, 菜单上是“10号字”、“12号字”的功能,如果不在菜单上标 识出来,那么使用者可能就搞不清当前的字是多大的。 为ID_OPER_SHOW添加UPDATE_COMMAND_UI消息。在自动生 成消息处理函数中加入如下代码: void CMy_ResView::OnUpdateOperShow(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bShow); } 此时可看到随着m_bShow的值的改变,显示菜单项的状 态与实际是否显示字符串的状态一致了,通过菜单项前面的 “√”标记来体现
void Enable( Bool bon= TRUE) 禁止或者允许该菜单项 void SetCheck( int n Check=1) 设置菜单项压工具条按钮的 check状态,显示标志为“√” void SetRadio( bool bon=TRUE 与 Setcheck功能类似,显示标志为“” void SetText( LPCTSTR lpszText 设置菜单项的 Caption属性 COmdt类常 用的方法
13 void Enable( BOOL bOn = TRUE ) 禁止或者允许该菜单项 void SetCheck( int nCheck = 1 ) 设置菜单项/工具条按钮的check状态,显示标志为“√” void SetRadio( BOOL bOn = TRUE ) 与SetCheck功能类似,显示标志为“·” void SetText( LPCTSTR lpszText ) 设置菜单项的Caption属性 CCmdUI类常 用的方法
(3)0 N COMMAND RANGE对 COMMAND消息的响应 ON COMMAND RANGE为处理具有连续 Object ID的菜 单项提供了方便的途径。 前面只响应了三种颜色操作,若有100种颜色可供 选择,是否逐个定义其响应函数?显然工作量很大, 我们可以使用 ON COMMAND RANGE。 这涉及到D范围的上下界及当前的ID,若 Resource. h 中若干个D不连续,要手工修改为连续的。 由于 ClassWizard不支持0 N COMMAND RANGE消 息的自动映射,只能手工添加消息的处理 在 My_Res view. h中声明消息的处理函数 IKAFX MSG(CMy_Resview) afx_msg void OnOperShow0 afx_msg void OnUpdateOper Show(CCmdUI pCmdul afx_msg void On Oper Color Change WORD nID) INJAFX_ MSG 所处理的菜单项的ID
14 (3) ON_COMMAND_RANGE对COMMAND消息的响应 ON_COMMAND_RANGE为处理具有连续Object ID的菜 单项提供了方便的途径。 前面只响应了三种颜色操作,若有100种颜色可供 选择,是否逐个定义其响应函数?显然工作量很大, 我们可以使用ON_COMMAND_RANGE。 这涉及到ID范围的上下界及当前的ID,若Resource.h 中若干个ID不连续,要手工修改为连续的。 由于ClassWizard不支持ON_COMMAND_RANGE消 息的自动映射,只能手工添加消息的处理。 在My_ResView.h中声明消息的处理函数 //{{AFX_MSG(CMy_ResView) afx_msg void OnOperShow(); afx_msg void OnUpdateOperShow(CCmdUI* pCmdUI); afx_msg void OnOperColorChange(WORD nID); //}}AFX_MSG 所处理的菜单项的ID
在 My_Review. cpp的开头部分加入如下斜体标识的代码, 完成消息映射 BEGIN_MESSAGE_ MAP(CMy_Resview, CView) ON_COMMAND_ RANGE( D OPER RED,∥D范围的最小值 D OPER BLUE,∥D范围的最大值 On Oper Change)//消息处理函数 END_MESSAGE_MAPO 在 My_Res view. cpp的最后加入消息处理函数: void CMy_ Resview: OnOper Color Change WORD nID) m coloriNdex= n/ D-D OPER RED Invalidate: 1 运行程序,可以通过菜单项来改变颜色了15
15 在My_ResView.cpp的开头部分加入如下斜体标识的代码, 完成消息映射 BEGIN_MESSAGE_MAP(CMy_ResView, CView) //{{…… ON_COMMAND_RANGE( ID_OPER_RED, // ID范围的最小值 ID_OPER_BLUE, // ID范围的最大值 OnOperColorChange) //消息处理函数 END_MESSAGE_MAP() 在My_ResView.cpp的最后加入消息处理函数: void CMy_ResView::OnOperColorChange(WORD nID) { m_nColorIndex = nID-ID_OPER_RED; Invalidate(); } 运行程序,可以通过菜单项来改变颜色了