版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章框架窗口界面设计章框架窗口界面设计 框架窗口框架窗口 菜单菜单 工具栏工具栏 状态栏状态栏 交互对象的动态更新交互对象的动态更新 图标和光标图标和光标 框架窗口框架窗口 单文档和多文档程序框架窗口单文档和多文档程序框架窗口 文档应用程序的文档应用程序的MFC类结构类结构 如图是单文档应用程序Ex_SDI和多文档应用程序Ex_MDI的MFC类结构。 CAboutDlg是每一个应用程序框架都有的,用来显示本程序的有关信息。CEx_SDIApp和CEx_MDIApp是应用程序类,是从CWinApp类派生而来,负责应用程序创立、运行和终止,每一个应用程序都需要这样的类。CEx_SDIDoc和C
2、Ex_MDIDoc是文档类,它们是从CDocument类派生而来,负责应用程序文档数据管理。CEx_SDIView和CEx_MDIView是视图类,它们既可以从基类CView派生,也可以从CView派生类派生,负责数据的显示、绘制和其他用户交互。CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。对于单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于多文档应用程序程序,主框架窗口是从CMDIFrameWnd派生的。 框架窗口框架窗口CChildFrame类是从CMDIChildWnd派生而来,专门用来管理多文档应用程序中的文档窗口
3、。无论是CMDIChildWnd还是CMDIFrameWnd类,它们都是从CFrameWnd派生而来的。对于基于对话框的应用程序,一般有CAboutDlg类、应用程序类和对话框类。上述MFC类之间的继承和派生关系如下图。 图6.2 MFC类的基本层次结构CCmdTargetCWndCDocumentCFrameWndCObjectCWinTreadCWinAppCViewCDialog及控件CMDIChildWndCMDIFrameWndCMiniFrameWnd框架窗口框架窗口工程的文件组织工程的文件组织 工程中源文件都是采用文件夹的方式进行管理的,将工程名作为文件夹工程中源文件都是采用文件
4、夹的方式进行管理的,将工程名作为文件夹名,此文件夹下包含源程序代码文件、工程文件以及工程工作区文件等。每一名,此文件夹下包含源程序代码文件、工程文件以及工程工作区文件等。每一个类的源代码均保存同名的个类的源代码均保存同名的h和和cpp文件。其他一些文件类型的含义:文件。其他一些文件类型的含义:.opt 关于开发环境的参数文件,如工具关于开发环境的参数文件,如工具条位置等信息条位置等信息 .aps(AppStudio File)资源辅助文件,二进制格式资源辅助文件,二进制格式.clw ClassWizard信息文件信息文件.dsp(DeveloperStudio Project)工程文件工程文件
5、.plg 编译信息文件编译信息文件.mdp(Microsoft DevStudio Project)旧版本的工程文件旧版本的工程文件.bsc 用于浏览工程信息用于浏览工程信息.map 执行文件的映像信息纪录文件执行文件的映像信息纪录文件.pch(Pre-Compiled File)预编译文件,可以加快编译速度,预编译文件,可以加快编译速度,但是文件非常大但是文件非常大.pdb(Program Database)记录程序有关的一些数据和调试信记录程序有关的一些数据和调试信息息.ncb 无编译浏览文件无编译浏览文件(no compile browser) 还有相应的还有相应的Debug(调试调试)
6、、Res(资源资源)等子文件夹。用应用程序向导创立工程时,等子文件夹。用应用程序向导创立工程时,系统自动为工程创立系统自动为工程创立Win32 Debug版本的运行程序,并使用相应的默认配置。版本的运行程序,并使用相应的默认配置。程序编连后,用于该工程的可执行文件以及其他调试的信息文件都安放在程序编连后,用于该工程的可执行文件以及其他调试的信息文件都安放在Debug文件夹中。文件夹中。 程序工程有一个程序工程有一个Win32 Release版本,与版本,与Release的区别在于:的区别在于:Debug版本的运版本的运行程序有相应的调试信息码,行程序有相应的调试信息码,Release版本的运行
7、程序没有,但版本的运行程序没有,但Release版本的版本的运行程序经过代码的优化,其程序的运行效率被最大提升。运行程序经过代码的优化,其程序的运行效率被最大提升。 选择选择“编译编译“配置菜单命令,在配置菜单命令,在“配置对话框将工程设置成配置对话框将工程设置成Win32 Release版本。版本。 框架窗口框架窗口主框架窗口和文档窗口主框架窗口和文档窗口 主框架窗口是直接放置在桌面主框架窗口是直接放置在桌面(DeskTop)上的那个窗口,上的那个窗口,每个应用程序只能有一个主框架窗口。主框架窗口负责每个应用程序只能有一个主框架窗口。主框架窗口负责管理各个用户交互对象并根据用户操作相应地创立
8、或更管理各个用户交互对象并根据用户操作相应地创立或更新文档窗口及其视图。新文档窗口及其视图。 文档窗口对文档窗口对SDI程序来说,和主框架窗口是一致的,主框程序来说,和主框架窗口是一致的,主框架窗口就是文档窗口;对于架窗口就是文档窗口;对于MDI程序,文档窗口是主框程序,文档窗口是主框架窗口的子窗口,如图。架窗口的子窗口,如图。 文档窗口一般都有相应的可见边框,它的客户区文档窗口一般都有相应的可见边框,它的客户区(除了窗除了窗口标题栏、边框外的区域口标题栏、边框外的区域)是由相应的视图来构成的,因是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗口时刻跟此可以说视图是文档窗口内
9、的子窗口。文档窗口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产踪当前处于活动状态的视图的变化,并将用户或系统产生的消息传递给当前活动视图。生的消息传递给当前活动视图。 框架窗口框架窗口窗口状态的改变窗口状态的改变MFC AppWizard为每个窗口设置了相应的大小和位置。运行程序时,会自动调用框架内部的WinMain函数,并自动查找该应用程序类的全局变量theApp,然后自动调用用户应用程序类的虚函数InitInstance,该函数会进一步调用相应的函数来完成主窗口的构造和显示工作,代码:BOOL CEx_SDIApp:InitInstance()m_pMainWnd-ShowWin
10、dow(SW_SHOW);/ 显示窗口m_pMainWnd-UpdateWindow();/ 更新窗口return TRUE; m_pMainWnd是主框架窗口指针变量,ShowWindow是CWnd类的成员函数,用来按指定的参数显示窗口。 框架窗口框架窗口通过指定ShowWindow函数的参数值可以改变改变窗口显示状态。例如下面的代码是将窗口的初始状态设置为“最小化:BOOL CEx_SDIApp:InitInstance().m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED);m_pMainWnd-UpdateWindow();return TRUE; 框架窗口
11、框架窗口窗口风格的设置窗口风格的设置 窗口风格窗口风格 通常有一般和扩展两种形式。可在函数CWnd:Create或CWnd:CreateEx参数中指定,CreateEx函数可同时支持以上两种风格,CWnd:Create只能指定窗口的一般风格。控件和对话框的窗口风格可直接通过其属性对话框来设置。 除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在PreCreateWindow重载函数的CREATESTRUCT结构中指定。 FWS_ADDTOTITLE该风格指定相关的信息如文档名添加到框架窗口标题的后面。 FWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之
12、前。 FWS_SNAPTOBARS 该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。 框架窗口框架窗口在在MFC AppWizard中进行修改中进行修改 例例Ex_SDI 在向导中修改窗口风格。在向导中修改窗口风格。 (1)选择选择“文件文件“新建,选择新建,选择“工程,选择工程,选择MFC AppWizard(exe)的工程类型,指定工程工作文件夹位置,输入工程的工程类型,指定工程工作文件夹位置,输入工程名名Ex_SDI,单击,单击确定确定按钮。按钮。(2) 在向导的第一步中,将应用程序类型选为在向导的第一步中,将应用程序类型选为“单个文档单个文档(SDI)。(3) 单击单击下一
13、个下一个,如图,可以选择程序中是否参加数据库的支持。,如图,可以选择程序中是否参加数据库的支持。(4)单击单击下一个下一个,出现向导的第三步对话框,如图,允许在程序中参,出现向导的第三步对话框,如图,允许在程序中参加复合文档、自动化、加复合文档、自动化、ActiveX控件的支持。控件的支持。 框架窗口框架窗口(5)单击下一个,如图,对话框的前几项依次确定对浮开工具条、打印与预览以及通信网络等特性的支持。对话框的最后两项是最近文件列表数目的设置(默认时为4)和一个高级按钮 。框架窗口框架窗口(6)(6)在第四步对话框中,单击高级,如图,分别用于文档模板字串资源内容和窗口风格的修改。 框架窗口框架
14、窗口(7)(7)单击单击 关闭关闭 ,单击,单击 下一个下一个 ,如图。可选择:应用程序的主窗口是,如图。可选择:应用程序的主窗口是MFCMFC标标准风格还是窗口左边有切分窗口的浏览器风格,在源文件中是否参加注释用准风格还是窗口左边有切分窗口的浏览器风格,在源文件中是否参加注释用来引导用户编写程序代码,是使用动态链接库来引导用户编写程序代码,是使用动态链接库(DLL)(DLL)还是静态链接库。还是静态链接库。(8)(8)单击单击 下一个下一个 按钮,出现如下图的对话框。在这里,用户可以对按钮,出现如下图的对话框。在这里,用户可以对MFC MFC AppWizardAppWizard提供的默认类
15、名、基类名、各个源文件名进行修改。提供的默认类名、基类名、各个源文件名进行修改。 框架窗口框架窗口(9)(9) 单击单击 完成完成 ,单击,单击 确定确定 ,回到主界面。,回到主界面。在向导中作出的选择,有局部内容反映在在向导中作出的选择,有局部内容反映在CEx_SDIApp:InitInstanceCEx_SDIApp:InitInstance函数中,代码:函数中,代码:BOOL CEx_SDIApp:InitInstance()BOOL CEx_SDIApp:InitInstance()/ / 假设用户在假设用户在MFC AppWizardMFC AppWizard的第三步中,选中了的第三
16、步中,选中了“ActiveX ControlsActiveX Controls,/ / 那么表示所创立的应用程序支持那么表示所创立的应用程序支持ActiveXActiveX控件控件AfxEnableControlContainer();AfxEnableControlContainer(); / / 假设用户在假设用户在MFC AppWizardMFC AppWizard的第四步中,选中了的第四步中,选中了“3D controls3D controls/ / 那么表示所创立的应用程序支持那么表示所创立的应用程序支持3D3D控件风格控件风格#ifdef _AFXDLL#ifdef _AFXDLL
17、Enable3dControls();Enable3dControls();/ / 使用使用MFCMFC动态链接库的动态链接库的3D3D控件控件#else#elseEnable3dControlsStatic();Enable3dControlsStatic();/ / 使用使用MFCMFC静态链接库的静态链接库的3D3D控件控件#endif#endif/ / 在在WindowsWindows系统注册表中登记应用程序的主键值,以便将一些与应用程序系统注册表中登记应用程序的主键值,以便将一些与应用程序/ / 相关的参数存放在该主键值下相关的参数存放在该主键值下SetRegistryKey(_T(
18、Local MFC AppWizard-Generated Applications);SetRegistryKey(_T(Local MFC AppWizard-Generated Applications);/ / 从注册表中调入应用程序的一些标准参数值,其中包括最近文件列表的文件名从注册表中调入应用程序的一些标准参数值,其中包括最近文件列表的文件名LoadStdProfileSettings(); LoadStdProfileSettings(); return TRUE;return TRUE; 框架窗口框架窗口修改修改CREATESTRUCT结构结构 窗口创立前,自动调用窗口创立前,
19、自动调用PreCreateWindow虚函数。用虚函数。用MFC AppWizard创立文档应用程序结构时,创立文档应用程序结构时,MFC已为主窗口或文档窗口已为主窗口或文档窗口类自动重载了该虚函数。可以在此函数中通过修改类自动重载了该虚函数。可以在此函数中通过修改CREATESTRUCT结构来设置窗口的绝大多数风格。结构来设置窗口的绝大多数风格。对于多文档应用程序,文档窗口的风格可用以下的代码更改:对于多文档应用程序,文档窗口的风格可用以下的代码更改:BOOL CChildFrame:PreCreateWindow(CREATESTRUCT& cs) / 创立不含有创立不含有最大化最
20、大化按钮的子窗口按钮的子窗口 &= WS_MAXIMIZEBOX; / 调用基类的调用基类的PreCreateWindow函数函数return CMDIChildWnd:PreCreateWindow(cs); 框架窗口框架窗口使用使用ModifyStyle和和ModifyStyleEx ModifyStyleEx可更改窗口的扩展风格。两个函数具有相同的参数,含可更改窗口的扩展风格。两个函数具有相同的参数,含义。义。BOOL ModifyXXXX( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );参数参数dwRemove 指定需要删除的风格
21、,指定需要删除的风格,dwAdd指定需要增加的风指定需要增加的风格,格,nFlags表示表示SetWindowPos的标志。的标志。 框架窗口设定扩展风格只能通过调用框架窗口设定扩展风格只能通过调用ModifyStyle函数来进行。例如用函数来进行。例如用MFC ClassWizard为一个多文档应用程序为一个多文档应用程序Ex_MDI的子文档窗口类的子文档窗口类CChildFrame添加添加OnCreateClient消息处理,并增加以下代码:消息处理,并增加以下代码:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateCo
22、ntext* pContext) ModifyStyle(0, WS_VSCROLL, 0);return CMDIChildWnd:OnCreateClient(lpcs, pContext); 框架窗口框架窗口改变窗口的大小和位置改变窗口的大小和位置CWnd类的成员函数类的成员函数SetWindowPos或或MoveWindow可以改变窗口的可以改变窗口的大小和位置。大小和位置。SetWindowPos可以改变窗口的大小、位置,还可以改可以改变窗口的大小、位置,还可以改变所有窗口在堆栈排列的次序变所有窗口在堆栈排列的次序(Z次序次序),这个次序是根据它们在屏幕,这个次序是根据它们在屏幕出现
23、的先后来确定的。出现的先后来确定的。BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags );参数参数pWndInsertAfter表示窗口对象指针,以下预定义窗口表示窗口对象指针,以下预定义窗口对象的地址:对象的地址:wndBottom将窗口放置在将窗口放置在Z次序中的底层次序中的底层wndTop 将窗口放置在将窗口放置在Z次序中的顶层次序中的顶层wndTopMost 设置最顶窗口设置最顶窗口wndNoTopMost 将窗口放置在所有最顶层的后面,假设此窗口将窗口放置
24、在所有最顶层的后面,假设此窗口不是最顶窗口,那么此标志无效。不是最顶窗口,那么此标志无效。x和和y表示窗口新的左上角坐标,表示窗口新的左上角坐标,cx和和cy分别表示表示窗口新的宽度和分别表示表示窗口新的宽度和高度,高度,nFlags表示窗口新的大小和位置方式。表示窗口新的大小和位置方式。 框架窗口框架窗口 函数CWnd:MoveWindow也可用来改变窗口的大小和位置,必须在MoveWindow函数中指定窗口的大小。void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );void MoveW
25、indow( LPCRECT lpRect, BOOL bRepaint = TRUE );参数x和y表示窗口新的左上角坐标,nWidth和nHeight表示窗口新的宽度和高度,bRepaint用于指定窗口是否重绘,lpRect表示窗口新的大小和位置。 例如,在CEx_SDIApp:InitInstance中return TRUE语句之前添加以下代码,可以使主框架窗口移动到屏幕的(100,100)处:/ 假设使用SetWindowPos函数,那么可以有m_pMainWnd-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER);/ 或使用M
26、oveWindow函数,那么有CRect rcWindow;m_pMainWnd-GetWindowRect(rcWindow);m_pMainWnd-MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE);CRect是一个矩形类,GetWindowRect是一个CWnd类的成员函数,用来获取窗口在屏幕的位置和大小。 菜单菜单 许多程序员对于菜单的设计都遵循以下一些规那么:l 假设选择某菜单项会弹出一对话框,那么在该菜单项文本后有“。l 假设某项菜单有子菜单,那么在该菜单项文本后有“。l 假设菜单项需要助记符,用括号将带下划线的字
27、母括起来。助记符与Alt构成一个组合键,当按住“Alt键不放,敲击该字母时,对应的菜单项就会被选中。l 假设某项菜单需要快捷键的支持,那么一般将其列在相应菜单项文本之后。所谓“快捷键是一个组合键,如Ctrl+N,使用时是先按下“Ctrl健不放,然后再按“N键。任何时候按下快捷键,相应的菜单命令都会被执行。 图6.11 菜单样例子 菜单菜单更改应用程序菜单更改应用程序菜单 菜单菜单“文件文件“翻开工作区。在工作区中选择翻开工作区。在工作区中选择ResourceView页面,页面,双击资源双击资源“Menu中的中的IDR_MAINFRAME,通过菜单编辑器修改,通过菜单编辑器修改菜单资源菜单资源I
28、DR_MAINFRAME ,可以为程序重新指定一个菜单,下,可以为程序重新指定一个菜单,下面的例如过程:面的例如过程:(1) 翻开前面的单文档应用程序翻开前面的单文档应用程序Ex_SDI。(2) 按快捷键按快捷键Ctrl+R,在资源类型中选定,在资源类型中选定“Menu,如图。,如图。 (3) 单击单击新建新建,如图。,如图。 菜单菜单(4)(4)在在MenuMenu的的ID_MENU1ID_MENU1上右击鼠标,选择上右击鼠标,选择“PropertiesProperties命令,如图,可以命令,如图,可以重新指定菜单资源重新指定菜单资源IDID,设置菜单资源的语言和条件,这个条件用来决定菜单
29、,设置菜单资源的语言和条件,这个条件用来决定菜单资源包含到哪个环境中,例如当指定条件为资源包含到哪个环境中,例如当指定条件为_DEBUG_DEBUG,那么菜单资源只存在于,那么菜单资源只存在于DebugDebug编译环境中。编译环境中。 (5)(5)菜单菜单ID_MENU1ID_MENU1添加一个顶层弹出菜单项添加一个顶层弹出菜单项“测试测试(&T)(&T),并在该菜单下添,并在该菜单下添加一个子菜单项加一个子菜单项“返回返回(&R)(&R),IDID设为设为ID_TEST_RETURNID_TEST_RETURN,如图。,如图。 (6)(6)翻开翻开Ex_SD
30、IEx_SDI程序菜单资源程序菜单资源IDR_MAINFRAMEIDR_MAINFRAME,在,在“查看菜单的最后添加一查看菜单的最后添加一个子菜单项个子菜单项“显示测试菜单显示测试菜单(&M)(&M),IDID设为设为ID_VIEW_TESTID_VIEW_TEST。(7)(7)为为CMainFrameCMainFrame类添加一个类添加一个CMenuCMenu类型的成员变量类型的成员变量m_NewMenum_NewMenu,CMenuCMenu类是用类是用来处理菜单的一个来处理菜单的一个MFCMFC类。类。 菜单菜单(8)(8)按快捷键按快捷键Ctrl+WCtrl+W,切换
31、到,切换到Message MapsMessage Maps页面,从页面,从“Class nameClass name列表中选择列表中选择CMainFrameCMainFrame,分别为菜单项,分别为菜单项ID_VIEW_TESTID_VIEW_TEST和和ID_TEST_RETURNID_TEST_RETURN添加添加COMMANDCOMMAND消息消息映射,使用默认的消息映射函数名,并添中以下代码:映射,使用默认的消息映射函数名,并添中以下代码:void CMainFrame:OnViewTest() void CMainFrame:OnViewTest() ();();/ / 使菜单对象和
32、菜单句柄别离使菜单对象和菜单句柄别离( IDR_MENU1 ); ( IDR_MENU1 ); SetMenu(NULL); SetMenu(NULL); / / 去除应用程序菜单去除应用程序菜单SetMenu( &m_NewMenu ); SetMenu( &m_NewMenu ); / / 设置应用程序菜单设置应用程序菜单 void CMainFrame:OnTestReturn() void CMainFrame:OnTestReturn() ();();( IDR_MAINFRAME );( IDR_MAINFRAME );SetMenu(NULL);SetMenu(N
33、ULL);SetMenu( &m_NewMenu );SetMenu( &m_NewMenu ); LoadMenuLoadMenu装载菜单资源,装载菜单资源,DetachDetach使菜单对象与菜单句柄别离。调用使菜单对象与菜单句柄别离。调用LoadMenuLoadMenu后,后,菜单对象菜单对象m_NewMenum_NewMenu就拥有一个菜单句柄,再次调用就拥有一个菜单句柄,再次调用LoadMenuLoadMenu时,发生运行时时,发生运行时错误,当菜单对象与菜单句柄别离后,就可以再创立菜单。错误,当菜单对象与菜单句柄别离后,就可以再创立菜单。SetMenuSetMenu
34、是是CWndCWnd类类的一个成员函数,用来设置应用程序的菜单。的一个成员函数,用来设置应用程序的菜单。(9)(9)编译运行并测试。编译运行并测试。 菜单菜单使用键盘快捷键使用键盘快捷键 通过上述的菜单系统,可以选择几乎所有可用的命令和选项,保证了通过上述的菜单系统,可以选择几乎所有可用的命令和选项,保证了菜单命令系统的完整性,菜单系统操作效率不高。对于那些反复使菜单命令系统的完整性,菜单系统操作效率不高。对于那些反复使用的命令,有必要进一步提高效率,于是加速键应运而生。用的命令,有必要进一步提高效率,于是加速键应运而生。 一个加速键就是一个按键或几个按键的组合,用于激活特定的命令。一个加速键
35、就是一个按键或几个按键的组合,用于激活特定的命令。加速键也是一种资源。加速键也是一种资源。 例如:为前面两个菜单例如:为前面两个菜单ID_VIEW_TEST和和ID_TEST_RETURN定义键定义键盘快捷键:盘快捷键:(1)翻开上例的工作区窗口中翻开上例的工作区窗口中Accelerator的资源项,双击的资源项,双击IDR_MAINFRAME,如图。,如图。 菜单菜单(2)(2)建立一新的加速键,双击加速键列表的最下端的空行,弹出如图的建立一新的加速键,双击加速键列表的最下端的空行,弹出如图的“Accel ProperitiesAccel Properities( (加速键属性加速键属性)
36、)对话框,可设置的属性如表。对话框,可设置的属性如表。 菜单菜单(3)(3)选择选择Ex_SDIEx_SDI添加的添加的“显示测试菜单菜单项显示测试菜单菜单项ID_VIEW_TESTID_VIEW_TEST作为要联用的加速作为要联用的加速键的键的IDID号,然后单击号,然后单击 下一键下一键 按钮,并按下按钮,并按下Ctrl+1Ctrl+1作为此加速键的键值。作为此加速键的键值。(4)(4)按同样的方法,为菜单项按同样的方法,为菜单项ID_TEST_RETURNID_TEST_RETURN添加加速键添加加速键Ctrl+2Ctrl+2。需要说明的是,。需要说明的是,为了使其他用户能查看并使用该加
37、速键,还需在相应的菜单项文本后面添加为了使其他用户能查看并使用该加速键,还需在相应的菜单项文本后面添加加速键内容。例如,可将加速键内容。例如,可将ID_VIEW_TESTID_VIEW_TEST菜单项的标题改成菜单项的标题改成“显示测试菜单显示测试菜单(&M)tCtrl+1(&M)tCtrl+1,其中,其中“tt是将后面的是将后面的“Ctrl+1Ctrl+1定位到一个水平制表位。定位到一个水平制表位。(5)(5)编译运行并测试。当程序运行后,按编译运行并测试。当程序运行后,按“Ctrl+1Ctrl+1和和“Ctrl+2Ctrl+2将执行相应的将执行相应的菜单命令。菜单命令。 菜
38、单菜单菜单的编程控制菜单的编程控制 创立菜单创立菜单 CreateMenu和和CreatePopupMenu用来创立一个菜单或子菜单框架,原型:用来创立一个菜单或子菜单框架,原型:BOOL CreateMenu( );/ 产生一个空菜单产生一个空菜单BOOL CreatePopupMenu( );/ 产生一个空的弹出式子菜单产生一个空的弹出式子菜单 装入菜单资源装入菜单资源 需调用需调用CMenu成员函数成员函数LoadMenu,再用,再用SetMenu对应用程序菜单进行重新设对应用程序菜单进行重新设置。置。BOOL LoadMenu( LPCTSTR lpszResourceName );B
39、OOL LoadMenu( UINT nIDResource );lpszResourceName为菜单资源名称,为菜单资源名称,nIDResource为菜单资源为菜单资源ID号。号。 添加菜单项添加菜单项 可以调用可以调用AppendMenu或或InsertMenu函数来添加菜单项。函数来添加菜单项。AppendMenu是将菜是将菜单项添加在菜单的末尾处,单项添加在菜单的末尾处,InsertMenu在指定位置处插入菜单项,将后面的菜在指定位置处插入菜单项,将后面的菜单项依次下移。单项依次下移。BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,
40、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, UINT nIDNewItem, const CBitmap* pBmp );nIDNewItem表示新菜单项的表示新菜
41、单项的ID号,号,lpszNewItem表示新菜单项的内容,表示新菜单项的内容,pBmp用于菜单项的位图指针,用于菜单项的位图指针,nPosition表示新菜单项要插入的菜单项位置。表示新菜单项要插入的菜单项位置。nFlags表示要增加的新菜单项的状态信息。表示要增加的新菜单项的状态信息。 菜单菜单注意:l 当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第一个菜单项,为 -1时,将菜单项添加菜单的末尾处。l nFlags的标志中,可以用“|(按位或)来组合。有些组合是不允许的,例如MF_DISABLED、MF_ENABLED和MF_GR
42、AYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位图,MF_CHECKED和MF_UNCHECKED 都不能组合在一起。l当菜单项增加后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar来更新菜单。 菜单菜单删除菜单项删除菜单项 DeleteMenu函数可将菜单项删除,注意:注意:调用该函数后,不管菜单依附的窗口是否改变,都应调用CWnd:DrawMenuBar使菜单更新。函数原型:BOOL DeleteMenu( UINT BOOL DeleteMenu( UINT nPosition, UINT , UINT nFlags ); );n
43、Position表示要删除菜单项位置,由nFlags进行说明。nFlags为MF_BYCOMMAND时,nPosition表示菜单项ID号,nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置。 获取菜单项获取菜单项 下面四个CMenu成员函数分别获得菜单的项数、菜单项的ID号、菜单项的文本内容以及弹出式子菜单的句柄。UINT GetMenuItemCount( ) const;/UINT GetMenuItemCount( ) const;/用来获得菜单的菜单项数。UINT GetMenuItemID( intUINT GetMenuItemID( int nPos
44、 ) const;/ ) const;/用来获得由nPos指定菜单项位置的菜单项的标识号。int GetMenuString( UINT int GetMenuString( UINT nIDItem, CString& , CString& rString, UINT , UINT nFlags ) ) const;const;/获得由nIDItem指定菜单项位置的菜单项的文本内容,由rString参数返回,nFlags为MF_BYPOSITION时,nPosition表示菜单项的位置。CMenuCMenu* * GetSubMenu( int GetSubMenu( int
45、 nPos ) const; ) const; /用来获得指定菜单的弹出式菜单的菜单句柄。 菜单菜单例如例如 例如过程利用例如过程利用CMenu成员函数向应用程序菜单中添加并处理一个菜单项:成员函数向应用程序菜单中添加并处理一个菜单项:(1) 翻开前面的单文档应用程序翻开前面的单文档应用程序Ex_SDI或重新创立。或重新创立。(2) “查看菜单查看菜单“Resource Symbols,如图。,如图。(3) 单击单击新建新建,如图。在名字框中输入标识符,如图。在名字框中输入标识符ID_NEW_MENUITEM。在。在值框中输入值框中输入ID的值,单击的值,单击确定确定。 菜单菜单(4) (4)
46、 关闭关闭“资源符号对话框,在资源符号对话框,在CMainFrame:OnCreateCMainFrame:OnCreate函数中添加以下代码。函数中添加以下代码。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) .CMenuCMenu* * pSysMenu = GetMenu(); pSysMenu = GetMenu();/ / 获获得程序菜单指针得程序菜单指针CMenuCMenu* * pSubMenu = pSysMe
47、nu-GetSubMenu(1);/ pSubMenu = pSysMenu-GetSubMenu(1);/ 获得第二个子菜单的指获得第二个子菜单的指针针CString StrMenuItem(CString StrMenuItem(新的菜单项新的菜单项););pSubMenu-AppendMenu(MF_SEPARATOR);pSubMenu-AppendMenu(MF_SEPARATOR);/ / 增加一水平分隔线增加一水平分隔线pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);pSubMenu-AppendMenu(MF
48、_STRING,ID_NEW_MENUITEM,StrMenuItem);/ / 在子菜单中增加一菜单项在子菜单中增加一菜单项/ / 允许使用允许使用ON_UPDATE_COMMAND_UION_UPDATE_COMMAND_UI或或ON_COMMANDON_COMMAND的菜单项的菜单项m_bAutoMenuEnable = FALSE; / m_bAutoMenuEnable = FALSE; / 关闭系统自动更新菜单状态关闭系统自动更新菜单状态pSysMenu-pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED)
49、;EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);/ / 激活菜单项激活菜单项DrawMenuBar();DrawMenuBar();/ / 更新菜单更新菜单return 0;return 0; 菜单菜单(5) (5) 用用MFC ClassWizardMFC ClassWizard处理处理OnCommandOnCommand消息并检测用户菜单的消息并检测用户菜单的nIDnID参数。参数。BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) BOOL CMainFrame:
50、OnCommand(WPARAM wParam, LPARAM lParam) / wParam/ wParam的低字节表示菜单、控件、加速键的命令的低字节表示菜单、控件、加速键的命令IDIDif (LOWORD(wParam) = ID_NEW_MENUITEM) if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(MessageBox(你选中了新的菜单项你选中了新的菜单项););return CFrameWnd:OnCommand(wParam, lParam);return CFrameWnd:OnCommand(wParam, lParam
51、); (6)(6)编译运行并测试。这样中选择菜单编译运行并测试。这样中选择菜单“编辑编辑“新的菜单项命令后,就会新的菜单项命令后,就会弹一个对话框,显示弹一个对话框,显示“你选中了新的菜单项消息。你选中了新的菜单项消息。 菜单菜单使用快捷菜单使用快捷菜单 快捷菜单实现函数快捷菜单实现函数 用资源编辑器和用资源编辑器和MFC库的库的CMenu:TrackPopupMenu函数可以创立函数可以创立这样的菜单,这样的菜单,CMenu:TrackPopupMenu函数原型:函数原型:BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd,
52、LPCRECT lpRect = NULL );用来显示一个浮动的弹出式菜单。用来显示一个浮动的弹出式菜单。nFlags表示菜单在屏幕显示的位置表示菜单在屏幕显示的位置以及鼠标按钮标志,如表。以及鼠标按钮标志,如表。x和和y表示菜单的水平坐标和菜单的顶端表示菜单的水平坐标和菜单的顶端的垂直坐标。的垂直坐标。pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的表示弹出菜单的窗口,此窗口将收到菜单全部的WM_COMMAND消息。消息。lpRect是一个是一个RECT结构或结构或CRect对象指针,对象指针,表示一个矩形区域,单击这个区域时,弹出菜单不消失。表示一个矩形区域,单击这个区域时,弹出菜单不
53、消失。lpRect为为NULL时,在菜单外面单击鼠标,菜单立刻消失。时,在菜单外面单击鼠标,菜单立刻消失。 菜单菜单例如例如 显示主菜单显示主菜单IDR_MAINFRAME时,右击鼠标弹出时,右击鼠标弹出“查看菜单的子菜单,显查看菜单的子菜单,显示菜单示菜单IDR_MENU1时,右击鼠标弹出时,右击鼠标弹出“测试菜单的子菜单。具体步骤:测试菜单的子菜单。具体步骤:(1) 翻开前面的单文档应用程序翻开前面的单文档应用程序Ex_SDI。(2) 在在CMainFrame类添加类添加WM_CONTEXTMENU消息映射,函数代码。消息映射,函数代码。void CMainFrame:OnContextM
54、enu(CWnd* pWnd, CPoint point) CMenu* pSysMenu = GetMenu();/ 获得程序菜单指针获得程序菜单指针int nCount = pSysMenu-GetMenuItemCount();/ 获得顶层菜单个数获得顶层菜单个数int nSubMenuPos = -1;for (int i=0; iGetMenuString(i, str, MF_BYPOSITION);if (str.Left(4) = “查看查看) | (str.Left(4) = “测试测试)nSubMenuPos = i;break;if (nSubMenuPosGetSubM
55、enu( nSubMenuPos) -TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);(3)编译运行并测试。编译运行并测试。 工具栏工具栏 使用工具栏编辑器使用工具栏编辑器 创立一个新的工具栏按钮创立一个新的工具栏按钮 双击新建的工具栏中最右端的空按钮弹出属性框,在双击新建的工具栏中最右端的空按钮弹出属性框,在ID框中输入名称,右端框中输入名称,右端出现一个空按钮。单击该按钮,在资源编辑器的工具按钮设计窗口内进行编出现一个空按钮。单击该按钮,在资源编辑器的工具按钮设计窗口内进行编辑,这个编辑就是绘制一个
56、工具按钮的位图。辑,这个编辑就是绘制一个工具按钮的位图。 移动一个按钮移动一个按钮鼠标左键点中它并拖动至相应位置。如果用户拖动它离开工具栏位置,那么鼠标左键点中它并拖动至相应位置。如果用户拖动它离开工具栏位置,那么此按钮从工具栏中消失。假设在移动一个按钮的同时,按下此按钮从工具栏中消失。假设在移动一个按钮的同时,按下Ctrl键,那么在键,那么在新位置复制一个按钮,新位置可以是同一个工具栏中的其他位置,也可以在新位置复制一个按钮,新位置可以是同一个工具栏中的其他位置,也可以在不同的工具栏中。不同的工具栏中。 删除一个按钮删除一个按钮 将选取中的按钮拖离工具栏就消失了。假设选中按钮,将选取中的按钮
57、拖离工具栏就消失了。假设选中按钮,Delete键不能删除,键不能删除,将按钮中的图形全部以背景色填充。将按钮中的图形全部以背景色填充。 在工具栏中插入空格在工具栏中插入空格 如果按扭前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上如果按扭前没有任何空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标键,那么此按钮前出现空格。时,释放鼠标键,那么此按钮前出现空格。 如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界如果按钮前有空格而按钮后没有空格,拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,那么此按钮后将出现空格。接触到前面按钮时,释放
58、鼠标键,那么此按钮后将出现空格。 如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,那么此如果按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,那么此按钮前的空格保存,按钮后的空格消失。相反,拖动该按钮向左移动并当接按钮前的空格保存,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,那么此按钮前面的空格消失,后面的空格保存。触到前一个相邻按钮时,那么此按钮前面的空格消失,后面的空格保存。 工具栏工具栏工具栏按钮属性的设置工具栏按钮属性的设置 工具栏工具栏工具按钮和菜单项相结合工具按钮和菜单项相结合 指选择工具按钮或菜单命令时,操作结果是一样的。使它们结合
59、的指选择工具按钮或菜单命令时,操作结果是一样的。使它们结合的具体方法是在工具按钮的属性对话框中将按钮的具体方法是在工具按钮的属性对话框中将按钮的ID号设置为相关联号设置为相关联的菜单项的菜单项ID。例如例如:例如是在前面例如是在前面Ex_SDI上进行的,通过两个工具按钮分别显示主上进行的,通过两个工具按钮分别显示主菜单菜单IDR_MAINFRAME和菜单和菜单IDR_MENU1。具体步骤:。具体步骤:(1) 翻开前面的单文档应用程序翻开前面的单文档应用程序Ex_SDI。(2) 利用工具栏编辑器设计两个工具按钮,如图。利用工具栏编辑器设计两个工具按钮,如图。 工具栏工具栏(3)(3) 双击设计的
60、第一个工具按钮,将工具按钮的双击设计的第一个工具按钮,将工具按钮的IDID号设为号设为ID_TEST_RETURNID_TEST_RETURN,在,在提示框内键入提示框内键入“返回应用程序主菜单返回应用程序主菜单nn返回主菜单。返回主菜单。(4)(4) 双击设计的第二个工具按钮,将工具按钮的双击设计的第二个工具按钮,将工具按钮的IDID号设为号设为ID_VEW_TESTID_VEW_TEST,在提示,在提示框内键入框内键入“显示测试菜单显示测试菜单nn显示测试菜单。显示测试菜单。(5) (5) 编译运行并测试。将鼠标移至设计的第一个工具按钮处,这时在状态栏上编译运行并测试。将鼠标移至设计的第一个工具按钮处,这时在状态栏上显示出显示出“返回应用程序主菜单信息,假设稍等片刻后,还会弹出提示小窗返回应用程序主菜单信息,假设稍等片刻后,还会弹出提示小
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中交一公局(海南)建设有限公司招聘2人笔试备考试题及答案详解
- 虹口区2026年街道社区工作者及部门编制外聘用人员公开招聘笔试参考题库及答案详解
- 2026新疆红星建设工程(集团)有限公司面向社会招聘10人笔试模拟试题及答案详解
- 青岛市崂山区教育系统专项招聘2026届崂山区生源公费师范生笔试备考题库及答案详解
- 2026重庆梁平区中医院招聘5人笔试模拟试题及答案详解
- 2026湖南长沙有色冶金设计研究有限公司法律合规部招聘笔试备考题库及答案详解
- 2026民政职业大学社会招聘(第一批)8人笔试备考题库及答案详解
- 井研县人民医院医共体 2026年招聘第一批编外人员(23人)笔试模拟试题及答案详解
- 2026就爱这么过夏天抖音生活服务招商方案
- 2026西安市第一医院康复医学科招聘(3人)笔试备考题库及答案详解
- 医院内控手册模板
- GB/T 15231-2023玻璃纤维增强水泥性能试验方法
- 安徽2023年高考文综历史试卷及参考答案
- 2022北京西城区初二地理一模试卷及答案
- 抗真菌药物课件
- 2023年潍坊市初中学业水平考试地理试题附答案
- 2022年上海市初中学业考试地理中考试卷真题(含答案详解)
- 皮影教学反思
- YY/T 1511-2017胶原蛋白海绵
- GB/T 7631.2-2003润滑剂、工业用油和相关产品(L类)的分类第2部分:H组(液压系统)
- 船舶吃水差解析课件
评论
0/150
提交评论