首页 > 代码库 > MFC菜单、工具栏和状态栏
MFC菜单、工具栏和状态栏
菜单:CMenu类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | CMenu类的主要成员函数 BOOL LoadMenu( UINT nIDResource); 加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,否则返回FALSE。 BOOL DeleteMenu( UINT nPosition, UINT nFlags); 在菜单中删除一个菜单项。参数nPosition指定要删除的菜单项。参数nFlags就用来解释nPosition的意义,为MF_BYCOMMAND时说明nPosition表示菜单项的ID,为MF_BYPOSITION时说明nPosition表示菜单项的位置,第一个菜单项的位置为0。如果删除菜单项成功则返回TRUE,否则返回FALSE。 BOOL TrackPopupMenu( UINT nFlags, int x, int y,CWnd* pWnd,LPCRECT lpRect = 0); 用来在指定位置显示一个浮动的弹出式菜单。参数nFlags指定屏幕坐标和鼠标位置的标志,可以是以下取值: TPM_CENTERALIGN:菜单在水平方向上相对于参数x指定的坐标值居中显示 TPM_LEFTALIGN:菜单的左侧与参数x指定的坐标值对齐 TPM_RIGHTALIGN:菜单的右侧与参数x指定的坐标值对齐 TPM_BOTTOMALIGN:菜单的底部与参数y指定的坐标值对齐 TPM_TOPALIGN:菜单项的顶部与参数y指定的坐标值对齐 TPM_VCENTERALIGN:菜单在垂直方向上相对于参数y指定的坐标值居中显示 这里先介绍这几个比较常用的,其他可参见MSDN。参数x指定弹出式菜单的水平方向的屏幕坐标,参数y指定菜单顶部垂直方向上的屏幕坐标,参数pWnd指明哪个窗口拥有此弹出式菜单,不能为NULL,参数lpRect忽略。 UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck); 在弹出菜单中为菜单项增加选中标记或移除选中标记。参数nIDCheckItem指定要选中或取消选中的菜单项。参数nCheck指定菜单项的选中状态和如何根据nIDCheckItem确定菜单项的位置,可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOMMAND的组合,这几个标志的含义如下: MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID MF_BYPOSITION:说明参数nIDCheckItem表示菜单项的位置,第一个菜单项的位置是0 MF_CHECKED:为菜单项添加选中标记 MF_UNCHECKED:为菜单项移除选中标记 该函数返回菜单项之前的状态:MF_CHECKED或MF_UNCHECKED, 如果菜单项不存在则返回0xFFFFFFFF。 UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable); 激活、禁用菜单项或使其变灰。参数nIDEnableItem指定要激活、禁用或变灰的菜单项。参数nEnable指定操作的类型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED与MF_BYCOMMAND或MF_BYPOSITION的组合,这些值的含义如下: MF_BYCOMMAND:同CheckMenuItem MF_BYPOSITION:同CheckMenuItem MF_DISABLED:禁用菜单项,使其不能被选择但不变灰 MF_ENABLED:激活菜单项,使其能够被选择并由变灰状态恢复 MF_GRAYED:禁用菜单项,使其不能被选择并变灰 该函数返回菜单项之前的状态:MF_DISABLED、MF_ENABLED或MF_GRAYED CMenu* GetSubMenu( int nPos) const ; 获取弹出菜单的CMenu对象。参数nPos指定弹出菜单在菜单中的位置,不能使用ID。返回值是CMenu对象的指针,该CMenu对象的m_hMenu成员为由nPos指定的弹出菜单的句柄,如果不存在这样的CMenu对象则返回NULL,然后创建一个临时弹出菜单。 |
1 2 3 4 5 6 7 | 菜单消息 菜单主要能发送两种消息:<strong>COMMAND</strong>消息和<strong>UPDATE_COMMAND_UI</strong>消息。下面分别讲解: COMMAND消息:在菜单项被点击时发送该消息。 UPDATE_COMMAND_UI消息:用来维护菜单项的各项状态,包括激活、禁用、变灰、选中、未选中等。在下拉菜单每次打开的时候,所有菜单项的此消息都会被发送出去。如果所属类中为菜单项的该消息添加了处理函数,则执行相应函数更新菜单状态,如果菜单项没有此消息处理函数,也没有COMMAND消息的处理函数,那么它就会变灰。 |
1 | |
工具栏:CToolBar类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | CToolBar类的主要成员函数: virtual BOOL CreateEx( CWnd* pParentWnd, DWORD dwCtrlStyle = TBSTYLE_FLAT, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP, CRect rcBorders = CRect(0, 0, 0, 0), UINT nID = AFX_IDW_TOOLBAR ); 创建工具栏对象。参数pParentWnd为工具栏父窗口的指针。参数dwCtrlStyle为工具栏按钮的风格,默认为TBSTYLE_FLAT,即“平面的”。参数dwStyle为工具栏的风格,默认取值WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,由于是主框架窗口的子窗口,所以要有WS_CHILD和WS_VISIBLE风格,CBRS_ALIGN_TOP风格表示工具栏位于父窗口的顶部, 各种风格可以参见MSDN的Toolbar Control and Button Styles中的定义。参数rcBorders为工具栏边框各个方向的宽度,默认为CRect(0, 0, 0, 0),即没有边框。参数nID为工具栏子窗口的ID,默认为AFX_IDW_TOOLBAR。 BOOL LoadBitmap( UINT nIDResource); 为工具栏加载位图。参数nIDResource为位图资源的ID。成功则返回TRUE,否则返回FALSE。注意,这里的位图资源应当为每个工具栏按钮都提供位图,如果图片不是标准大小(16像素宽,15像素高),则需要调用SetSizes成员函数调整按钮大小和图片大小。 BOOL LoadToolBar( UINT nIDResource); 加载由nIDResource指定的工具栏。参数nIDResource为要加载的工具栏的资源ID。成功则返回TRUE,否则返回FALSE。 void SetSizes(SIZE sizeButton,SIZE sizeImage); 设置工具栏按钮的大小和图片的大小。参数sizeButton为工具栏按钮的像素大小。参数sizeImage为图片的像素大小。 void SetButtonStyle( int nIndex, UINT nStyle); 设置工具栏按钮或分隔线的风格,或者为按钮分组。参数nIndex为将要进行设置的按钮或分隔线的索引。参数nStyle为按钮风格,可以是以下取值: TBBS_BUTTON 标准按钮(默认) TBBS_SEPARATOR 分隔条 TBBS_CHECKBOX 复选框 TBBS_GROUP 标记一组按钮的开始 TBBS_CHECKGROUP 标记一组复选框的开始 TBBS_DROPDOWN 创建下拉列表按钮 TBBS_AUTOSIZE 按钮的宽度根据按钮文本计算,而不基于图片大小 TBBS_NOPREFIX 按钮的文本没有快捷键前缀 UINT GetButtonStyle( int nIndex) const ; 获取工具栏按钮或分隔条的风格。风格可参考SetButtonStyle。参数nIndex为按钮或分隔条的索引。 BOOL SetButtonText( int nIndex, LPCTSTR lpszText); 设置工具栏按钮的文本。参数nIndex为工具栏按钮的索引。参数lpszText为指向要设置的文本字符串的指针。设置成功则返回TRUE,否则返回FALSE。 CString GetButtonText( int nIndex) const ; 获取工具栏按钮上显示的文本。参数nIndex为工具栏按钮的索引。 |
1 | |
工具栏的创建
1. 创建工具栏资源。
2. 构造CMFCToolBar类的对象。
3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。
4. 调用LoadToolBar成员函数加载工具栏资源。
工具栏的停靠
工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):
1. 在框架窗口中启用停靠。
若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:
1 | BOOL EnableDocking( DWORD dwDockStyle); |
该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。
2. 工具栏启用停靠。
框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:
1 | virtual void EnableDocking( DWORD dwAlignment); |
允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。
3. 停靠工具栏。
当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:
1 | void DockPane(CBasePane* pBar, UINT nDockBarID=0,LPCRECT lpRect=NULL); |
参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。
1 | |
状态栏:CStatusBar类
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | CStatusBar类几个主要的成员函数: virtual BOOL Create(CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR); 创建一个状态栏。参数pParentWnd为状态栏父窗口的指针,参数dwStyle为状态栏的风格,除了标准的Windows风格外,它还支持: CBRS_TOP:位于框架窗口的顶部。 CBRS_BOTTOM:位于框架窗口的底部。 CBRS_NOALIGN:父窗口大小改变时状态栏不会被重新定位。 参数nID指定状态栏的ID。 BOOL SetIndicators( const UINT * lpIDArray, int nIDCount); 为每个指示器设置显示文本,具体来说,就是用lpIDArray数组中的对应元素为每个指示器设置一个ID,然后加载每个ID代表的字符串,设置为这些指示器的显示文本。参数lpIDArray为指向一个ID数组的指针,参数nIDCount为lpIDArray数组的元素个数。 UINT GetItemID( int nIndex) const ; 获取由nIndex指定的指示器的ID。参数nIndex为要获取ID的指示器索引。 CString GetPaneText( int nIndex) const ; 获取状态栏窗格中显示的文本。参数nIndex为要获取文本的窗格的索引。返回值为包含窗格文本的CString对象。 BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE); 设置状态栏窗格的显示文本。参数nIndex为要设置文本的窗格的索引,参数lpszNewText为指向新的窗格文本的指针,参数bUpdate表示是否设置后立即更新显示。如果设置成功则返回TRUE,否则返回FALSE。 |
状态栏的创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 1. 构造一个CMFCStatusBar类的对象。 在MainFrm.h文件中,为CMainFrame类定义了一个成员对象:CMFCStatusBar m_wndStatusBar;。 2. 调用CMFCStatusBar::Create函数来创建状态栏窗口。 在CMainFrame::OnCreate函数的实现中,我们可以找到CMFCStatusBar::Create函数的调用: if (!m_wndStatusBar.Create( this )) { TRACE0( "Failed to create status bar\n" ); return -1; // fail to create } 3. 调用CMFCStatusBar::SetIndicators函数为状态栏划分窗格,并为每个指示器设置显示文本。 CMFCStatusBar::SetIndicators函数需要一个ID数组的参数,在MainFrm.cpp中,如下定义了一个窗格ID的数组: static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; indicators数组定义了状态栏窗格的划分信息。第一个元素一般为ID_SEPARATOR,对应的窗格用来显示命令提示信息,上面数组中的后三项为指示器文本的字符串ID,可以根据这些ID在String Table字符串资源中找到相应的字符串,查找方法是,在Resource View资源视图中,打开String Table字符串资源,可以看到有ID、Value和Caption三列,在ID列中找到需要的ID,对应的Caption列文本就是要查找的字符串。ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL对应的字符串分别是CAP、NUM、SCRL,对应的三个窗格分别为Caps Lock指示器、Num Lock指示器和Scroll Lock指示器。 定义了指示器数组就可以使用CMFCStatusBar::SetIndicators函数为状态栏划分窗格了,依然是在CMainFrame::OnCreate函数中调用: m_wndStatusBar.SetIndicators(indicators, sizeof (indicators)/ sizeof ( UINT )); 这样状态栏就创建完成了,之后我们可以通过CMFCStatusBar::SetPaneText设置窗格的文本。 |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |