图标光标和窗口.ppt
《图标光标和窗口.ppt》由会员分享,可在线阅读,更多相关《图标光标和窗口.ppt(50页珍藏版)》请在三一办公上搜索。
1、第5章图标、光标和窗口框架,5.1图像编辑器,5.2图标,5.3光标,5.4窗口样式和状态,5.5综合应用,5.1图像编辑器,5.1.1 图像编辑器 1.创建一个新的图标或光标 在Visual C+6.0中,创建一个应用程序后,当按快捷键Ctrl+R就可打开“插入资源”对话框,从中选择Cursor(光标)或Icon(图标)资源类型,单击新建按钮后,系统为程序添加一个新的图标或光标资源,同时在开发环境右侧出现图像编辑器。图5.1是添加一个新的图标资源后出现的图像编辑器。,新设备按钮,图5.1 添加图标后的图像编辑器,5.1图像编辑器,在创建新图标或光标的时候,图像编辑器首先创建的是一个适合于VG
2、A环境中的图像,开始的时候它以屏幕色(透明方式)来填充。对于创建的新光标,其“热点”被初始化为左上角的点,坐标为(0,0)。默认情况下,图像编辑器所支持的显示设备如表5.1所示。,表5.1 创建图标或光标时可选用的显示设备,5.1图像编辑器,2.选用和定制显示设备在图像编辑器工作窗口的控制条上,有一个“新设备图像”(New Device Image)按钮,单击此按钮后,系统弹出相应的新设备列表,可以从中选取需要的显示设备,如图5.2所示。,图5.2 图像设备选择对话框图 图5.3 自定义设备图像,除了对话框列表框显示的设备外,还可以单击自定义按钮,在弹出的对话框中定制新的显示设备,如图5.3所
3、示,在这里可指定新设备图像的大小和颜色。,5.1图像编辑器,3.设置光标热点 Windows系统借助光标“热点”来确定光标实际的位置。在图像编辑器的控制条上或光标属性对话框中都可以看到当前的光标“热点”位置。图5.4是添加一个新的光标资源后出现的图像编辑器。,图5.4 添加光标后的图像编辑器,5.2图标,5.2.1 图标的调入、清除和显示 1.图标的调入 在MFC中,当在应用程序中添加一个图标资源后,就可以使用CWinApp:LoadIcon函数可将其调入并返回一个图标句柄。函数原型如下:HICON LoadIcon(LPCTSTR lpszResourceName)const;HICON L
4、oadIcon(UINT nIDResource)const;其中,lpszResourceName和nIDResource分别表示图标资源的字符串名和标识。函数返回的是一个图标句柄。如果不想使用新的图标资源,也可使用系统中预定义好的标准图标,这时需调用CWinApp:LoadStandardIcon 函数,其原型如下:HICON LoadStandardIcon(LPCTSTR lpszIconName)const;其中,lpszIconName可以是下列值之一:IDI_APPLICATION 默认的应用程序图标 IDI_HAND 手形图标(用于严重警告)IDI_QUESTION 问号图标(
5、用于提示消息)IDI_EXCLAMATION 警告消息图标(惊叹号)IDI_ASTERISK 消息图标,5.2图标,2.图标的消除 图标装载后,可使用全局函数DestroyIcon来删除图标,并释放为图标分配的内存,其原型如下:BOOL DestroyIcon(HICON hIcon);其中,hIcon用来指定要删除的图标句柄。3.图标的显示 图标的显示一般有两种方法:一是通过静态图片控件来显示,或在其他(如按钮)控件设置显示;二是通过函数CDC:DrawIcon用来将一个图标绘制在指定设备的位置处(这一方法以后再讨论)。4.图标示例 下面来看一个示例,如图5.5所示,单击开始按钮,3个图标就
6、会每隔100ms随机显示,且此时开始按钮变成停止。单击停止按钮,图标停止更新,按钮的名称变成“开始”,如果3个图标的图案都是一样的,则弹出消息对话框,显示“恭喜你!”,否则显示“失败!”。,5.2图标,图5.5 图标示例,分析和思考:(1)从图5.5中可以看出,该示例是一个对话框应用程序。(2)需要创建3个图标资源,且通过3个静态图片控件来显示。为了能在程序中动态地改变静态控件显示的图标,还需为控件添加CStatic类变量,然后通过CStatic:SetIcon来指定,该函数原型如下:HICON SetIcon(HICON hIcon);其中,hIcon用来指定要显示的图标句柄。函数成功调用后
7、,将返回上一次图标的句柄。(3)由于每隔100ms随机显示这些图标,因而需要启动计时器,并在WM_TIMER消息映射函数中添加相关代码,且还需用rand函数来产生随机序列。另外,为了避免每次所产生的随机序列相同,在产生随机数之前使用srand库函数来重新指定随机种子。示例步骤如下:,5.2图标,例Ex_RandIcon 图标使用(1)创建一个默认的基于对话框应用程序Ex_RandIcon。(2)按Ctrl+R键,弹出“插入资源”对话框,选择“Icon”类型,单击新建按钮。这样,就为程序添加一个新的图标资源IDI_ICON1。保留默认的ID号和设备类型,再按此法添加2个图标资源,相应的默认ID号
8、分别为IDI_ICON2和IDI_ICON3。(3)按图5.6所示,依次打开图标资源IDI_ICON1、IDI_ICON2和IDI_ICON3,在图像编辑器中分别将它们设计成红色带圈的A、绿色带圈的B、蓝色带圈的C。,图5.6 添加并设计的图标,5.2图标,(4)在ResourceView页面中,双击“Dialog”下的IDD_EX_RANDICON_DIALOG,打开对话框资源模板。将对话框的标题设为“图标使用”。删除“TODO:在这里设置对话控制。”静态文本控件和取消按钮,将确定按钮标题改为“退出”。(5)打开对话框网格,参照图5.5所示,调整对话框大小,分别依次添加3个静态图片控件,ID
9、号分别设置为IDC_STATIC_1、IDC_STATIC_2和IDC_STATIC_3,类型选择为“图标”,图像依次选择为IDI_ICON1、IDI_ICON2和IDI_ICON3,在样式属性中,分别选中“图像居中”。(6)添加一个按钮控件,ID号为IDC_BUTTON_START,标题为“开始”。(7)按Ctrl+W键,打开MFC ClassWizard的Member Variables页面,依次为IDC_STATIC_1、IDC_STATIC_2和IDC_STATIC_3设置CStatic类的Control变量m_wndIcon1、m_wndIcon2和m_wndIcon3。(8)切换到
10、Messsage Maps页面,为按钮IDC_BUTTON_START添加BN_CLICKED消息映射,保留默认的映射函数名,添加下列代码:(9)再次打开MFC ClassWizard的Messsage Maps页面,为CEx_RandIconDlg类添加WM_TIMER消息映射,并在映射函数中添加下列代码:(10)编译运行并测试。,5.2图标,5.2.2 应用程序图标的改变在用MFC AppWizard创建的应用程序中,图标资源IDR_MAINFRAME用来表示应用程序窗口的图标,通过图像编辑器可将其内容直接修改。实际上,程序中还可使用GetClassLong和SetClassLong函数重
11、新指定应用程序窗口的图标,函数原型如下: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 窗口类的的菜单资源名称 下面来看一个示例,它是
12、将应用程序的图标按一定的序列来显示,使其看起来具有动画效果。,5.2图标,例Ex_Icon 图标使用(1)创建一个默认的单文档应用程序Ex_Icon。(2)添加4个图标资源,单击“新建设备图像”按钮,选择“小的(16 x 16)”作为图标的设备类型,保留图标资源默认的ID号:IDI_ICON1 IDI_ICON4,制作如图5.7所示的图标。,图5.7 创建的四个图标,5.2图标,(3)为CMainFrame类添加一个成员函数ChangeIcon,用来切换应用程序的图标。该函数的代码如下:void CMainFrame:ChangeIcon(UINT nIconID)HICON hIconNew
13、=AfxGetApp()-LoadIcon(nIconID);HICON hIconOld=(HICON)GetClassLong(m_hWnd,GCL_HICON);if(hIconNew!=hIconOld)DestroyIcon(hIconOld);SetClassLong(m_hWnd,GCL_HICON,(long)hIconNew);RedrawWindow();/重绘窗口,5.2图标,(4)在CMainFrame:OnCreate函数的最后添加计时器设置代码:int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CFra
14、meWnd:OnCreate(lpCreateStruct)=-1)return-1;.SetTimer(1,500,NULL);return 0;(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(iconsindex);index+;if(index3)index=0;CFrameW
15、nd:OnTimer(nIDEvent);,5.2图标,(7)编译并运行。可以看到任务栏上的按钮以及应用程序的标题栏上四个图标循环显示的动态效果,显示速度为每秒两帧。5.2.3 获取系统文件图标 图标作为界面设计的一个常见元素,在Windows系统中早已标准化了。在应用程序中,常常为了界面的一致性,总要使用这些规范化的图标。虽然,Visual Studio 6.0中的安装光盘已有一些常用的这样图标,但都是Windows 95的标准。所以,在应用程序中,使用最新标准的图标,仍然需要通过相应的API函数来获取。SHGetFileInfo就是其中一个这样的函数,它用来获取指定文件或文件的图标,其原型
16、如下:DWORD_PTR SHGetFileInfo(LPCTSTR pszPath,/文件或路径名 DWORD dwFileAttributes,/文件属性 SHFILEINFO FAR*psfi,/返回SHFILEINFO结构数据的地址 UINT cbFileInfo,/SHFILEINFO结构大小 UINT uFlags/返回标志);,5.2图标,其中,uFlags用来指定返回内容的一些标志,如:SHGFI_DISPLAYNAME(返回文件的显示名称,保存在psfi中的szDisplayName成员)、SHGFI_ICON(返回文件图标的句柄或索引号,保存在psfi中的hIcon成员或i
17、Icon成员)、SHGFI_ICON|SHGFI_LARGEICON(返回文件的大图标)、SHGFI_ICON|SHGFI_OPENICON(返回文件打开时的图标)、SHGFI_ICON|SHGFI_SELECTED(返回文件打开时的图标)、SHGFI_ICON|SHGFI_SMALLICON(返回文件的小图标)、SHGFI_TYPENAME(返回文件的类型名称,保存在psfi中的szTypeName成员)。下面来看一个示例,它分别显示当前系统下的文件夹图标、文件夹打开时的图标、资源管理器的图标、记事本的图标。如图5.8所示。,图5.8 获取文件图标,5.2图标,例Ex_FileIcon 获取
18、文件图标(1)创建一个默认的基于对话框应用程序Ex_FileIcon。(2)将对话框的标题设为“文件图标”。删除“TODO:在这里设置对话控制。”静态文本控件和取消按钮,将确定按钮标题改为“退出”。(3)打开对话框网格,参照图5.8所示,调整对话框大小,分别依次添加4个静态图片控件,ID号分别设置为IDC_STATIC_1、IDC_STATIC_2、IDC_STATIC_3和IDC_STATIC_4,类型选择为“图标”,在样式属性中,分别选中“图像居中”。(4)按Ctrl+W键,打开MFC ClassWizard的Member Variables页面,依次为IDC_STATIC_1、IDC_S
19、TATIC_2、IDC_STATIC_3和IDC_STATIC_4设置CStatic类 的Control变量m_wndIcon1、m_wndIcon2、m_wndIcon3和m_wndIcon4。,5.2图标,(5)在CEx_FileIconDlg:OnInitDialog函数中的“return true;”语句之前添加下列代码:BOOL CEx_FileIconDlg:OnInitDialog()SHFILEINFO fi;SHGetFileInfo(C:windows,0,/return TRUE unless you set the focus to a control(6)编译运行。,
20、5.2图标,1.添加或删除图标 Windows提供了任务栏相应的应用程序接口,从而通过Shell_NotifyIcon函数很容易地向任务栏的托盘添加或删除图标。Shell_NotifyIcon的原型如下:2.处理鼠标消息 当用户在图标所在的区域中进行鼠标操作时,都会向窗口发送相应消息(该消息由添加托盘时在NOTIFYICONDATA结构的uCallbackMessage指定)。应用程序通过对这些消息的处理,便可执行相应的动作。下面来看一个示例:在这个示例中,首先创建一个默认的基于对话框应用程序。当用户单击对话框的最小化按钮时,对话框消失,在任务栏的托盘上显示出应用程序的图标。若单击图标将恢复显
21、示对话框,此时应用程序的图标从托盘中消失。例Ex_Tray 托盘图标操作(1)创建一个默认的基于对话框应用程序Ex_Tray。(2)将对话框的标题设为“托盘图标使用”,选中“样式”页面中的“最小化框”选项。删除“TODO:.”静态文本控件和取消按钮,将确定按钮标题改为“退出”。(3)向CEx_TrayDlg类中添加前面已列出的AddTaskBarIcon和DeleteTaskBarIcon两个成员函数。,5.2图标,(4)用MFC ClassWizard为CEx_TrayDlg类添加WM_SIZE的消息映射,保留默认的映射函数名,增加下列代码:void CEx_TrayDlg:OnSize(U
22、INT nType,int cx,int cy)CDialog:OnSize(nType,cx,cy);if(nType=SIZE_MINIMIZED)AddTaskBarIcon(m_hWnd,IDR_MAINFRAME,m_hIcon,托盘图标操作示例);ShowWindow(SW_HIDE);/后面会讨论这个函数的用法 else DeleteTaskBarIcon(m_hWnd,IDR_MAINFRAME);,5.2图标,(5)用MFC ClassWizard为CEx_TrayDlg类添加WM_DESTROY的消息映射,保留默认的映射函数名,增加下列代码:void CEx_TrayDlg
23、:OnDestroy()CDialog:OnDestroy();DeleteTaskBarIcon(m_hWnd,IDR_MAINFRAME);(6)由于在AddTaskBarIcon成员函数中指定了用于托盘图标通知消息的ID号:“tnid.uCallbackMessage=WM_ICON_NOTIFY;”,因而为了能捕捉到WM_ICON_NOTIFY消息,还必要定义它并手动按MFC消息映射机制来添加该消息的消息映射。(7)打开Ex_TrayDlg.h文件,在类声明语句“class CEx_TrayDlg:public CDialog”之前添加WM_ICON_NOTIFY的宏定义:#defin
24、e WM_ICON_NOTIFY(WM_USER+500),5.2图标,(8)在Ex_TrayDlg.h文件的DECLARE_MESSAGE_MAP前,添加 WM_ICON_NOTIFY的消息映射函数的声明:/AFX_MSG(CEx_TrayDlg)/AFX_MSG void OnTrayNotify(WPARAM wParam,LPARAM lParam);DECLARE_MESSAGE_MAP()(9)打开Ex_TrayDlg.cpp文件,在CEx_TrayDlg类的消息入口定义中添加消息宏指定,即将消息WM_ICON_NOTIFY与前面声明的消息函数OnTrayNotify相映射:BEG
25、IN_MESSAGE_MAP(CEx_TrayDlg,CDialog)/AFX_MSG_MAP(CEx_TrayDlg)ON_WM_SYSCOMMAND()ON_WM_DESTROY()/AFX_MSG_MAPON_MESSAGE(WM_ICON_NOTIFY,OnTrayNotify)END_MESSAGE_MAP(),5.2图标,(10)在Ex_TrayDlg.cpp文件中,添加CEx_TrayDlg类的消息函数OnTrayNotify的实现代码:void CEx_TrayDlg:OnTrayNotify(WPARAM wParam,LPARAM lParam)UINT uID=(UINT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图标 光标 窗口
链接地址:https://www.31ppt.com/p-6257497.html