资源描述
第 5 章 Windows操作系统中的窗口类操作系统中的窗口类本章对窗口类作了介绍和分析,例举了多种形式的窗口类,对窗口类和窗口类结构在概念上的联系和区别作了介绍,这是学生和自学人员容易搞错的。对填写窗口类条款所经常要遇到的四 个函数作了介绍.在对窗口类条款作深入介绍的基础上.对应用程序的其他部分,如窗口的风格,窗口的显示,消息循环等,在第四章的基础上本章也都作了补充。15.1 窗口类概述不管建立窗口的方法如何,建立窗口之前,都要准备好窗口类系统窗口类:应用程序可以用操作系统为用户准备好的现成的窗口类用户定制窗口类:也可以是系统为用户准备好的窗口类的结构,由用户填写窗口类结构的各项数据再注册而形成的窗口类用户定制的窗口类,必须先要向Windows操作系统注册才能使用25.1 窗口类概述1、系统预定义窗口类系统全局窗口类BUTTON COMBOBOX组合框控件 EDIT编辑框LISTBOX SCROLLBAR 滚动条STATIC静态文本要使用这些窗窗口,直接用CreateWindow创建相应对象就是了。CreateWindow(BUTTON,Click,WS_CHILD,20,20,100,35,hwnd,0,0,NULL);Click35.1 窗口类概述2、用户定制窗口类形成过程:声明一个窗口类结构变量声明一个窗口类结构变量WNDCLASS wndclass;给窗口类变量各数据项(元素)赋值给窗口类变量各数据项(元素)赋值wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/载入图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/载入鼠标调用函数调用函数RegisterClass()注册窗口类注册窗口类RegisterClass(&wndclass);45.2 几种窗口类结构介绍5.1.1、Windows 95 中的窗口类结构struct WNDCLASSEXUINT cbSize;/扩展窗口类变量的大小UINT style;/窗口类的式样,式样决定窗口的行为WNDPROC lpfnWndProc;/指向依此窗口类所建窗口的窗口函数的指针int cbClsExtra;/附加项int cbWndExtra;/附加项HINSTANCE hInstance;/指向应用程序实例的代号HICON hIcon;/指向依此窗口类所建窗口中要引入的图标HCURSOR hCursor;/指向依此窗口类所建窗口中要引入的鼠标光标HBRUSH hbrBackground;/指向依此窗口类所建窗口的底色LPCSTR lpszMenuName;/指向依此窗口类所建窗口相关联的菜单名称LPCSTR lpszClassName;/窗口类名称HICONhIconSM;/指向依此窗口类所建窗口要引入的小图标;55.2 几种窗口类结构介绍5.1.2、窗口类条款的补充说明1、UINT cbSize;扩展窗口类变量的大小2、WNDPROC lpfnWndProc;指向依此窗口类所建窗口的窗口函数的指针LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)#define LRESULT LONG#define CALLBACK WINAPI65.2 几种窗口类结构介绍5.1.2、窗口类条款的补充说明3、LPCSTR lpszClassName;用户的应用程序使用的窗口类名称是一个指向字符串的指针,或者说它的值是字符串在内存的地址,这个字符串就是窗口类的名字给该变量进行赋值的方式为:wndclass.lpszClassName=MyGod!;或char szClsNm=MyGod!;wndclass.lpszClassName=szClsNm;75.2 几种窗口类结构介绍5.1.2、窗口类条款的补充说明4、HINSTANCE hInstance;存放应用程序实例其本身的句柄(代号)一般来说,程序在调用函数时如果会返回一个句柄(代号),我们都应该将它们保存起来(放入某一变量里),以备后用。5、图标HICON hIcon;/指向依此窗口类所建窗口中要引入的图标HICON hIconSM;/指向依此窗口类所建窗口要引入的小图标85.2 几种窗口类结构介绍5.2.3 Windows NT 中的窗口类结构WNDCLASSA和WNDCLASSW是定义在WINUSER.H头文件中的窗口类结构,第一种是ASCII版的窗口类结构,称为WNDCLASSA(A表示ASCII码)另一个是Unicode版的窗口类结构。95.2 几种窗口类结构介绍5.2.3 Windows NT 中的窗口类结构struct WNDCLASSEX UINT style;WNDPROClpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR lpszClassName;105.3 几个与窗口类有关的函数5.3.1 LoadIcon函数此函数的用法如下:#include HICON WINAPI LoadIcon(HINSTANCE hInstance,LPCSTR lpIconName).HINSTANCE hInstance指向用户定义图标所在的位置,即用户定义图标在哪个实例中,当它为NULL时,那么,这是系统预定义的图标LPCSTR lpIconName图标名,也称图标上的标签。HICON返回值的类型,是指向图标的指针。返回值 LoadIcon返回的是一个指向图标的指针如果失败,返回NULL(0)115.3.1 LoadIcon函数LoadIcon的功能是把实例中定义的图标载入内存。LoadIcon的第一个参数是图标所在的实例代号,第二个参数是实例中指向图标的指针,即图标指针。定义值说明IDI_APPLICATION32512WINDOWS徽标IDI_HAND32513“无访问”符号IDI_QUESTION32514蓝色园上的一个问号IDI_EXCLAMATION32515黄色园上的一个黑色感叹号IDI_ASTERISK32516信息点IDI_WINLOGO32517WINDOWS徽标如果要装载自己添加的图标资源,要如果要装载自己添加的图标资源,要1、在文件中添加头文件#include resource.h2、注意下面二种写法:LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)LoadIcon(hInstance,(TCHAR*)IDI_ICON1)125.3.3 LoadCursor()函数载入光标的函数如同载入图标的函数,HCURSOR WINAPI LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName).HINSTANCE hInstance 包含光标所在的位置,即使用的光标在哪个实例中,当它为NULL时,那么,这是系统预定义的光标LPCTSTR lpCursorName光标的ID名返回指向光标的代号若调用失败,返回NULL。135.3.3 LoadCursor()函数Windows预定义一系列鼠标游标位图,如下所示 光光标值说明明IDC_ARROWMAKEINTRESOURCE(32512)传统的箭头指针IDC_IBEAMMAKEINTRESOURCE(32513)I型游标IDC_WAITMAKEINTRESOURCE(32514)沙漏IDC_CROSSMAKEINTRESOURCE(32515)十字游标IDC_UPARROWMAKEINTRESOURCE(32516)垂直游标IDC_SIZEMAKEINTRESOURCE(32640)四方向箭头IDC_ICONMAKEINTRESOURCE(32641)带有白色边框的小黑方块IDC_SIZENWSEMAKEINTRESOURCE(32642)指向西北和东南的双向箭头IDC_SIZENESWMAKEINTRESOURCE(32643)指向东北和西南的双向箭头IDC_SIZEWEMAKEINTRESOURCE(32644)指向西方和东方的双向箭头IDC_SIZENSMAKEINTRESOURCE(32645)指向北方和南方的双向箭头IDC_SIZEALLMAKEINTRESOURCE(32646)四方向箭头IDC_NOMAKEINTRESOURCE(32648)斜线园IDC_APPSTARTINGMAKEINTRESOURCE(32650)标准箭头和沙漏145.3.3 LoadCursor()函数如果要装载自己添加的图标资源,要如果要装载自己添加的图标资源,要1、在文件中添加头文件#include resource.h2、注意下面二种写法:LoadIcon(hInstance,MAKEINTRESOURCE(IDI_CURSOR1)LoadIcon(hInstance,(TCHAR*)IDI_CURSOR1)155.3.4 CreateSolidBrush()函数1、HBRUSH hbrBackground;hbrBackground 是指向窗口底色的指针。Windows利用代号指出属于这个窗口类的窗口的背景颜色。Windows系统提供了几个画刷代号,每个画刷指向一种特定的颜色。画刷值说明WHITE_BRUSH0白色背景LTGRAY_BRUSH1谈灰色背景GRAY_BRUSH2灰色背景DKGRAY_BRUSH3深灰色背景BLACK_BRUSH4黑色背景NULL_BRUSH5没有背景HOLLOW_BRUSHNULL_BRUSH透明背景wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/背景画刷缺点:颜色品种十分有限!缺点:颜色品种十分有限!165.3.4 CreateSolidBrush()函数2、CreateSolidBrush()函数:#include HBRUSH WINAPI CreateSolidBrush(COLORREF col).参数说明HBRUSH 新画刷的代号,如函数调用失败,返回NULL。COLORREF颜色一个32位二进制数字,对应,红,绿,兰的组合。COLORREF颜色参考值是一个32位的数值,它由函数RGB来得到,RGB (r,g,b);CreateSolidBrush(RGB(0,255,0);/创建一个纯绿色的画刷175.3.4 CreateSolidBrush()函数RGB (r,g,b);三种基本色(红,绿,兰)中,每种颜色的浓度是通过0-255之间的一个数值来度量的例如,要绿色窗口,窗口类数据项(条款)可以这样设置,(wcex是窗口类变量)wcex.hbrbackground=CreateSolidBrush(RGB(0,255,0);与RGB有关的其余三个宏分别取得红色,绿色,兰色的浓度。假如你对红色的窗口有意思,那么利用CreateSolidBrush()便可以组成红色。如下所示:wcex.hbrbackground=CreateSolidBrush(RGB(255,0,0);CreateSolidBrush(RGB(255,0,0)是指向红色背景的指针。185.3.4 CreateSolidBrush()函数RGB (r,g,b);实用中,依据三原色利用CreateSolidBrush()函数来创造新背景颜色用户是不会感兴趣的系统为窗口上的各种组件提供各种不同的颜色。背景颜色可以直接借用组件的颜色,窗口的组件有:标题拦,菜单拦,滚动条,按钮类等 颜色值说明COLOR_SCROLLBAR0滚动条颜色COLOR_DESKTOP1COLOR_ACTIVECAPTION2COLOR_INACTIVECAPTION3COLOR_MENU4COLOR_WINDOW5例如:CreateSolidBrush(GetSysColor(COLOR_MENU);19练习 51.Window应用程序是否一定要用WinMain主函数,WinMain函数的作用是什么?2.Window应用程序中是否所有的标识符都按照”匈牙利命名惯例”来拼写?3.解释系统全局窗口类,应用全局窗口类,应用专用窗口类?4.WinMain()的语法在16位Windows和32位Windows里是完全一致的,但是两者之间内在的差别是很大的,差别是什么?5.32位Windows支持哪三种窗口类?讲述每种窗口类的用法6.为什么要设计窗口类?7.请你解释一下下面三个窗口类条款 WNDPROC lpfnWndProc LPCSTR lpszClassName HINSTANCE hInstance8.请你解释窗口类的每个条款9.解释窗口类结构名和窗口类名10.窗口类结构中常用的有那几个载入函数?它们的用法如何?11.为什么不提倡一个应用程序注册两个或两个以上主窗口?12.CreateWindowEx中有两个窗口风格,试介绍它们。13.CreateWindowEx函数有12个参数,它们是否和扩展窗口类中的条款一样?要好好区别它们。14.应用程序中如何做到不用ShowWindow?并解释ShowWindow?20
展开阅读全文