MFC框架窗口界面设计.ppt

上传人:san****019 文档编号:19955154 上传时间:2021-01-18 格式:PPT 页数:58 大小:717.60KB
收藏 版权申诉 举报 下载
MFC框架窗口界面设计.ppt_第1页
第1页 / 共58页
MFC框架窗口界面设计.ppt_第2页
第2页 / 共58页
MFC框架窗口界面设计.ppt_第3页
第3页 / 共58页
资源描述:

《MFC框架窗口界面设计.ppt》由会员分享,可在线阅读,更多相关《MFC框架窗口界面设计.ppt(58页珍藏版)》请在装配图网上搜索。

1、MFC框架窗口界面设计 1框架窗口 2菜单 3工具栏 4状态栏 5交互对象的动态更新 6图标和光标 1框架窗口 1.1单文档和多文档程序框架窗口 文档应用程序的 MFC类结构 如图是单文档应用程序 Ex_SDI和多文档应用程序 Ex_MDI的 MFC类结构。 CAboutDlg是每一个应用程序框架都有的 , 用来显示本程序的有关信息 。 CEx_SDIApp和 CEx_MDIApp是应用程序类 , 是从 CWinApp类派生而来 , 负责应用 程序创建 、 运行和终止 , 每一个应用程序都需要这样的类 。 CEx_SDIDoc和 CEx_MDIDoc是文档类 , 它们是从 CDocument类

2、派生而来 , 负责应 用程序文档数据管理 。 CEx_SDIView和 CEx_MDIView是视图类,它们既可以从基类 CView派生,也可以 从 CView派生类派生,负责数据的显示、绘制和其他用户交互。 CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界 面元素的初始化。对于单文档应用程序来说,主框架窗口类是从 CFrameWnd派 生而来的,而对于多文档应用程序程序,主框架窗口是从 CMDIFrameWnd派生的。 1框架窗口 CChildFrame类是从 CMDIChildWnd派生而来 , 专门用来管理多文档应用程序中 的文档窗口 。 无论是 CMDIC

3、hildWnd 还是 CMDIFrameWnd类 , 它们都是从 CFrameWnd派生而来的 。 对于基于对话框的应用程序 , 一般有 CAboutDlg类 、 应用程序类和对话框类 。 上述 MFC类之间的继承和派生关系如图 2所示。 图 2 MFC类的基本层次结构 CCmdTarget CWnd CDocument CFrameWnd CObject CWinTread CWinApp CView CDialog及控件 CMDIChildWnd CMDIFrameWnd CMiniFrameWnd 1框架窗口 项目的文件组织 项目中源文件都是采用文件夹的方式进行管理的 , 将项目名作为文

4、件夹名 , 此文件夹下 包含源程序代码文件 、 项目文件以及项目工作区文件等 。 每一个类的源代码均保存同名 的 h和 cpp文件 。 其他一些文件类型的含义: .opt 关于开发环境的参数文件 , 如工具条位置等信息 .aps(AppStudio File) 资源辅助文件 , 二进制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudio Project) 项目文件 .plg 编译信息文件 .mdp(Microsoft DevStudio Project) 旧版本的项目文件 .bsc 用于浏览项目信息 .map 执行文件的映像信息纪录文件 .pch(Pre-C

5、ompiled File) 预编译文件 , 可以加快编译速度 , 但是文件非常大 .pdb(Program Database) 记录程序有关的一些数据和调试信息 .ncb 无编译浏览文件 (no compile browser) 还有相应的 Debug(调试 )、 Res(资源 )等子文件夹 。 用应用程序向导创建项目时 , 系统自 动为项目创建 Win32 Debug版本的运行程序 , 并使用相应的默认配置 。 程序编连后 , 用 于该项目的可执行文件以及其他调试的信息文件都安放在 Debug文件夹中 。 程序项目有一个 Win32 Release版本 , 与 Release的区别在于: D

6、ebug版本的运行程序有 相应的调试信息码 , Release版本的运行程序没有 , 但 Release版本的运行程序经过代码 的优化 , 其程序的运行效率被最大提升 。 选择 “ 编译 ” “ 配置 ” 菜单命令 , 在 “ 配置 ” 对话框将项目设置成 Win32 Release版 本 。 1框架窗口 主框架窗口和文档窗口 主框架窗口是直接放置在桌面 (DeskTop)上的那个窗口 , 每个应用程序只能 有一个主框架窗口 。 主框架窗口负责管理各个用户交互对象并根据用户操作 相应地创建或更新文档窗口及其视图 。 文档窗口对 SDI程序来说 , 和主框架窗口是一致的 , 主框架窗口就是文档窗

7、 口;对于 MDI程序 , 文档窗口是主框架窗口的子窗口 , 如图 。 文档窗口一般都有相应的可见边框 , 它的客户区 (除了窗口标题栏 、 边框外 的区域 )是由相应的视图来构成的 , 因此可以说视图是文档窗口内的子窗口 。 文档窗口时刻跟踪当前处于活动状态的视图的变化 , 并将用户或系统产生的 消息传递给当前活动视图 。 1框架窗口 1.2窗口状态的改变 MFC AppWizard为每个窗口设置了相应的大小和位置 。 运行程序时 , 会自动调用框架内部的 WinMain函数 , 并自动查找该应用程序 类的全局变量 theApp, 然后自动调用用户应用程序类的虚函数 InitInstance

8、, 该函数会进一步调用相应的函数来完成主窗口的构造和显示工作 , 代码: BOOL CEx_SDIApp:InitInstance() m_pMainWnd-ShowWindow(SW_SHOW); / 显示窗口 m_pMainWnd-UpdateWindow(); / 更新窗口 return TRUE; m_pMainWnd是主框架窗口指针变量, ShowWindow是 CWnd类的成员函数, 用来按指定的参数显示窗口。 1框架窗口 通过指定 ShowWindow函数的参数值可以改变改变窗口显示状态 。 例如下面的 代码是将窗口的初始状态设置为 “ 最小化 ” : BOOL CEx_SDIA

9、pp:InitInstance() . m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd-UpdateWindow(); return TRUE; 1框架窗口 1.3窗口风格的设置 窗口风格 通常有一般和扩展两种形式。可在函数 CWnd:Create或 CWnd:CreateEx参 数中指定, CreateEx函数可同时支持以上两种风格, CWnd:Create只能指定 窗口的一般风格。控件和对话框的窗口风格可直接通过其属性对话框来设置。 除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在 PreCreateWindow重载函数的

10、 CREATESTRUCT结构中指定。 FWS_ADDTOTITLE 该风格指定相关的信息如文档名添加到框架窗口标题的后面 。 FWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前 。 FWS_SNAPTOBARS 该风格用来调整窗口的大小,使它刚好包含了框架窗口中的控制栏。 例 cs.cx =300; cs.cy = 200; cs.style =cs.style /取反 cs.lpszName = 大连理工大学 ; 1框架窗口 在 MFC AppWizard中进行修改 例 Ex_SDI 在向导中修改窗口风格。 (1)选择 “ 文件 ” “ 新建 ” , 选择

11、 “ 工程 ” , 选择 MFC AppWizard(exe)的项目 类型 , 指定项目工作文件夹位置 , 输入项目名 Ex_SDI, 单击 确定 按钮 。 (2) 在向导的第一步中 , 将应用程序类型选为 “ 单个文档 ” (SDI)。 (3) 单击 下一个 , 如图 , 可以选择程序中是否加入数据库的支持 。 (4)单击 下一个 , 出现向导的第三步对话框 , 如图 , 允许在程序中加入复合文 档 、 自动化 、 ActiveX控件的支持 。 1框架窗口 (5)单击 下一个 ,如图,对 话框的前几项依次确定对浮 动工具条、打印与预览以及 通信网络等特性的支持。对 话框的最后两项是最近文件

12、列表数目的设置 (默认时为 4) 和一个 高级 按钮 。 1框架窗口 (6)在第四步对话框中,单击 高 级 ,如图,分别用于文档模板字 串资源内容和窗口风格的修改。 1框架窗口 (7)单击 关闭 ,单击 下一个 ,如图。可选择:应用程序的主窗口 是 MFC标准风格还是窗口左边有切分窗口的浏览器风格,在源文件中 是否加入注释用来引导用户编写程序代码,是使用动态链接库 (DLL) 还是静态链接库。 (8)单击 下一个 按钮,出现如图 9所示的对话框。在这里,用户可以 对 MFC AppWizard提供的默认类名、基类名、各个源文件名进行修改。 1框架窗口 (9) 单击 完成 , 单击 确定 , 回

13、到主界面 。 在向导中作出的选择 , 有部分内容反映在 CEx_SDIApp:InitInstance函数中 , 代码: BOOL CEx_SDIApp:InitInstance() / 若用户在 MFC AppWizard的第三步中 , 选中了 “ ActiveX Controls”, / 则表示所创建的应用程序支持 ActiveX控件 AfxEnableControlContainer(); / 若用户在 MFC AppWizard的第四步中 , 选中了 “ 3D controls” / 则表示所创建的应用程序支持 3D控件风格 #ifdef _AFXDLL Enable3dControl

14、s(); / 使用 MFC动态链接库的 3D控件 #else Enable3dControlsStatic(); / 使用 MFC静态链接库的 3D控件 #endif / 在 Windows系统注册表中登记应用程序的主键值 , 以便将一些与应用程序 / 相关的参数存放在该主键值下 SetRegistryKey(_T(Local MFC AppWizard-Generated Applications); / 从注册表中调入应用程序的一些标准参数值 , 其中包括最近文件列表的文件名 LoadStdProfileSettings(); return TRUE; 1框架窗口 修改 CREATESTR

15、UCT结构 窗口创建前 , 自动调用 PreCreateWindow虚函数 。 用 MFC AppWizard创建文档 应用程序结构时 , MFC已为主窗口或文档窗口类自动重载了该虚函数 。 可以 在此函数中通过修改 CREATESTRUCT结构来设置窗口的绝大多数风格 。 对于多文档应用程序 , 文档窗口的风格可用下列的代码更改: BOOL CMainFrame:PreCreateWindow(CREATESTRUCT / 调用基类的 PreCreateWindow函数 return CFrameWnd:PreCreateWindow(cs); 1框架窗口 使用 ModifyStyle和 M

16、odifyStyleEx ModifyStyleEx可更改窗口的扩展风格 。 两个函数具有相同的参数 , 含义 。 BOOL ModifyXXXX( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 ); 参数 dwRemove 指定需要删除的风格 , dwAdd指定需要增加的风格 , nFlags表示 SetWindowPos的标志 。 框架窗口设定扩展风格只能通过调用 ModifyStyle函数来进行 。 例如用 MFC ClassWizard 为一个多文档应用程序 Ex_MDI的子文档窗口类 CChildFrame添加 OnCreateClient

17、消息处理 , 并增加下列代码: BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ModifyStyle(0, WS_VSCROLL, 0); return CMDIChildWnd:OnCreateClient(lpcs, pContext); 1框架窗口 1.4改变窗口的大小和位置 CWnd类的成员函数 SetWindowPos或 MoveWindow可以改变窗口的大小和位置 。 SetWindowPos可以改变窗口的大小 、 位置 , 还可以改变所有窗口在堆栈排列的次序 (Z 次序

18、), 这个次序是根据它们在屏幕出现的先后来确定的 。 BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 参数 pWndInsertAfter 表示窗口对象指针 , 下列预定义窗口对象的地址: wndBottom 将窗口放置在 Z次序中的底层 wndTop 将窗口放置在 Z次序中的顶层 wndTopMost 设置最顶窗口 wndNoTopMost 将窗口放置在所有最顶层的后面 , 若此窗口不是最顶窗口 , 则此标志 无效 。 x和 y表示窗口新的左上角坐标, c

19、x和 cy分别表示表示窗口新的宽度和高度, nFlags表 示窗口新的大小和位置方式。 1框架窗口 函数 CWnd:MoveWindow 也可用来改变窗口的大小和位置 , 必须在 MoveWindow函数中指定窗口的大小 。 void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE ); void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE ); 参数 x和 y表示 窗口新的左上角坐标 , nWidth和 nHeight表示窗口新的宽度和 高度

20、, bRepaint用于指定窗口是否重绘 , lpRect表示窗口新的大小和位置 。 例如 , 在 CEx_SDIApp:InitInstance中 return TRUE语句之前添加下列代 码 , 可以使主框架窗口移动到屏幕的 (100, 100)处: / 若使用 SetWindowPos函数 , 则可以有 m_pMainWnd-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER); / 或使用 MoveWindow函数 , 则有 CRect rcWindow; m_pMainWnd-GetWindowRect(rcWindow); m

21、_pMainWnd- MoveWindow(100,100,rcWindow.Width(),rcWindow.Height(),TRUE); CRect是一个矩形类, GetWindowRect是一个 CWnd类的成员函数,用来获取 窗口在屏幕的位置和大小。 2菜单 许多程序员对于菜单的设计都遵循下列一些规则: l 若选择某菜单项会弹出一对话框 , 那么在该菜单项文本后有 “ ”。 l 若某项菜单有子菜单 , 那么在该菜单项文本后有 “ ” 。 l 若菜单项需要助记符 , 用括号将带下划线的字母括起来 。 助记符与 Alt构成一 个组合键 , 当按住 “ Alt”键不放 , 敲击该字母时 ,

22、 对应的菜单项就会被选中 。 l 若某项菜单需要快捷键的支持 , 则一般将其列在相应菜单项文本之后 。 所谓 “ 快捷键 ” 是一个组合键 , 如 Ctrl+N, 使用时是先按下 “ Ctrl”健不放 , 然后 再按 “ N”键 。 任何时候按下快捷键 , 相应的菜单命令都会被执行 。 图 11 菜单样例子 2菜单 2.1更改应用程序菜单 菜单 “ 文件 ” “ 打开工作区 ” 。 在工作区中选择 ResourceView页面 , 双击 资源 “ Menu”中的 IDR_MAINFRAME , 通过 菜单 编辑 器修 改 菜单 资 源 IDR_MAINFRAME , 可以为程序重新指定一个菜单

23、 , 下面的示例过程: (1) 打开前面的单文档应用程序 Ex_SDI。 (2) 按快捷键 Ctrl+R, 在资源类型中选定 “ Menu”, 如图 。 (3) 单击 新建 , 如图 。 2菜单 (4)在 Menu的 ID_MENU1上右击鼠标,选择 “ Properties”命令,如图,可以 重新指定菜单资源 ID,设置菜单资源的语言和条件,这个条件用来决定菜单 资源包含到哪个环境中,例如当指定条件为 _DEBUG,则菜单资源只存在于 Debug编译环境中。 (5)菜单 ID_MENU1添加一个顶层弹出菜单项 “ 测试 ( / 使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(

24、 IDR_MENU1 ); SetMenu(NULL); / 清除应用程序菜单 SetMenu( / 设置应用程序菜单 void CMainFrame:OnTestReturn() m_NewMenu.Detach(); m_NewMenu.LoadMenu( IDR_MAINFRAME ); SetMenu(NULL); SetMenu( LoadMenu装载菜单资源, Detach使菜单对象与菜单句柄分离。调用 LoadMenu 后,菜单对象 m_NewMenu就拥有一个菜单句柄,再次调用 LoadMenu时,发生 运行时错误,当菜单对象与菜单句柄分离后,就可以再创建菜单。 SetMenu

25、是 CWnd类的一个成员函数,用来设置应用程序的菜单。 (9)编译运行并测试。 2菜单 2.2使用键盘快捷键 通过上述的菜单系统 , 可以选择几乎所有可用的命令和选项 , 保证 了菜单命令系统的完整性 , 菜单系统操作效率不高 。 对于那些反复使 用的命令 , 有必要进一步提高效率 , 于是加速键应运而生 。 一个加速键就是一个按键或几个按键的组合 , 用于激活特定的命令 。 加速键也是一种资源 。 例如:为前面两个菜单 ID_VIEW_TEST和 ID_TEST_RETURN定义键盘快 捷键: (1)打开上例的工作区窗口中 Accelerator的资源项,双击 IDR_MAINFRAME,如

26、图。 2菜单 (2)建立一新的加速键,双击加速键列表的最下端的空行,弹出如图的 “ Accel Properities”(加速键属性 )对话框,可设置的属性如表。 2菜单 (3)选择 Ex_SDI添加的 “ 显示测试菜单 ” 菜单项 ID_VIEW_TEST作为要联用的加速 键的 ID号 , 然后单击 下一键 按钮 , 并按下 Ctrl+1作为此加速键的键值 。 (4)按同样的方法 , 为菜单项 ID_TEST_RETURN添加加速键 Ctrl+2。 需要说明的是 , 为了使其他用户能查看并使用该加速键 , 还需在相应的菜单项文本后面添加 加速键内容 。 例如 , 可将 ID_VIEW_TES

27、T菜单项的标题改成 “ 显示测试菜单 ( / 产生一个空菜单 BOOL CreatePopupMenu( ); / 产生一个空的弹出式子菜单 装入菜单资源 需调用 CMenu成员函数 LoadMenu, 再用 SetMenu对应用程序菜单进行重新设置 。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); lpszResourceName为菜单资源名称, nIDResource为菜单资源 ID号。 添加菜单项 可以调用 AppendMenu或 InsertMenu函数来添加菜单项 。 App

28、endMenu是将菜单项添加在菜单 的末尾处 , InsertMenu在指定位置处插入菜单项 , 将后面的菜单项依次下移 。 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

29、= NULL ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); nIDNewItem表示新菜单项的 ID号, lpszNewItem表示新菜单项的内容, pBmp用于菜单项 的位图指针, nPosition表示新菜单项要插入的菜单项位置。 nFlags表示要增加的新菜单项 的状态信息。 2菜单 注意: l 当 nFlags为 MF_BYPOSITION时 , nPosition表示新菜单项要插入的具体位置 , 为 0时表示 第一个菜单项 , 为 -1时 , 将菜单项添

30、加菜单的末尾处 。 l nFlags的标志中 , 可以用 “ |”(按位或 )来组合 。 有些组合是不允许的 , 例如 MF_DISABLED、 MF_ENABLED和 MF_GRAYED, MF_STRING、 MF_OWNERDRAW、 MF_SEPARATOR和 位图 , MF_CHECKED和 MF_UNCHECKED 都不能组合在一起 。 l当菜单项增加后 , 不管菜单依附的窗口是否改变 , 都应调用 CWnd:DrawMenuBar来更 新菜单 。 2菜单 删除菜单项 DeleteMenu函数可将菜单项删除 , 注意: 调用该函数后 , 不管菜单依附的窗 口是否改变 , 都应调用

31、CWnd:DrawMenuBar使菜单更新 。 函数原型: BOOL DeleteMenu( UINT nPosition, UINT nFlags ); nPosition表示要删除菜单项位置,由 nFlags进行说明。 nFlags为 MF_BYCOMMAND时, nPosition表示菜单项 ID号, nFlags为 MF_BYPOSITION 时, nPosition表示菜单项的位置。 获取菜单项 下面四个 CMenu成员函数分别获得菜单的项数 、 菜单项的 ID号 、 菜单项的文 本内容以及弹出式子菜单的句柄 。 UINT GetMenuItemCount( ) const;/用来获

32、得菜单的菜单项数 。 UINT GetMenuItemID( int nPos ) const;/用来获得由 nPos指定菜单项位 置的菜单项的标识号 。 int GetMenuString( UINT nIDItem, CString /获得由 nIDItem指定菜单项位置的菜单项的文本内容 , 由 rString参数返回 , nFlags为 MF_BYPOSITION时 , nPosition表示菜单项的位 置 。 CMenu* GetSubMenu( int nPos ) const; /用来获得指定菜单的弹出式菜 单的菜单句柄 。 2菜单 示例 示例过程利用 CMenu成员函数向应用程

33、序菜单中添加并处理一个菜单项: (1) 打开前面的单文档应用程序 Ex_SDI或重新创建 。 (2) “查看 ” 菜单 “ Resource Symbols”, 如图 。 (3) 单击 新建 , 如图 。 在名字框中输入标识符 ID_NEW_MENUITEM。 在值框中 输入 ID的值 , 单击 确定 。 2菜单 (4) 关闭 “ 资源符号 ” 对话框 , 在 CMainFrame:OnCreate函数中添加下列代码 。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSysMenu = GetMenu(); /

34、 获得程序菜单指针 CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/获得第二个子菜单的指针 CString StrMenuItem(新的菜单项 ); pSubMenu-AppendMenu(MF_SEPARATOR); / 增加一水平分隔线 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem); / 在子菜单中增加一菜单项 / 允许使用 ON_UPDATE_COMMAND_UI或 ON_COMMAND的菜单项 m_bAutoMenuEnable = FALSE; / 关闭系统自动更新菜单状态 p

35、SysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); / 激活菜单项 DrawMenuBar(); / 更新菜单 return 0; 2菜单 (5) 用 MFC ClassWizard处理 OnCommand消息并检测用户菜单的 nID参数 。 BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字节表示菜单 、 控件 、 加速键的命令 ID if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(

36、你选中了新的菜单项 ); return CFrameWnd:OnCommand(wParam, lParam); (6)编译运行并测试 。 这样当选择菜单 “ 编辑 ” “ 新的菜单项 ” 命令后 , 就会 弹一个对话框 , 显示 “ 你选中了新的菜单项 ” 消息 。 2菜单 2.4使用快捷菜单 快捷菜单实现函数 用资源编辑器和 MFC库的 CMenu:TrackPopupMenu函数可以创建这样的菜单 , CMenu:TrackPopupMenu函数原型: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT

37、lpRect = NULL ); 用来显示一个浮动的弹出式菜单。 nFlags表示菜单在屏幕显示的位置以及鼠 标按钮标志,如表。 x和 y表示菜单的水平坐标和菜单的顶端的垂直坐标。 pWnd表示弹出菜单的窗口,此窗口将收到菜单全部的 WM_COMMAND消息。 lpRect是一个 RECT结构或 CRect对象指针,表示一个矩形区域,单击这个区 域时,弹出菜单不消失。 lpRect为 NULL时,在菜单外面单击鼠标,菜单立刻 消失。 2菜单 示例 显示主菜单 IDR_MAINFRAME时 , 右击鼠标弹出 “ 查看 ” 菜单的子菜单 , 显示菜单 IDR_MENU1时 , 右击鼠标弹出 “ 测

38、试 ” 菜单的子菜单 。 具体步骤: (1) 打开前面的单文档应用程序 Ex_SDI。 (2) 在 CMainFrame类添加 WM_CONTEXTMENU消息映射 , 函数代码 。 void CMainFrame:OnContextMenu(CWnd* pWnd, CPoint point) CMenu* pSysMenu = GetMenu(); / 获得程序菜单指针 int nCount = pSysMenu-GetMenuItemCount(); / 获得顶层菜单个数 int nSubMenuPos = -1; for (int i=0; iGetMenuString(i, str,

39、MF_BYPOSITION); if (str.Left(4) =查看 ) | (str.Left(4) =测试 ) nSubMenuPos = i; break; if (nSubMenuPosGetSubMenu( nSubMenuPos) -TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); (3)编译运行并测试。 3工具栏 3.1使用工具栏编辑器 创建一个新的工具栏按钮 双击新建的工具栏中最右端的空按钮弹出属性框,在 ID框中输入名称,右端出现一个 空按钮。单击该按钮,在资源编辑器的工具按钮设计窗

40、口内进行编辑,这个编辑就是 绘制一个工具按钮的位图。 移动一个按钮 鼠标左键点中它并拖动至相应位置。如果用户拖动它离开工具栏位置,则此按钮从工 具栏中消失。若在移动一个按钮的同时,按下 Ctrl键,则在新位置复制一个按钮,新位 置可以是同一个工具栏中的其他位置,也可以在不同的工具栏中。 删除一个按钮 将选取中的按钮拖离工具栏就消失了。若选中按钮, Delete键不能删除,将按钮中的 图形全部以背景色填充。 在工具栏中插入空格 如果按扭前没有任何空格 , 拖动该按钮向右移动并当覆盖相邻按钮的一半以上时 , 释 放鼠标键 , 则此按钮前出现空格 。 如果按钮前有空格而按钮后没有空格 , 拖动该按钮

41、向左移动并当按钮的左边界接触到 前面按钮时 , 释放鼠标键 , 则此按钮后将出现空格 。 如果按钮前后均有空格 , 拖动该按钮向右移动并当接触到相邻按钮时 , 则此按钮前的 空格保留 , 按钮后的空格消失 。 相反 , 拖动该按钮向左移动并当接触到前一个相邻按 钮时 , 则此按钮前面的空格消失 , 后面的空格保留 。 3工具栏 工具栏按钮属性的设置 3工具栏 3.2工具按钮和菜单项相结合 指选择工具按钮或菜单命令时 , 操作结果是一样的 。 使它们结合的具体方法 是在工具按钮的属性对话框中将按钮的 ID号设置为相关联的菜单项 ID。 例如 :示例是在前面 Ex_SDI上进行的 , 通过两个工具

42、按钮分别显示主菜单 IDR_MAINFRAME和菜单 IDR_MENU1。 具体步骤: (1) 打开前面的单文档应用程序 Ex_SDI。 (2) 利用工具栏编辑器设计两个工具按钮 , 如图 。 3工具栏 (3) 双击设计的第一个工具按钮 , 将工具按钮的 ID号设为 ID_TEST_RETURN, 在提 示框内键入 “ 返回应用程序主菜单 n返回主菜单 ” 。 (4) 双击设计的第二个工具按钮 , 将工具按钮的 ID号设为 ID_VIEW_TEST, 在提示 框内键入 “ 显示测试菜单 n显示测试菜单 ” 。 (5) 编译运行并测试 。 将鼠标移至设计的第一个工具按钮处 , 这时在状态栏上 显

43、示出 “ 返回应用程序主菜单 ” 信息 , 若稍等片刻后 , 还会弹出提示小窗口 , 显示出 “ 返回主菜单 ” 字样 , 如图 。 单击新添加的这两个按钮 , 会执行相应 的菜单命令 。 3工具栏 3.3多个工具栏的使用 操作步骤如下: (1) 打开前面的单文档应用程序 Ex_SDI。 (2) 将工作区切换到 ResourceView, 展开 Toolbar(工具栏 )资源 , 用鼠标单击 IDR_MAINFRAME不松开 , 按 Ctrl, 将 IDR_MAINFRAME拖到 Toolbar资源名称上 。 (3)右击工具栏资源 IDR_MAINFRAME1, 选择 Properties命令

44、 , 如图 。 (4)双击 IDR_TOOLBAR1, 按图删除不要的工具按钮 。 (5)在 CMainFrame类中添加一个成员变量 m_wndTestBar, 变量类型为 CToolBar。 CToolBar类封装了工具栏的操作 。 3工具栏 (6) 在 CMainFrame:OnCreate函数中添加下面的工具栏创建代码: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1) return -1; int nRes = m_wndTestBar

45、.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(0,0,0,0), AFX_IDW_TOOLBAR + 10); if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SI

46、ZE_DYNAMIC) | !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) TRACE0(Failed to create toolbarn); return -1; / fail to create if (!nRes | !m_wndTestBar.LoadToolBar(IDR_TOOLBAR1) TRACE0(Failed to create toolbarn); return -1; / fail to create m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndTestBar.EnableDock

47、ing(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar( DockControlBar( return 0; 3工具栏 (7)编译运行,如图。 (8) 需要调用 CFrameWnd类的成员函数 ShowControlBar来使程序一开始运行时隐 藏工具栏 IDR_TOOLBAR1。 在 CMainFrame:OnCreate中添加代码: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) ShowControlBar( / 关闭测试工具栏 return 0;

48、3工具栏 (9) 在 CMainFrame:OnViewTest和 CMainFrame:OnTestReturn中添加代码: void CMainFrame:OnViewTest() ShowControlBar( / 显示测试工具栏 ShowControlBar( / 关闭主工具栏 void CMainFrame:OnTestReturn() ShowControlBar( / 关闭测试工具栏 ShowControlBar( / 显示主工具栏 (10) 编译运行并测试 , 如图 , 左边开始运行的结果 , 右边是单击按钮运行的结 果 。 4状态栏 4.1状态栏的定义 AppWizard创建

49、的 SDI或 MDI应用程序框架中 , 有一个静态的 indicator数组 , 是在 MainFrm.cpp文件中定义的 , 被 MFC用作状态栏的定义 。 数组中的元素是一些标识常量或是字串资源的 ID号 。 图列出了 indicators数 组元素与标准状态栏窗格的关系 。 Static UINT indicators= ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, 图 28 indicators数组的定义 4状态栏 4.2状态栏的常用操作 增加和减少窗格 在状态栏中增加信息行窗格,在 indi

50、cators数组中增加一个 ID_SEPARATOR标 识;在状态栏中增加指示器窗格,在 indicators数组中增加一个在字符串表中 定义过的资源 ID。状态栏减少一个窗格,只需减少 indicators数组元素。 在状态栏上显示文本 调用 CStatusBar:SetPaneText函数更新任何窗格中的文本 。 函数原型: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 示例 (1) 创建一个默认的单文档应用程序 Ex_SDIMouse。 (2) 将工作区切换到 ClassView页面 ,

51、 展开 CMainFrame, 双击 CMainFrame, 在文 档窗口中出现该函数的定义 , 在它的前面就是状态栏数组的定义 。 (3) 将状态栏 indicators数组的定义改为下列代码: static UINT indicators = ID_SEPARATOR, ID_SEPARATOR, ; 4状态栏 (4) 在 CEx_SDIMouseView 类 中 添 加 CMainFrame 类 的 代 码 。 CEx_SDIMouseView:OnMouseMove代码: void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint poi

52、nt) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 获得主窗口指针 CStatusBar* pStatus= / 获得主窗口中的状态栏指针 if (pStatus) str.Format(X=%d, Y=%d,point.x, point.y); / 格式化文本 pStatus-SetPaneText(1,str); / 更新第二个窗格的文本 CView:OnMouseMove(nFlags, point); 4状态栏 (5) 将 MainFrm.h文件中的受保护变量 m_wndStatusBar

53、变成公共变量 。 (6) 在 Ex_SDIMouseView.cpp文件的开始处增加下列语句: #include Ex_SDIMouseView.h #include MainFrm.h“ (7)编译并运行 , 如图 。 4状态栏 4.3改变状态栏的风格 在 MFC的 CStatusBar类中 , 有两个成员函数可以改变状态栏风格 , 它们是: void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); void SetPaneStyle( int nIndex, UINT nStyle ); 参数 nIndex表示要

54、设置的状态栏窗格的索引, nID为状态栏窗格指定新的 ID, cxWidth表示窗格的像素宽度, nStyle表示窗格的风格类型,指定窗格的外观, 例如 SBPS_POPOUT表示窗格是凸起来的,见表。 5交互对象的动态更新 在前面 Ex_SDI基础上,单击工具按钮,该按钮被按下,按钮弹起,单击工具按钮时, 该按钮被按下,按钮弹起,如此反复。具体步骤: (1) 打开上例的单文档应用程序项目 Ex_SDI。 (2) 为 CMainFrame添加一个 BOOL型的成员变量 m_bMainWork, 将 m_bMainWork的初值设为 TRUE。 (3) 在 CMainFrame 类 中 添 加

55、工 具 按 钮 ID_VIEW_TEST 和 ID_TEST_RETURN 的 UPDATE_COMMAND_UI消息映射函数 , 添加代码: void CMainFrame:OnUpdateViewTest(CCmdUI* pCmdUI) pCmdUI-Enable( TRUE ); pCmdUI-SetCheck( !m_bMainWork ); void CMainFrame:OnUpdateTestReturn(CCmdUI* pCmdUI) pCmdUI-Enable( TRUE ); pCmdUI-SetCheck( m_bMainWork ); 5交互对象的动态更新 (4)在 C

56、MainFrame:OnViewTest和 CMainFrame:OnTestReturn添加代码: void CMainFrame:OnViewTest() m_bMainWork = FALSE; void CMainFrame:OnTestReturn() m_bMainWork = TRUE; (5)编译运行并测试 , 如图 。 6图标和光标 1使用图形编辑器 创建一个新的图标或光标 创建应用程序后,按快捷键 Ctrl+R打开 “ 插入资源 ” ,选择 Cursor(光标 )或 Icon(图标 )资源类型,单击 新建 。如图。 创建新图标或光标的时,图形编辑器先创建的是一个适合于 VG

57、A环境中的图 像,开始的时候它以屏幕色 (透明方式 )来填充。如表。 新设备按钮 6图标和光标 选用和定制显示设备 图形编辑器上,有一个 New Device Image按钮,单击,如图。 单击 定制 ,如图。 设置光标热点 借助光标 “ 热点 ” 确定光标实际的位置。如图。 设置热点按钮 6图标和光标 2图标 图标的调入和清除 CWinApp:LoadIcon可将一个图标资源调入并返回一个图标句柄 。 原型: HICON LoadIcon( LPCTSTR lpszResourceName ) const; HICON LoadIcon( UINT nIDResource ) const;

58、不想创建新的图标资源 , 可使用预定义的标准图标 , 调用 CWinApp:LoadStandardIcon , 原型: HICON LoadStandardIcon( LPCTSTR lpszIconName ) const; lpszIconName可以是下列值之一: IDI_APPLICATION 默认的应用程序图标 IDI_HAND 手形图标 (用于严重警告 ) IDI_QUESTION 问号图标 (用于提示消息 ) IDI_EXCLAMATION 警告消息图标 (惊叹号 ) IDI_ASTERISK 消息图标 DestroyIcon可以用来删除一个图标 , 释放为图标分配的内存 ,

59、原型: BOOL DestroyIcon( HICON hIcon );hIcon用来指定要删除的图标句柄 。 图标的绘制 函数 CDC:DrawIcon将一个图标绘制在指定的位置处 , 原型: BOOL DrawIcon( int x, int y, HICON hIcon ); BOOL DrawIcon( POINT point, HICON hIcon ); 6图标和光标 应用程序图标的改变 使用 GetClassLong和 SetClassLong重新指定应用程序窗口的图标 , 原型: DWORD SetClassLong( HWND hWnd, int nIndex, LONG d

60、wNewLong); DWORD GetClassLong( HWND hWnd, int nIndex); hWnd用来指定窗口类句柄 , dwNewLong 用来指定新的 32位值 。 nIndex用来指 定与 WNDCLASSEX结构相关的索引 , 它可以是下列值之一 : GCL_HBRBACKGROUND 窗口类的 背景画刷句柄 GCL_HCURSOR 窗口类的 的光标句柄 GCL_HICON 窗口类的 的图标句柄 GCL_MENUNAME 窗口类的 的菜单资源名称 示例 例 Ex_Icon 改变应用程序图标 。 (1) 用 MFC AppWizard创建一个默认的单文档应用程序 Ex

61、_Icon。 (2) 新添四个图标资源 , 通过图像设备选择对话框 (参见图 32)。 图标资源 ID号 分别为默认的 IDI_ICON1 IDI_ICON4。 6图标和光标 (3) 用图形编辑器绘制图标 , 如图 。 (4) CMainFrame类添加成员函数 ChangeIcon。 函数代码: void CMainFrame:ChangeIcon(UINT nIconID) HICON hIconNew = AfxGetApp()-LoadIcon(nIconID); HICON hIconOld = (HICON)GetClassLong(m_hWnd, GCL_HICON); if (

62、hIconNew != hIconOld) DestroyIcon(hIconOld); SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew); RedrawWindow(); / 重绘窗口 6图标和光标 (5) 在 CMainFrame:OnCreate函数的最后添加计时器设置代码: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1) return -1; . SetTimer(1, 500, NULL)

63、; return 0; (6)为 CMainFrame类添加 WM_TIMER的消息映射函数,增加代码: void CMainFrame:OnTimer(UINT nIDEvent) static int icons = IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4; static int index = 0; ChangeIcon(iconsindex); index+; if (index3) index = 0; CFrameWnd:OnTimer(nIDEvent); 6图标和光标 (7) 为 CMainFrame类添加 WM_DESTROY的消息映射函数 , 增加代码: void CMainFrame:OnDestroy() CFrameWnd:OnDestroy(); KillTimer(1); KillTimer函数是 CWnd类成员函数 , 用来停止 WM_TIMER消息的传送 , 其函数 参数值用指定要停用的计时器标识值 。 (8)编译并运行 。 可以看到任务栏上的按钮以及应用程序的标题栏上四个图标循 环显示的动态效果 , 显示速度为每秒两帧 。 6图标和光标

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!