
第6章基本界面元素.ppt
54页第6章 基本界面元素,,6 . 1 图标和光标,,6 . 2 菜 单,,6 . 3 工 具 栏,,6 . 4 状 态 栏,,6 . 5 交互对象的动态更新,6 . 1 图标和光标,6.1.1 图像编辑器 1.创建一个新的图标或光标 图6.1所示是添加一个新的图标资源后出现的图像编辑器新设备按钮,6.1.1 图像编辑器,对于创建的新光标,其“热点”被初始化为左上角的点,坐标为(0,0)默认情况下,图像编辑器所支持的显示设备如表6.1所示6.1.1 图像编辑器,2.选用和定制显示设备 在图像编辑器工作窗口的控制条上,有一个“新设备图像”(New Device Image)按钮 ,单击此按钮后,系统弹出相应的新设备列表,可以从中选取需要的显示设备,如图6.2所示 除了对话框列表框显示的设备外,还可以单击 按钮,在弹出的对话框中定制新的显示设备,如图6.3所示,在这里可指定新设备图像的大小和颜色6.1.1 图像编辑器,3.设置光标热点 在图像编辑器的控制条上或光标属性对话框中都可以看到当前的光标“热点”位置图6.4所示是添加一个新的光标资源后出现的图像编辑器6.1.2 图标,1.图标的调入和清除 在MFC中,当在应用程序中添加一个图标资源后,就可以使用CWinApp::LoadIcon函数将其调入并返回一个图标句柄。
函数原型如下: HICON LoadIcon( LPCTSTR lpszResourceName ) const; HICON LoadIcon( UINT nIDResource ) const; 如果不想使用新的图标资源,也可使用系统中预定义的标准图标,这时需调用CWinApp::LoadStandardIcon 函数,其原型如下: HICON LoadStandardIcon( LPCTSTR lpszIconName ) const; 其中,lpszIconName可以是下列值之一: IDI_APPLICATION 默认的应用程序图标 IDI_HAND 手形图标(用于严重警告) IDI_QUESTION 问号图标(用于提示消息) IDI_EXCLAMATION 警告消息图标(惊叹号) IDI_ASTERISK 消息图标 图标装载后,可使用全局函数DestroyIcon来删除图标,并释放为图标分配的内存,其原型如下: BOOL DestroyIcon( HICON hIcon );,6.1.2 图标,2.图标的显示 图标的显示一般有两种方法:一是通过静态图片控件来显示,或在其他控件(如按钮)设置显示;二是通过函数CDC::DrawIcon将一个图标绘制在指定设备的位置处,函数原型如下: BOOL DrawIcon( int x, int y, HICON hIcon ); BOOL DrawIcon( POINT point, HICON hIcon );,,6.1.2 图标,3.应用程序图标的改变 实际上,程序中还可使用GetClassLong和SetClassLong函数重新指定应用程序窗口的图标,函数原型如下: DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong); DWORD GetClassLong( HWND hWnd, int nIndex); 其中,hWnd用来指定窗口类句柄,dwNewLong 用来指定新的32位值。
nIndex用来指定与WNDCLASSEX结构相关的索引,它可以是下列值之一: GCL_HBRBACKGROUND 窗口类的背景画刷句柄 GCL_HCURSOR 窗口类的光标句柄 GCL_HICON 窗口类的图标句柄 GCL_MENUNAME 窗口类的菜单资源名称,6.1.2 图标,【例Ex_Icon】 图标的使用 (1)用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_Icon (2)添加4个图标资源,单击“新建设备图像”按钮 ,选择“小的(16×16)”设备类型,保留图标资源默认的ID(IDI_ICON1~ IDI_ICON4),制作如图6.5所示的图标6.1.2 图标,(3)为CMainFrame类添加一个成员函数ChangeIcon,用来切换应用程序的图标该函数的代码如下: void CMainFrame::ChangeIcon(UINT nIconID) { HICON hIconNew = AfxGetApp()-LoadIcon(nIconID); HICON hIconOld = (HICON)GetClassLong(m_hWnd, GCL_HICON); if (hIconNew != hIconOld) { DestroyIcon(hIconOld); SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew); RedrawWindow(); // 重绘窗口 } },,6.1.2 图标,(4)在CMainFrame::OnCreate函数的最后添加计时器设置代码: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //…… SetTimer(1, 500, NULL); return 0; },,6.1.2 图标,(5)用MFC ClassWizard为CMainFrame类添加WM_TIMER的消息映射函数,并增加下列代码: void CMainFrame::OnTimer(UINT nIDEvent) { static int icons[] = { IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4}; static int index = 0; ChangeIcon(icons[index]); index++; if (index3) index = 0; CFrameWnd::OnTimer(nIDEvent); },,6.1.2 图标,(6)用MFC ClassWizard为CMainFrame类添加WM_DESTROY的消息映射函数,并增加下列代码: void CMainFrame::OnDestroy() { CFrameWnd::OnDestroy(); KillTimer(1); } (7)编译并运行。
可以看到任务栏上的按钮,以及应用程序的标题栏上4个图标循环显示的动态效果,显示速度为2帧/秒6.1.3 光标,1.使用系统光标 Windows预定义了一些经常使用的标准光标,这些光标均可以使用函数CWinApp:: LoadStandardCursor加载到程序中,其函数原型如下: HCURSOR LoadStandardCursor( LPCTSTR lpszCursorName ) const; 其中,lpszCursorName用来指定一个标准光标名,它可以是下列宏定义: IDC_ARROW 标准箭头光标 IDC_IBEAM 标准文本输入光标 IDC_WAIT 漏斗形计时等待光标 IDC_CROSS 十字形光标 IDC_UPARROW 垂直箭头光标 IDC_SIZEALL 四向箭头光标 IDC_SIZENWSE 向下的双向箭头光标 IDC_SIZENESW 向上的双向箭头光标 IDC_SIZEWE 左右双向箭头光标 IDC_SIZENS 上下双向箭头光标,,,6.1.3 光标,2.使用光标资源 用编辑器创建或从外部调入的光标资源,可通过函数CWinApp::LoadCursor进行加载,其原型如下: HCURSOR LoadCursor( LPCTSTR lpszResourceName ) const; HCURSOR LoadCursor( UINT nIDResource ) const; 3.更改程序中的光标 更改应用程序中的光标除了可以使用GetClassLong和SetClassLong函数外,最简单的方法是用MFC ClassWizard映射WM_SETCURSOR消息,该消息是当光标移动到一个窗口内并且还没有捕捉到鼠标时产生的。
CWnd为此消息的映射函数定义这样的原型: afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );,6.1.3 光标,6.1.3 光标,(4)保留默认的ID(IDC_CURSOR1),用图像编辑器绘制光标图形,指定光标热点位置为(15, 15),结果如图6.6所示6.1.3 光标,(5)为CMainFrame类添加一个成员变量m_hCursor,变量类型为光标句柄HCURSOR用MFC ClassWizard为CMainFrame类添加WM_SETCURSOR的消息映射函数,并增加下列代码: BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { BOOL bRes = CFrameWnd::OnSetCursor(pWnd, nHitTest, message); if (nHitTest == HTCAPTION ) { m_hCursor = LoadCursorFromFile(“c:\\windows\\cursors\\hand.ani“); SetCursor(m_hCursor); bRes = TRUE; } else if (nHitTest == HTCLIENT ) { m_hCursor = AfxGetApp()-LoadCursor(IDC_CURSOR1); SetCursor(m_hCursor); bRes = TRUE; } return bRes; },6 . 2 菜 单,6.2.1 菜单一般规则 对于菜单系统的设计还应遵循下列一些规则(参考图6.7)。
6.2.2 更改应用程序菜单,【例Ex_MenuSDI】 更改并切换应用程序菜单 (1)用MFC AppWizard(exe)创建一个默认的单文档应用程序Ex_MenuSDI (2)将项目工作区窗口切换到ResourceView页面,展开资源节点,双击资源“Menu”节点下的IDR_MAINFRAME项,则菜单编辑器窗口出现在主界面的右边,且项目Ex_MenuSDI相应的菜单资源在菜单编辑器窗口中显示出来6.2.2 更改应用程序菜单,(3)按快捷键【Ctrl+R】,弹出“插入资源”对话框,在资源类型中选中“Menu”,单击 按钮,系统就会为应用程序添加一个新的菜单资源,并自动赋给它一个默认的标识符名称(第一次为IDR_MENU1,以后依次为IDR_MENU2、IDR_MENU3……),同时自动打开这个新的菜单资源,如图6.8所示6.2.2 更改应用程序菜单,(4)在菜单的空位置上双击鼠标左键,则出现其属性对话框通过其属性对话框为菜单ID_MENU1添加一个顶层弹出菜单项“测试(&T)”,并在该菜单下添加一个子菜单项“返回(&R)”,ID设为ID_TEST_RETURN,如图6.9所示6.2.2 更改应用程序菜单,(5)打开Ex_MenuSDI程序菜单资源IDR_MAINFRAME,在“查看”菜单的最后添加一个子菜单项“显示测试菜单(&M)”,ID设为ID_VIEW_TEST。
(6)将工作区切换到ClassView页面,展开类节点,右击CMainFrame类名,从弹出的快捷菜单中选择Add Member Variable(添加成员变量),在对话框中,为CMainFrame类添加一个CMenu类型的成员变量m_NewMenu(。
