




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章框架窗口界面设计 6 1框架窗口6 2菜单6 3工具栏6 4状态栏6 5交互对象的动态更新6 6图标和光标 6 1框架窗口 6 1 1单文档和多文档程序框架窗口文档应用程序的MFC类结构如图是单文档应用程序Ex SDI和多文档应用程序Ex MDI的MFC类结构 CAboutDlg是每一个应用程序框架都有的 用来显示本程序的有关信息 CEx SDIApp和CEx MDIApp是应用程序类 是从CWinApp类派生而来 负责应用程序创建 运行和终止 每一个应用程序都需要这样的类 CEx SDIDoc和CEx MDIDoc是文档类 它们是从CDocument类派生而来 负责应用程序文档数据管理 CEx SDIView和CEx MDIView是视图类 它们既可以从基类CView派生 也可以从CView派生类派生 负责数据的显示 绘制和其他用户交互 CMainFrame类是用来负责主框架窗口的显示和管理 包括工具栏和状态栏等界面元素的初始化 对于单文档应用程序来说 主框架窗口类是从CFrameWnd派生而来的 而对于多文档应用程序程序 主框架窗口是从CMDIFrameWnd派生的 6 1框架窗口 CChildFrame类是从CMDIChildWnd派生而来 专门用来管理多文档应用程序中的文档窗口 无论是CMDIChildWnd还是CMDIFrameWnd类 它们都是从CFrameWnd派生而来的 对于基于对话框的应用程序 一般有CAboutDlg类 应用程序类和对话框类 上述MFC类之间的继承和派生关系如图6 2所示 6 1框架窗口 项目的文件组织项目中源文件都是采用文件夹的方式进行管理的 将项目名作为文件夹名 此文件夹下包含源程序代码文件 项目文件以及项目工作区文件等 每一个类的源代码均保存同名的h和cpp文件 其他一些文件类型的含义 opt关于开发环境的参数文件 如工具条位置等信息 aps AppStudioFile 资源辅助文件 二进制格式 clwClassWizard信息文件 dsp DeveloperStudioProject 项目文件 plg编译信息文件 mdp MicrosoftDevStudioProject 旧版本的项目文件 bsc用于浏览项目信息 map执行文件的映像信息纪录文件 pch Pre CompiledFile 预编译文件 可以加快编译速度 但是文件非常大 pdb ProgramDatabase 记录程序有关的一些数据和调试信息 ncb无编译浏览文件 nocompilebrowser 还有相应的Debug 调试 Res 资源 等子文件夹 用应用程序向导创建项目时 系统自动为项目创建Win32Debug版本的运行程序 并使用相应的默认配置 程序编连后 用于该项目的可执行文件以及其他调试的信息文件都安放在Debug文件夹中 程序项目有一个Win32Release版本 与Release的区别在于 Debug版本的运行程序有相应的调试信息码 Release版本的运行程序没有 但Release版本的运行程序经过代码的优化 其程序的运行效率被最大提升 选择 编译 配置 菜单命令 在 配置 对话框将项目设置成Win32Release版本 6 1框架窗口 主框架窗口和文档窗口主框架窗口是直接放置在桌面 DeskTop 上的那个窗口 每个应用程序只能有一个主框架窗口 主框架窗口负责管理各个用户交互对象并根据用户操作相应地创建或更新文档窗口及其视图 文档窗口对SDI程序来说 和主框架窗口是一致的 主框架窗口就是文档窗口 对于MDI程序 文档窗口是主框架窗口的子窗口 如图 文档窗口一般都有相应的可见边框 它的客户区 除了窗口标题栏 边框外的区域 是由相应的视图来构成的 因此可以说视图是文档窗口内的子窗口 文档窗口时刻跟踪当前处于活动状态的视图的变化 并将用户或系统产生的消息传递给当前活动视图 6 1框架窗口 6 1 2窗口状态的改变MFCAppWizard为每个窗口设置了相应的大小和位置 运行程序时 会自动调用框架内部的WinMain函数 并自动查找该应用程序类的全局变量theApp 然后自动调用用户应用程序类的虚函数InitInstance 该函数会进一步调用相应的函数来完成主窗口的构造和显示工作 代码 BOOLCEx SDIApp InitInstance m pMainWnd ShowWindow SW SHOW 显示窗口m pMainWnd UpdateWindow 更新窗口returnTRUE m pMainWnd是主框架窗口指针变量 ShowWindow是CWnd类的成员函数 用来按指定的参数显示窗口 6 1框架窗口 通过指定ShowWindow函数的参数值可以改变改变窗口显示状态 例如下面的代码是将窗口的初始状态设置为 最小化 BOOLCEx SDIApp InitInstance m pMainWnd ShowWindow SW SHOWMINIMIZED m pMainWnd UpdateWindow returnTRUE 6 1框架窗口 6 1 3窗口风格的设置窗口风格通常有一般和扩展两种形式 可在函数CWnd Create或CWnd CreateEx参数中指定 CreateEx函数可同时支持以上两种风格 CWnd Create只能指定窗口的一般风格 控件和对话框的窗口风格可直接通过其属性对话框来设置 除了上述风格外 框架窗口还有以下三个自己的风格 它们都可以在PreCreateWindow重载函数的CREATESTRUCT结构中指定 FWS ADDTOTITLE该风格指定相关的信息如文档名添加到框架窗口标题的后面 FWS PREFIXTITLE该风格使得框架窗口标题中的文档名显示在应用程序名之前 FWS SNAPTOBARS该风格用来调整窗口的大小 使它刚好包含了框架窗口中的控制栏 6 1框架窗口 在MFCAppWizard中进行修改 1 选择 文件 新建 选择 工程 选择MFCAppWizard exe 的项目类型 指定项目工作文件夹位置 输入项目名Ex SDI 单击 确定 按钮 2 在向导的第一步中 将应用程序类型选为 单个文档 SDI 3 单击 下一个 如图 可以选择程序中是否加入数据库的支持 4 单击 下一个 出现向导的第三步对话框 如图 允许在程序中加入复合文档 自动化 ActiveX控件的支持 6 1框架窗口 5 单击 下一个 如图 对话框的前几项依次确定对浮动工具条 打印与预览以及通信网络等特性的支持 对话框的最后两项是最近文件列表数目的设置 默认时为4 和一个 高级 按钮 6 1框架窗口 6 在第四步对话框中 单击 高级 如图 分别用于文档模板字串资源内容和窗口风格的修改 6 1框架窗口 7 单击 关闭 单击 下一个 如图 可选择 应用程序的主窗口是MFC标准风格还是窗口左边有切分窗口的浏览器风格 在源文件中是否加入注释用来引导用户编写程序代码 是使用动态链接库 DLL 还是静态链接库 8 单击 下一个 按钮 出现如图6 9所示的对话框 在这里 用户可以对MFCAppWizard提供的默认类名 基类名 各个源文件名进行修改 6 1框架窗口 9 单击 完成 单击 确定 回到主界面 在向导中作出的选择 有部分内容反映在CEx SDIApp InitInstance函数中 代码 BOOLCEx SDIApp InitInstance 若用户在MFCAppWizard的第三步中 选中了 ActiveXControls 则表示所创建的应用程序支持ActiveX控件AfxEnableControlContainer 若用户在MFCAppWizard的第四步中 选中了 3Dcontrols 则表示所创建的应用程序支持3D控件风格 ifdef AFXDLLEnable3dControls 使用MFC动态链接库的3D控件 elseEnable3dControlsStatic 使用MFC静态链接库的3D控件 endif 在Windows系统注册表中登记应用程序的主键值 以便将一些与应用程序 相关的参数存放在该主键值下SetRegistryKey T LocalMFCAppWizard GeneratedApplications 从注册表中调入应用程序的一些标准参数值 其中包括最近文件列表的文件名LoadStdProfileSettings returnTRUE 6 1框架窗口 修改CREATESTRUCT结构窗口创建前 自动调用PreCreateWindow虚函数 用MFCAppWizard创建文档应用程序结构时 MFC已为主窗口或文档窗口类自动重载了该虚函数 可以在此函数中通过修改CREATESTRUCT结构来设置窗口的绝大多数风格 对于多文档应用程序 文档窗口的风格可用下列的代码更改 BOOLCChildFrame PreCreateWindow CREATESTRUCT 6 1框架窗口 使用ModifyStyle和ModifyStyleExModifyStyleEx可更改窗口的扩展风格 两个函数具有相同的参数 含义 BOOLModifyXXXX DWORDdwRemove DWORDdwAdd UINTnFlags 0 参数dwRemove指定需要删除的风格 dwAdd指定需要增加的风格 nFlags表示SetWindowPos的标志 框架窗口设定扩展风格只能通过调用ModifyStyle函数来进行 例如用MFCClassWizard为一个多文档应用程序Ex MDI的子文档窗口类CChildFrame添加OnCreateClient消息处理 并增加下列代码 BOOLCChildFrame OnCreateClient LPCREATESTRUCTlpcs CCreateContext pContext ModifyStyle 0 WS VSCROLL 0 returnCMDIChildWnd OnCreateClient lpcs pContext 6 1框架窗口 6 1 4改变窗口的大小和位置CWnd类的成员函数SetWindowPos或MoveWindow可以改变窗口的大小和位置 SetWindowPos可以改变窗口的大小 位置 还可以改变所有窗口在堆栈排列的次序 Z次序 这个次序是根据它们在屏幕出现的先后来确定的 BOOLSetWindowPos constCWnd pWndInsertAfter intx inty intcx intcy UINTnFlags 参数pWndInsertAfter表示窗口对象指针 下列预定义窗口对象的地址 wndBottom将窗口放置在Z次序中的底层wndTop将窗口放置在Z次序中的顶层wndTopMost设置最顶窗口wndNoTopMost将窗口放置在所有最顶层的后面 若此窗口不是最顶窗口 则此标志无效 x和y表示窗口新的左上角坐标 cx和cy分别表示表示窗口新的宽度和高度 nFlags表示窗口新的大小和位置方式 6 1框架窗口 函数CWnd MoveWindow也可用来改变窗口的大小和位置 必须在MoveWindow函数中指定窗口的大小 voidMoveWindow intx inty intnWidth intnHeight BOOLbRepaint TRUE voidMoveWindow LPCRECTlpRect BOOLbRepaint TRUE 参数x和y表示窗口新的左上角坐标 nWidth和nHeight表示窗口新的宽度和高度 bRepaint用于指定窗口是否重绘 lpRect表示窗口新的大小和位置 例如 在CEx SDIApp InitInstance中 returnTRUE 语句之前添加下列代码 可以使主框架窗口移动到屏幕的 100 100 处 若使用SetWindowPos函数 则可以有m pMainWnd SetWindowPos NULL 100 100 0 0 SWP NOSIZE SWP NOZORDER 或使用MoveWindow函数 则有CRectrcWindow m pMainWnd GetWindowRect rcWindow m pMainWnd MoveWindow 100 100 rcWindow Width rcWindow Height TRUE CRect是一个矩形类 GetWindowRect是一个CWnd类的成员函数 用来获取窗口在屏幕的位置和大小 6 2菜单 许多程序员对于菜单的设计都遵循下列一些规则 l若选择某菜单项会弹出一对话框 那么在该菜单项文本后有 l若某项菜单有子菜单 那么在该菜单项文本后有 l若菜单项需要助记符 用括号将带下划线的字母括起来 助记符与Alt构成一个组合键 当按住 Alt 键不放 敲击该字母时 对应的菜单项就会被选中 l若某项菜单需要快捷键的支持 则一般将其列在相应菜单项文本之后 所谓 快捷键 是一个组合键 如Ctrl N 使用时是先按下 Ctrl 健不放 然后再按 N 键 任何时候按下快捷键 相应的菜单命令都会被执行 图6 11菜单样例子 6 2菜单 6 2 1更改应用程序菜单菜单 文件 打开工作区 在工作区中选择ResourceView页面 双击资源 Menu 中的IDR MAINFRAME 通过菜单编辑器修改菜单资源IDR MAINFRAME 可以为程序重新指定一个菜单 下面的示例过程 1 打开前面的单文档应用程序Ex SDI 2 按快捷键Ctrl R 在资源类型中选定 Menu 如图 3 单击 新建 如图 6 2菜单 4 在Menu的ID MENU1上右击鼠标 选择 Properties 命令 如图 可以重新指定菜单资源ID 设置菜单资源的语言和条件 这个条件用来决定菜单资源包含到哪个环境中 例如当指定条件为 DEBUG 则菜单资源只存在于Debug编译环境中 5 菜单ID MENU1添加一个顶层弹出菜单项 测试 T 并在该菜单下添加一个子菜单项 返回 R ID设为ID TEST RETURN 如图 6 打开Ex SDI程序菜单资源IDR MAINFRAME 在 查看 菜单的最后添加一个子菜单项 显示测试菜单 M ID设为ID VIEW TEST 7 为CMainFrame类添加一个CMenu类型的成员变量m NewMenu CMenu类是用来处理菜单的一个MFC类 6 2菜单 8 按快捷键Ctrl W 切换到MessageMaps页面 从 Classname 列表中选择CMainFrame 分别为菜单项ID VIEW TEST和ID TEST RETURN添加COMMAND消息映射 使用默认的消息映射函数名 并添中下列代码 voidCMainFrame OnViewTest m NewMenu Detach 使菜单对象和菜单句柄分离m NewMenu LoadMenu IDR MENU1 SetMenu NULL 清除应用程序菜单SetMenu LoadMenu装载菜单资源 Detach使菜单对象与菜单句柄分离 调用LoadMenu后 菜单对象m NewMenu就拥有一个菜单句柄 再次调用LoadMenu时 发生运行时错误 当菜单对象与菜单句柄分离后 就可以再创建菜单 SetMenu是CWnd类的一个成员函数 用来设置应用程序的菜单 9 编译运行并测试 6 2菜单 6 2 2使用键盘快捷键通过上述的菜单系统 可以选择几乎所有可用的命令和选项 保证了菜单命令系统的完整性 菜单系统操作效率不高 对于那些反复使用的命令 有必要进一步提高效率 于是加速键应运而生 一个加速键就是一个按键或几个按键的组合 用于激活特定的命令 加速键也是一种资源 例如 为前面两个菜单ID VIEW TEST和ID TEST RETURN定义键盘快捷键 1 打开上例的工作区窗口中Accelerator的资源项 双击IDR MAINFRAME 如图 6 2菜单 2 建立一新的加速键 双击加速键列表的最下端的空行 弹出如图的 AccelProperities 加速键属性 对话框 可设置的属性如表 6 2菜单 3 选择Ex SDI添加的 显示测试菜单 菜单项ID VIEW TEST作为要联用的加速键的ID号 然后单击 下一键 按钮 并按下Ctrl 1作为此加速键的键值 4 按同样的方法 为菜单项ID TEST RETURN添加加速键Ctrl 2 需要说明的是 为了使其他用户能查看并使用该加速键 还需在相应的菜单项文本后面添加加速键内容 例如 可将ID VIEW TEST菜单项的标题改成 显示测试菜单 M tCtrl 1 其中 t 是将后面的 Ctrl 1 定位到一个水平制表位 5 编译运行并测试 当程序运行后 按 Ctrl 1 和 Ctrl 2 将执行相应的菜单命令 6 2菜单 6 2 3菜单的编程控制创建菜单CreateMenu和CreatePopupMenu用来创建一个菜单或子菜单框架 原型 BOOLCreateMenu 产生一个空菜单BOOLCreatePopupMenu 产生一个空的弹出式子菜单装入菜单资源需调用CMenu成员函数LoadMenu 再用SetMenu对应用程序菜单进行重新设置 BOOLLoadMenu LPCTSTRlpszResourceName BOOLLoadMenu UINTnIDResource lpszResourceName为菜单资源名称 nIDResource为菜单资源ID号 添加菜单项可以调用AppendMenu或InsertMenu函数来添加菜单项 AppendMenu是将菜单项添加在菜单的末尾处 InsertMenu在指定位置处插入菜单项 将后面的菜单项依次下移 BOOLAppendMenu UINTnFlags UINTnIDNewItem 0 LPCTSTRlpszNewItem NULL BOOLAppendMenu UINTnFlags UINTnIDNewItem constCBitmap pBmp BOOLInsertMenu UINTnPosition UINTnFlags UINTnIDNewItem 0 LPCTSTRlpszNewItem NULL BOOLInsertMenu UINTnPosition UINTnFlags UINTnIDNewItem constCBitmap pBmp nIDNewItem表示新菜单项的ID号 lpszNewItem表示新菜单项的内容 pBmp用于菜单项的位图指针 nPosition表示新菜单项要插入的菜单项位置 nFlags表示要增加的新菜单项的状态信息 6 2菜单 注意 l当nFlags为MF BYPOSITION时 nPosition表示新菜单项要插入的具体位置 为0时表示第一个菜单项 为 1时 将菜单项添加菜单的末尾处 lnFlags的标志中 可以用 按位或 来组合 有些组合是不允许的 例如MF DISABLED MF ENABLED和MF GRAYED MF STRING MF OWNERDRAW MF SEPARATOR和位图 MF CHECKED和MF UNCHECKED都不能组合在一起 l当菜单项增加后 不管菜单依附的窗口是否改变 都应调用CWnd DrawMenuBar来更新菜单 6 2菜单 删除菜单项DeleteMenu函数可将菜单项删除 注意 调用该函数后 不管菜单依附的窗口是否改变 都应调用CWnd DrawMenuBar使菜单更新 函数原型 BOOLDeleteMenu UINTnPosition UINTnFlags nPosition表示要删除菜单项位置 由nFlags进行说明 nFlags为MF BYCOMMAND时 nPosition表示菜单项ID号 nFlags为MF BYPOSITION时 nPosition表示菜单项的位置 获取菜单项下面四个CMenu成员函数分别获得菜单的项数 菜单项的ID号 菜单项的文本内容以及弹出式子菜单的句柄 UINTGetMenuItemCount const 用来获得菜单的菜单项数 UINTGetMenuItemID intnPos const 用来获得由nPos指定菜单项位置的菜单项的标识号 intGetMenuString UINTnIDItem CString 用来获得指定菜单的弹出式菜单的菜单句柄 6 2菜单 示例示例过程利用CMenu成员函数向应用程序菜单中添加并处理一个菜单项 1 打开前面的单文档应用程序Ex SDI或重新创建 2 查看 菜单 ResourceSymbols 如图 3 单击 新建 如图 在名字框中输入标识符ID NEW MENUITEM 在值框中输入ID的值 单击 确定 6 2菜单 4 关闭 资源符号 对话框 在CMainFrame OnCreate函数中添加下列代码 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct CMenu pSysMenu GetMenu 获得程序菜单指针CMenu pSubMenu pSysMenu GetSubMenu 1 获得第二个子菜单的指针CStringStrMenuItem 新的菜单项 pSubMenu AppendMenu MF SEPARATOR 增加一水平分隔线pSubMenu AppendMenu MF STRING ID NEW MENUITEM StrMenuItem 在子菜单中增加一菜单项 允许使用ON UPDATE COMMAND UI或ON COMMAND的菜单项m bAutoMenuEnable FALSE 关闭系统自动更新菜单状态pSysMenu EnableMenuItem ID NEW MENUITEM MF BYCOMMAND MF ENABLED 激活菜单项DrawMenuBar 更新菜单return0 6 2菜单 5 用MFCClassWizard处理OnCommand消息并检测用户菜单的nID参数 BOOLCMainFrame OnCommand WPARAMwParam LPARAMlParam wParam的低字节表示菜单 控件 加速键的命令IDif LOWORD wParam ID NEW MENUITEM MessageBox 你选中了新的菜单项 returnCFrameWnd OnCommand wParam lParam 6 编译运行并测试 这样当选择菜单 编辑 新的菜单项 命令后 就会弹一个对话框 显示 你选中了新的菜单项 消息 6 2菜单 6 2 4使用快捷菜单快捷菜单实现函数用资源编辑器和MFC库的CMenu TrackPopupMenu函数可以创建这样的菜单 CMenu TrackPopupMenu函数原型 BOOLTrackPopupMenu UINTnFlags intx inty CWnd pWnd LPCRECTlpRect NULL 用来显示一个浮动的弹出式菜单 nFlags表示菜单在屏幕显示的位置以及鼠标按钮标志 如表 x和y表示菜单的水平坐标和菜单的顶端的垂直坐标 pWnd表示弹出菜单的窗口 此窗口将收到菜单全部的WM COMMAND消息 lpRect是一个RECT结构或CRect对象指针 表示一个矩形区域 单击这个区域时 弹出菜单不消失 lpRect为NULL时 在菜单外面单击鼠标 菜单立刻消失 6 2菜单 示例显示主菜单IDR MAINFRAME时 右击鼠标弹出 查看 菜单的子菜单 显示菜单IDR MENU1时 右击鼠标弹出 测试 菜单的子菜单 具体步骤 1 打开前面的单文档应用程序Ex SDI 2 在CMainFrame类添加WM CONTEXTMENU消息映射 函数代码 voidCMainFrame OnContextMenu CWnd pWnd CPointpoint CMenu pSysMenu GetMenu 获得程序菜单指针intnCount pSysMenu GetMenuItemCount 获得顶层菜单个数intnSubMenuPos 1 for inti 0 iGetMenuString i str 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 编译运行并测试 6 3工具栏 6 3 1使用工具栏编辑器创建一个新的工具栏按钮双击新建的工具栏中最右端的空按钮弹出属性框 在ID框中输入名称 右端出现一个空按钮 单击该按钮 在资源编辑器的工具按钮设计窗口内进行编辑 这个编辑就是绘制一个工具按钮的位图 移动一个按钮鼠标左键点中它并拖动至相应位置 如果用户拖动它离开工具栏位置 则此按钮从工具栏中消失 若在移动一个按钮的同时 按下Ctrl键 则在新位置复制一个按钮 新位置可以是同一个工具栏中的其他位置 也可以在不同的工具栏中 删除一个按钮将选取中的按钮拖离工具栏就消失了 若选中按钮 Delete键不能删除 将按钮中的图形全部以背景色填充 在工具栏中插入空格如果按扭前没有任何空格 拖动该按钮向右移动并当覆盖相邻按钮的一半以上时 释放鼠标键 则此按钮前出现空格 如果按钮前有空格而按钮后没有空格 拖动该按钮向左移动并当按钮的左边界接触到前面按钮时 释放鼠标键 则此按钮后将出现空格 如果按钮前后均有空格 拖动该按钮向右移动并当接触到相邻按钮时 则此按钮前的空格保留 按钮后的空格消失 相反 拖动该按钮向左移动并当接触到前一个相邻按钮时 则此按钮前面的空格消失 后面的空格保留 6 3工具栏 工具栏按钮属性的设置 6 3工具栏 6 3 2工具按钮和菜单项相结合指选择工具按钮或菜单命令时 操作结果是一样的 使它们结合的具体方法是在工具按钮的属性对话框中将按钮的ID号设置为相关联的菜单项ID 例如 示例是在前面Ex SDI上进行的 通过两个工具按钮分别显示主菜单IDR MAINFRAME和菜单IDR MENU1 具体步骤 1 打开前面的单文档应用程序Ex SDI 2 利用工具栏编辑器设计两个工具按钮 如图 6 3工具栏 3 双击设计的第一个工具按钮 将工具按钮的ID号设为ID TEST RETURN 在提示框内键入 返回应用程序主菜单 n返回主菜单 4 双击设计的第二个工具按钮 将工具按钮的ID号设为ID VEW TEST 在提示框内键入 显示测试菜单 n显示测试菜单 5 编译运行并测试 将鼠标移至设计的第一个工具按钮处 这时在状态栏上显示出 返回应用程序主菜单 信息 若稍等片刻后 还会弹出提示小窗口 显示出 返回主菜单 字样 如图 单击新添加的这两个按钮 会执行相应的菜单命令 6 3工具栏 6 3 3多个工具栏的使用操作步骤如下 1 打开前面的单文档应用程序Ex SDI 2 将工作区切换到ResourceView 展开Toolbar 工具栏 资源 用鼠标单击IDR MAINFRAME不松开 按Ctrl 将IDR MAINFRAME拖到Toolbar资源名称上 3 右击工具栏资源IDR MAINFRAME1 选择Properties命令 如图 4 双击IDR TOOLBAR1 按图删除不要的工具按钮 5 在CMainFrame类中添加一个成员变量m wndTestBar 变量类型为CToolBar CToolBar类封装了工具栏的操作 6 3工具栏 6 在CMainFrame OnCreate函数中添加下面的工具栏创建代码 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if CFrameWnd OnCreate lpCreateStruct 1 return 1 intnRes m wndTestBar 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 nRes m wndTestBar LoadToolBar IDR TOOLBAR1 TRACE0 Failedtocreatetoolbar n return 1 failtocreate m wndToolBar EnableDocking CBRS ALIGN ANY m wndTestBar EnableDocking CBRS ALIGN ANY EnableDocking CBRS ALIGN ANY DockControlBar 6 3工具栏 7 编译运行 如图 8 需要调用CFrameWnd类的成员函数ShowControlBar来使程序一开始运行时隐藏工具栏IDR TOOLBAR1 在CMainFrame OnCreate中添加代码 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct ShowControlBar 6 3工具栏 9 在CMainFrame OnViewTest和CMainFrame OnTestReturn中添加代码 voidCMainFrame OnViewTest ShowControlBar 显示主工具栏 10 编译运行并测试 如图 左边开始运行的结果 右边是单击按钮运行的结果 6 4状态栏 6 4 1状态栏的定义AppWizard创建的SDI或MDI应用程序框架中 有一个静态的indicator数组 是在MainFrm cpp文件中定义的 被MFC用作状态栏的定义 数组中的元素是一些标识常量或是字串资源的ID号 图列出了indicators数组元素与标准状态栏窗格的关系 6 4状态栏 6 4 2状态栏的常用操作增加和减少窗格在状态栏中增加信息行窗格 在indicators数组中增加一个ID SEPARATOR标识 在状态栏中增加指示器窗格 在indicators数组中增加一个在字符串表中定义过的资源ID 状态栏减少一个窗格 只需减少indicators数组元素 在状态栏上显示文本调用CStatusBar SetPaneText函数更新任何窗格中的文本 函数原型 BOOLSetPaneText intnIndex LPCTSTRlpszNewText BOOLbUpdate TRUE 示例 1 创建一个默认的单文档应用程序Ex SDIMouse 2 将工作区切换到ClassView页面 展开CMainFrame 双击CMainFrame 在文档窗口中出现该函数的定义 在它的前面就是状态栏数组的定义 3 将状态栏indicators数组的定义改为下列代码 staticUINTindicators ID SEPARATOR ID SEPARATOR 6 4状态栏 4 在CEx SDIMouseView类中添加CMainFrame类的代码 CEx SDIMouseView OnMouseMove代码 voidCEx SDIMouseView OnMouseMove UINTnFlags CPointpoint CStringstr CMainFrame pFrame CMainFrame AfxGetApp m pMainWnd 获得主窗口指针CStatusBar pStatus 6 4状态栏 5 将MainFrm h文件中的受保护变量m wndStatusBar变成公共变量 6 在Ex SDIMouseView cpp文件的开始处增加下列语句 include Ex SDIMouseView h include MainFrm h 7 编译并运行 如图 6 4状态栏 6 4 3改变状态栏的风格在MFC的CStatusBar类中 有两个成员函数可以改变状态栏风格 它们是 voidSetPaneInfo intnIndex UINTnID UINTnStyle intcxWidth voidSetPaneStyle intnIndex UINTnStyle 参数nIndex表示要设置的状态栏窗格的索引 nID为状态栏窗格指定新的ID cxWidth表示窗格的像素宽度 nStyle表示窗格的风格类型 指定窗格的外观 例如SBPS POPOUT表示窗格是凸起来的 见表 6 5交互对象的动态更新 在前面Ex SDI基础上 单击工具按钮 该按钮被按下 按钮弹起 单击工具按钮时 该按钮被按下 按钮弹起 如此反复 具体步骤 1 打开上例的单文档应用程序项目Ex SDI 2 为CMainFrame添加一个BOOL型的成员变量m bMainWork 将m bMainWork的初值设为TRUE 3 在CMainFrame类中添加工具按钮ID VIEW TEST和ID TEST RETURN的UPDATE COMMAND UI消息映射函数 添加代码 voidCMainFrame OnUpdateViewTest CCmdUI pCmdUI pCmdUI Enable TRUE pCmdUI SetCheck m bMainWork voidCMainFrame OnUpdateTestReturn CCmdUI pCmdUI pCmdUI Enable TRUE pCmdUI SetCheck m bMainWork 6 5交互对象的动态更新 4 在CMainFrame OnViewTest和CMainFrame OnTestReturn添加代码 voidCMainFrame OnViewTest m bMainWork FALSE voidCMainFrame OnTestReturn m bMainWork TRUE 5 编译运行并测试 如图 6 6图标和光标 6 6 1使用图形编辑器创建一个新的图标或光标创建应用程序后 按快捷键Ctrl R打开 插入资源 选择Cursor 光标 或Icon 图标 资源类型 单击 新建 如图 创建新图标或光标的时 图形编辑器先创建的是一个适合于VGA环境中的图像 开始的时候它以屏幕色 透明方式 来填充 如表 新设备按钮 6 6图标和光标 选用和定制显示设备图形编辑器上 有一个NewDeviceImage按钮 单击 如图 单击 定制 如图 设置光标热点借助光标 热点 确定光标实际的位置 如图 设置热点按钮 6 6图标和光标 6 6 2图标图标的调入和清除CWinApp LoadIcon可将一个图标资源调入并返回一个图标句柄 原型 HICONLoadIcon LPCTSTRlpszResourceName const HICONLoadIcon UINTnIDResource const 不想创建新的图标资源 可使用预定义的标准图标 调用CWinApp LoadStandardIcon 原型 HICONLoadStandardIcon LPCTSTRlpszIconName const lpszIconName可以是下列值之一 IDI APPLICATION默认的应用程序图标IDI HAND手形图标 用于严重警告 IDI QUESTION问号图标 用于提示消息 IDI EXCLAMATION警告消息图标 惊叹号 IDI ASTERISK消息图标DestroyIcon可以用来删除一个图标 释放为图标分配的内存 原型 BOOLDestroyIcon HICONhIcon hIcon用来指定要删除的图标句柄 图标的绘制函数CDC DrawIcon将一个图标绘制在指定的位置处 原型 BOOLDrawIcon intx inty HICONhIcon BOOLDrawIcon POINTpoint HICONhIcon 6 6图标和光标 应用程序图标的改变使用GetClassLong和SetClassLong重新指定应用程序窗口的图标 原型 DWORDSetClassLong HWNDhWnd intnIndex LONGdwNewLong DWORDGetClassLong HWNDhWnd intnIndex hWnd用来指定窗口类句柄 dwNewLong用来指定新的32位值 nIndex用来指定与WNDCLASSEX结构相关的索引 它可以是下列值之一 GCL HBRBACKGROUND窗口类的背景画刷句柄GCL HCURSOR窗口类的的光标句柄GCL HICON窗口类的的图标句柄GCL MENUNAME窗口类的的菜单资源名称示例 1 用MFCAppWizard创建一个默认的单文档应用程序Ex Icon 2 新添四个图标资源 通过图像设备选择对话框 参见图6 32 图标资源ID号分别为默认的IDI ICON1 IDI ICON4 6 6图标和光标 3 用图形编辑器绘制图标 如图 4 CMainFrame类添加成员函数ChangeIcon 函数代码 voidCMainFrame ChangeIcon UINTnIconID HICONhIconNew AfxGetApp LoadIcon nIconID HICONhIconOld HICON GetClassLong m hWnd GCL HICON if hIconNew hIconOld DestroyIcon hIconOld SetClassLong m hWnd GCL HICON long hIconNew RedrawWindow 重绘窗口 6 6图标和光标 5 在CMainFrame OnCreate函数的最后添加计时器设置代码 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if CFrameWnd OnCreate lpCreateStruct 1 return 1 SetTimer 1 500 NULL return0 6 为CMainFrame类添加WM TIMER的消息映射函数 增加代码 voidCMainFrame OnTimer UINTnIDEvent staticinticons IDI ICON1 IDI ICON2 IDI ICON3 IDI ICON4 staticintindex 0 ChangeIcon icons index index if index 3 index 0 CFrameWnd OnTimer nIDEvent 6 6图标和光标 7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民爆岗前安全培训内容课件
- 宠物防治考试题库及答案
- 油田新质生产力发展路径与建议
- 现存安全问题剖析讲解
- 医护关系的理想境界
- 新质生产力紫金山实验室
- 煤炭行业新质生产力发展的误区与对策
- 关于社会实践的活动策划方案
- 综合办公领域的新质生产力应用
- 符合新质生产力要求的核心要素
- 水利工程建设项目安全生产 风险管控“六项机制”建设标准
- 2025广东广州市海珠区人民检察院招聘劳动合同制司法辅助人员5人笔试备考试题及答案解析
- 2025医学支气管哮喘防治考试题目及答案
- 2025年教育局遴选笔试重点解析
- 1.2 运动的描述 教学课件 人教版(2024)八年级物理上册
- 2025.8《江西省住宅物业服务区域安全管理工作指南》
- (2025年)广东省佛山市辅警协警笔试笔试真题(含答案)
- 绿色钻井技术-洞察及研究
- 公共艺术课件
- 临床胸腔闭式引流护理-中华护理学会团体标准
- 电气自动化基础知识课件
评论
0/150
提交评论