window第4章菜单、工具栏和状态栏.ppt
《window第4章菜单、工具栏和状态栏.ppt》由会员分享,可在线阅读,更多相关《window第4章菜单、工具栏和状态栏.ppt(51页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、4.1菜单菜单 菜单是一系列命令的列表,通过选中其中的菜单项(命令)来执行相应任务。菜单系统的设计规则: 菜单项文本后有“”, 将弹出一个对话框。 若某项菜单有子菜单,那么在该菜单项文本后有“”。 助记符,则用括号将带下划线的字母括起来。助记符与Alt构成一个组合键。 若某项菜单需要快捷键的支持,则一般将其列在相应菜单项文本之后。所谓“快捷键”是一个组合键,如Ctrl+N。顶层菜单顶层菜单,每一个顶层菜单项可以是一个简单的菜单命令,也可以是下拉下拉(Popup)菜单。4.1菜单菜单表表4.1 菜单菜单General属性对话框的各项含义属性对话框的各项含义 4.1.2 使用键盘快捷键(Accel
2、erator) 加速键加速键也往往被称为键盘快捷键键盘快捷键,一个加速键就是一个按键或几个按键的组合,它用于激活特定的命令。加速键也是一种资源,它的显示、编辑过程和菜单相似。4.1菜单菜单void CMainFrame:OnTestReturn() m_NewMenu.Detach();/ 使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu( IDR_MAINFRAME ); SetMenu(NULL); / 清除应用程序菜单 SetMenu( &m_NewMenu ); / 设置应用程序菜单 LoadMenu和Detach都是CMenu类成员函数.在调用LoadMenu后,菜单对
3、象m_NewMenu就拥有一个菜单句柄,当再次调用LoadMenu时,由于菜单对象的句柄已经创建,因而会发生运行时错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。SetMenu是CWnd类的一个成员函数,用来设置应用程序的菜单。4.1菜单菜单 4.1.4 菜单的编程控制 1. 创建菜单创建菜单 CMenu类的CreateMenu和CreatePopupMenu分别用来创建一个菜单或子菜单框架,它们的原型如下: BOOL CreateMenu( ); / 产生一个空菜单 BOOL CreatePopupMenu( );/ 产生一个空的弹出式子菜单 2. 装入菜单装入菜单 将菜单从资源装
4、入应用程序中,需调用CMenu成员函数LoadMenu,或者用SetMenu对应用程序菜单进行重新设置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); lpszResourceName为菜单资源名称为菜单资源名称 nIDResource为菜单资源为菜单资源ID标识符。标识符。 3. 添加菜单项添加菜单项 AppendMenu或InsertMenu函数来添加一些菜单项。AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依
5、次下移。 BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL ); BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UI
6、NT nIDNewItem, const CBitmap* pBmp ); 其中,nIDNewItem表示新菜单项的资源ID标识符,lpszNewItem表示新菜单项的内容,pBmp用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息,它的值影响其他参数的含义,如表4.3所示。表表4.3 nFlags的值及其对其他参数的影响的值及其对其他参数的影响4.1菜单菜单 需要注意的是: 当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。
7、 nFlags的标志中,可以用“|”(按位或)来组合,例如MF_CHECKED|MF_STRING等。但有些组合是不允许的。 当菜单项增加、改变或删除后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。 4. 删除菜单项删除菜单项 BOOL DeleteMenu( UINT nPosition, UINT nFlags ); 其中,参数nPosition表示要删除的菜单项位置,它由nFlags进行说明。nFlags为为MF_BYCOMMAND或者或者 MF_BYPOSITION。 另外一个函数:另外一个函数:RemoveMenu();4.1菜单菜单5. 获取菜单
8、项获取菜单项 CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式子菜单的句柄。 UINT GetMenuItemCount( ) const; 该函数用来获得菜单的菜单项数,调用失败后返回-1。 UINT GetMenuItemID( int nPos ) const; 该函数用来获得由nPos指定菜单项位置(以0为基数)的菜单项的标识号,若nPos是SEPARATOR(分隔符),则返回-1。 CMenu* GetSubMenu( int nPos ) const; 该函数用来获得指定菜单的弹出式菜单的菜单句柄。该弹出式菜单位置由参数nPos指定,开始的位置为0。若菜单不存在,
9、则创建一个临时的菜单指针。 4.1菜单菜单(2)选择)选择“查看查看”“资源符号资源符号”(Resource Symbols)命令,)命令,弹出弹出“资源符号资源符号”对话框,它能对话框,它能对应用程序中的资源标识符进行对应用程序中的资源标识符进行管理。管理。4.1菜单菜单 (3)“新建符号”(New Symbol)对话框。在“名称”(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在“值”(Value)框中,输入该ID的值,系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。4.1菜单菜单 (4)在CMainFrame:OnCreate函数中添
10、加下列代码,该函数在框架窗口创建时自动调用。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSysMenu = GetMenu();/ 获得程序菜单指针 CMenu* pSubMenu = pSysMenu-GetSubMenu(1); / 获得第二个子菜单的指针 CString strMenuItem(新的菜单项); pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM, strMe
11、nuItem);/ 在子菜单中增加一菜单项 m_bAutoMenuEnable = FALSE; / 关闭自动更新菜单状态,这样避免添加的菜单项是禁用的 pSysMenu- EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/ 激活菜单项 DrawMenuBar();/ 更新菜单 return 0; 4.1菜单菜单(5)此时编译运行后,结果如图4.15所示。但此时选择“新的菜单项”命令不会有反应。图图4.15 程序添加的菜单项程序添加的菜单项 (6)用MFC ClassWizard在CMainFrame添加OnCommand消息函数
12、的重载,并添加下列代码: BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字节表示菜单、控件、加速键的命令ID if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你选中了新的菜单项); return CFrameWnd:OnCommand(wParam, lParam); 4.1菜单菜单4.1.5 使用快捷菜单 快捷菜单快捷菜单是一种浮动的弹出式菜单。 CMenu:TrackPopupMenu函数原型如下:函数原型如下: BOOL TrackPopupMenu(
13、UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 该函数用来显示一个浮动的弹出式菜单,其位置由各参数决定。其中,nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志。x和y表示菜单的水平坐标和菜单的顶端的垂直坐标。pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的 WM_COMMAND消息。lpRect是一个RECT结构或CRect类指针,它表示一个矩形区域, 用户单击这个区域时,弹出菜单不消失。而当lpRect为NULL时,若用户击在菜单外面, 菜单立刻消失。 右击鼠标时会向系统发送WM_CONTEXTMENU通知
14、消息客户区坐标和屏幕坐标 BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );其中其中x,y为为屏幕坐标屏幕坐标鼠标单击点处的坐标是鼠标单击点处的坐标是客户区坐标客户区坐标,即以程序窗口中客,即以程序窗口中客户区左上角为坐标原点。户区左上角为坐标原点。客户区坐标转化为屏幕坐标,函数原型:客户区坐标转化为屏幕坐标,函数原型:void ClientToScreen( LPPOINT lpPoint ) const;void ClientToScreen( LPRECT lpRect
15、) const;举例举例 :void CExView:OnLButtonDown(UINT nFlags, CPoint point) ClientToScreen(&point););4.2工具栏工具栏 4.2.1 使用工具栏编辑器在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项中的IDR_MAINFRAME,则在主界面的右边出现工具栏编辑器。空按钮空按钮图形工具箱图形工具箱颜色工具箱颜色工具箱1 工具条类的层次位置及其常用方法工具条类的层次位置及其常用方法 工具条由工具条由CWnd类类派生的,它们都连派生的,它们都连接到一个接到一个Windows应用程序窗口。因
16、应用程序窗口。因此,此,CWnd的所有的所有功能如创建、移动、功能如创建、移动、显示和隐藏窗口等显示和隐藏窗口等在用控制条工作时在用控制条工作时都是可用的。都是可用的。Create():创建一个工具条并把它附加到:创建一个工具条并把它附加到CToolBar对象上对象上CreateEx():创建一个定义了边界的工具条并附:创建一个定义了边界的工具条并附加到加到CToolBar对象上对象上SetSizes():设置按钮及位图大小:设置按钮及位图大小SetHeight():设置工具条的高度:设置工具条的高度LoadToolBar():装载工具条资源:装载工具条资源LoadBitmap():装载包含工
17、具按钮图像的位图:装载包含工具按钮图像的位图SetBitmap():设置位图图像:设置位图图像SetButtons():设置按钮并使每个按钮与位图图:设置按钮并使每个按钮与位图图像相关像相关CToolBar的方法的方法 4.2工具栏工具栏 创建一个新的工具栏按钮创建一个新的工具栏按钮 移动一个按钮移动一个按钮 删除一个按钮删除一个按钮 将选取中的按钮拖离工具栏,则该按钮就消失。 单击Delete键并不能删除一个按钮,只是将按钮中的图形全部以背景色填充。 在工具栏中插入空格在工具栏中插入空格 工具栏按钮属性的设置工具栏按钮属性的设置 4.2.2 工具按钮和菜单项相结合工具按钮和菜单项相结合工具按
18、钮和菜单项相结合就是指当选择工具按钮或菜单命令时,操作结果是一样的。实现的具体方法是在工具按钮的属性对话框中将按钮的ID号设置为相关联的菜单项ID。(1)增加工具条资源增加工具条资源 Insert Resource Toolbar New插入新的工插入新的工具条资源。具条资源。(2)将工具条添加到窗口中将工具条添加到窗口中添加后,需把工具条的对象加入到应用程序框架添加后,需把工具条的对象加入到应用程序框架窗 口 中窗 口 中 ( C M a i n F r a m e ) 。 在 应 用 程 序 的。 在 应 用 程 序 的CMainFrame类中加入工具条对象类中加入工具条对象m_wndTe
19、stBarprotected:CToolBar m_wndTestBar; /自己定义的工具条自己定义的工具条4.2.3 加入用户自定义的工具条加入用户自定义的工具条 (1)调用工具条类的调用工具条类的Create()或或CreateEx()成员成员函数创建该工具条函数创建该工具条(2)调用调用LoadToolBar()成员函数将工具条对成员函数将工具条对象和前面创建的工具条资源连接在一起。象和前面创建的工具条资源连接在一起。i f ( ! m _ w n d To o l B a r . C r e a t e ( t h i s,W S _ V I S I B L E | C B R S
20、_ T O P ) |!m_wndToolBar.LoadToolBar(IDR_TESTBAR)/ /引 入 资 源引 入 资 源IDR_TESTBARTRACE0(Failed to create toolbarn);return -1; / fail to create3 对工具条进行操作对工具条进行操作 创建完成工具条后,可调用工具条类中的成员函创建完成工具条后,可调用工具条类中的成员函数对工具条进行操作,例如设定工具条风格,在窗口数对工具条进行操作,例如设定工具条风格,在窗口中移动工具条,控制工具条的显隐等。中移动工具条,控制工具条的显隐等。 m_wndTestBar.SetBarS
21、tyle(CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 可在程序中设置允许用户在程序运行中在框架窗口内可在程序中设置允许用户在程序运行中在框架窗口内移动工具条。通过调用移动工具条。通过调用CToolBar:EnableDocking和和CFrame:EnableDocking来实现的。二函数原型均如下:来实现的。二函数原型均如下: void EnableDocking( DWORD dwStyle )4 控制工具条控制工具条的的显示显示CFrameWnd:ShowControlBar函数就是起到这样的作用,有3个参数,第1个参数用来指定要操作
22、的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐藏,第3个参数用来表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。 void CMainFrame:OnViewNewbar() int bShow = m_wndTestBar.IsWindowVisible();ShowControlBar( &m_wndTestBar, !bShow, FALSE); 4.2工具栏工具栏 4.2.3 多个工具栏的使用在用MFC AppWizard创建的文档应用程序中往往只有一个工具栏,但在实际应用中,常常需要多个工具栏。这里以一个实例的形式来讨论多个工具栏的创建、
23、显示和隐藏等操作。 例例Ex_MultiBar 多个工具栏的使用多个工具栏的使用 (1)创建一个默认的单文档应用程序Ex_MultiBar。 (2)将项目工作区切换到ResourceView页面,展开“Toolbar”(工具栏)资源,用鼠标单击IDR_MAINFRAME不松开,然后按下Ctrl键,移动鼠标将IDR_MAINFRAME拖到 Toolbar资源名称上,这样就复制了工具栏默认资源IDR_MAINFRAME,复制后的资源 标识系统自动设为IDR_MAINFRAME1。 (3)右击工具栏资源IDR_MAINFRAME1,从弹出的快捷菜单中选择Properties命令,如图4.20所示,将
24、ID设为IDR_TOOLBAR1。图图4.20 工具栏属性对话框工具栏属性对话框4.2工具栏工具栏 (4)双击IDR_TOOLBAR1,打开工具栏资源,删除几个“编辑”相关的工具按钮(目的是让IDR_TOOLBAR1工具栏与IDR_MAINFRAME有明显区别)。 (5)在CMainFrame类中添加一个成员变量m_wndTestBar,变量类型为CToolBar(CToolBar类封装了工具栏的操作)。 protected: / control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CTo
25、olBar m_wndTestBar; (6)在CMainFrame:OnCreate函数中添加下面的工具栏创建代码: 分析和说明: 代码中,CreateEx是CToolBar类的成员函数,用来创建一个工具栏对象。该函数的第1个参数是用来指定工具栏所在的父窗口指针,this表示当前的CMainFrame类窗口指针。第2个参数用来指针工具按钮的风格,当为TBSTYLE_FLAT时表示工具按钮是“平面”的。第3个参数用来指针工具栏的风格。由于这里的工具栏是CMainFrame的子窗口,因此需要指定WS_CHILD | WS_VISIBLE。CBRS_TOP表示工具栏放置在父窗口的顶部,CBRS_G
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- window 菜单 工具栏 状态栏
限制150内