第三章 窗口和消息(精品).ppt

上传人:hyn****60 文档编号:70987999 上传时间:2023-01-31 格式:PPT 页数:51 大小:351.50KB
返回 下载 相关 举报
第三章 窗口和消息(精品).ppt_第1页
第1页 / 共51页
第三章 窗口和消息(精品).ppt_第2页
第2页 / 共51页
点击查看更多>>
资源描述

《第三章 窗口和消息(精品).ppt》由会员分享,可在线阅读,更多相关《第三章 窗口和消息(精品).ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第三章第三章 窗口和消息窗口和消息 在在Windows中,一个窗口就是屏幕上的一个中,一个窗口就是屏幕上的一个矩形区域,它接收使用者的输入并以文字矩形区域,它接收使用者的输入并以文字或图形的格式显示输出内容。或图形的格式显示输出内容。本章主要讲述建立自己的窗口。本章主要讲述建立自己的窗口。3.1 建立窗口建立窗口 建立窗口函数建立窗口函数 HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU

2、 hMenu,HANDLE hlnstance,LPVOID lpParam)函数参数函数参数lpClassName指定指定窗口类名窗口类名。可以是任何用函数。可以是任何用函数RegisterClassEx注册的类名,或预注册的类名,或预定义的控制类名。定义的控制类名。LPWindowName窗口名窗口名字符串指针。字符串指针。如果窗口风格指定了标题条,由如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显指向的窗口标题将显示在标题条上。当创建控制例如按钮,选择框和静态控制时,可使用示在标题条上。当创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制

3、文本。来指定控制文本。函数参数函数参数dwStyle窗口风格窗口风格可以是下列窗口风格的组合。可以是下列窗口风格的组合。WS_BORDER:单边框的窗口。:单边框的窗口。WS_CAPTION:有标题框的窗口(包括:有标题框的窗口(包括WS_BODER)。)。WS_CHILD:子窗口。(不能与:子窗口。(不能与WS_POPUP风格合用)风格合用)WS_CHLDWINDOW:同:同WS_CHILD。WS_CLIPCHILDREN:在窗口内绘图时,排除子窗口区域。父窗口风格。在窗口内绘图时,排除子窗口区域。父窗口风格。WS_CLlPBLINGS;排除子窗口之间的相对区域,也就是,当一个特定;排除子窗

4、口之间的相对区域,也就是,当一个特定的窗口接收到的窗口接收到 WM_PAINT消息时,将所有层叠窗口排除在绘图之外,消息时,将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗风格,并且子窗口是层叠的,则在重绘子窗口的客户区口是层叠的,则在重绘子窗口的客户区 时,就会重绘邻近的子窗口。时,就会重绘邻近的子窗口。函数参数函数参数WS_DISABLED:创建一个初始状态为禁止的子窗口。一个禁止状态的窗口创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。不能接受来自用户的输入信息。WS_DL

5、GFRAME:创建一个不能带标题条的对话框风格的窗口。创建一个不能带标题条的对话框风格的窗口。WS_GROUP:指定一组控制的第一个控制。这个控制组由第一个控制和随指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,后定义的控制组成,自第二个控制开始每个控制,具有自第二个控制开始每个控制,具有WS_GROUP风格,风格,每个组的第一个控制带有每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。风格,从而使用户可以在组间移动。用户随后可以使用光用户随后可以使用光 标在组内的控制间改变键盘焦点。标在组内的控制间改变键盘焦点。WS_HSCROLL:创建一个有水

6、平滚动条的窗口。:创建一个有水平滚动条的窗口。WS_ICONIC:创建一个初始状态为最小化状态的窗口。与:创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。风格相同。WS_MAXIMIZE:创建一个初始状态为最大化状态的窗口。:创建一个初始状态为最大化状态的窗口。函数参数函数参数WS_VSCROLL:创建一个有垂直滚动条的窗口。:创建一个有垂直滚动条的窗口。WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口。该风格不能与:创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定风格同时出现,同时必须指定WS_SYSMEN

7、U风格。风格。WS_OVERLAPPED:产生一个层叠的窗口。一个层叠的窗口有一个标题条和产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与一个边框。与WS_TILED风格相同。风格相同。WS_OVERLAPPEDWINDOW:创建一个具有:创建一个具有 WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与风格的层叠窗口,与WS_TILEDWINDOW风格相同。风格相同。WS_POPUP;创建一个弹出式窗口。该风格不能与;创建一个弹出式窗口。该风格不能与WS_C

8、HLD风格同时使风格同时使用。用。WS_POPUWINDOW:创建一个具有:创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,风格的窗口,WS_CAPTION和和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。必须同时设定才能使窗口某单可见。函数参数函数参数WS_SIZEBOX:创建一个可调边框的窗口,与:创建一个可调边框的窗口,与WS_THICKFRAME风格相同。风格相同。WS_SYSMENU:创建一个在标题条上带有窗口菜单的窗口,必须同时设:创建一个在标题条上带有窗口菜单的窗口,必须同时设定定WS_CAPTION风格。风格。WS_TABSTOP

9、:创建一个控制,这个控制在用户按下:创建一个控制,这个控制在用户按下Tab键时可以获得键键时可以获得键盘焦点。按下盘焦点。按下Tab键后使键盘焦点转移到下一具有键后使键盘焦点转移到下一具有WS_TABSTOP风格的控风格的控制。制。WS_THICKFRAME:创建一个具有可调边框的窗口,与:创建一个具有可调边框的窗口,与WS_SIZEBOX风格相风格相同。同。WS_TILED:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与框。与WS_OVERLAPPED风格相同。风格相同。WS_TILEDWINDOW:创建一个具有创建一个具有

10、WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的层叠窗口。风格的层叠窗口。WS_VISIBLE创建一个初始状态为可见的窗口。创建一个初始状态为可见的窗口。函数参数函数参数X 指定窗口的初始水平位置。如果设为指定窗口的初始水平位置。如果设为CW_USEDEFAULT则系统为窗口选则系统为窗口选择缺省的左上角坐标择缺省的左上角坐标 并忽略并忽略Y参数。参数。Y 指定窗口的初始垂直位置。如果指定窗口的初始垂直位置。如果 层叠窗口是使用层叠窗口是使用WS_VISIBLE风格位风格位创建的并

11、且创建的并且X参数被设为参数被设为CW_USEDEFAULT,则系统将忽略,则系统将忽略y参数。参数。nWidth以设备单元指明窗口的宽度。对于层叠窗口,以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是屏幕坐标的或是屏幕坐标的窗口宽度。若窗口宽度。若nWidth是是 CW_USEDEFAULT,则系统为窗口选择一个缺,则系统为窗口选择一个缺省的高度和宽度,如果为弹出式窗口和子窗口设定省的高度和宽度,如果为弹出式窗口和子窗口设定CW_USEDEFAULT标标志则志则nWidth和和nHeight被设被设 为零。为零。nHelght 以设备单元指明窗口的高度。对于层叠窗口,以设备单元指明窗

12、口的高度。对于层叠窗口,nHeight是屏幕坐标的窗是屏幕坐标的窗口宽度。若口宽度。若nWidth被设为被设为CW_USEDEFAULT,则系统忽略,则系统忽略nHeight参数参数 函数参数函数参数hWndParent 指向被创建窗口的指向被创建窗口的父窗口或所有者窗口的句柄父窗口或所有者窗口的句柄。若要创建一个子窗口。若要创建一个子窗口或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗或一个被属窗口,需提供一个有效的窗口句柄。这个参数对弹出式窗口是可选的。口是可选的。hMenu菜单句柄菜单句柄。对于层叠或弹出式窗口,。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单。指定窗口使

13、用的菜单。Hlnstance与窗口相关联的与窗口相关联的模块事例的句柄模块事例的句柄。lpParam指向一个值的指针,该值传递给窗口指向一个值的指针,该值传递给窗口 WM_CREATE消息。该值通过在消息。该值通过在IParam参数中的参数中的CREATESTRUCT结构传递。如果应用程序调用结构传递。如果应用程序调用CreateWindow创建一个创建一个MDI客客 户窗口,则户窗口,则lpParam必须指向一个必须指向一个CLIENTCREATESTRUCT结构。结构。3.1.2 windows程序结构程序结构 3.1.2 windows程序结构程序结构 3.1.2 windows程序结构

14、程序结构 Windows程序程序入口程序:入口程序:1 创建窗口创建窗口1.1 创建窗口函数、菜单等资源,注册窗口类创建窗口函数、菜单等资源,注册窗口类1.2 创建窗口创建窗口1.3 显示窗口显示窗口1.4 更新窗口更新窗口2 进入消息环进入消息环窗口函数窗口函数3.1.2 windows程序结构程序结构 窗口函数窗口函数窗口函数是一个函数,可以在程序中,也可以在动窗口函数是一个函数,可以在程序中,也可以在动态链接库中。态链接库中。Windows通过呼叫窗口函数来给窗口通过呼叫窗口函数来给窗口发送消息。窗口函数根据此消息进行处理,然后将发送消息。窗口函数根据此消息进行处理,然后将控制传回给控制

15、传回给Windows。Windows程序执行过程程序执行过程Windows为该程序建立一个为该程序建立一个消息队列消息队列。用来存放该。用来存放该程序可能建立的各种不同窗口的消息。程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做程序中有一小段程序代码,叫做消息循环消息循环,用来从,用来从队列中取出消息,并且将它们发送给相应的窗口函队列中取出消息,并且将它们发送给相应的窗口函数。有些消息直接发送给窗口函数,不用放入消息数。有些消息直接发送给窗口函数,不用放入消息队列中。队列中。3.1.3 HELLOWIN程序程序HELLOWIN.C/*HELLOWIN.C-Displays Hel

16、lo,Windows 98!in client area(c)Charles Petzold,1998*/#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)static TCHAR szAppName=TEXT(HelloWin);HWND hwnd;MSG msg;WNDCLAS wndclass;/窗口类结构窗口类结构3.1.3 HELLOWI

17、N程序程序wndclass.style=CS_HREDRAW|CS_VREDRAW;/窗口风格窗口风格wndclass.lpfnWndProc=WndProc;/窗口函数窗口函数wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;/实例句柄实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);/图标图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);/光标光标wndclass.hbrBackground=(HBRUS

18、H)GetStockObject(WHITE_BRUSH);/背景刷背景刷wndclass.lpszMenuNam=NULL;/菜单菜单wndclass.lpszClassName=szAppName;/用户命名的窗口类名称用户命名的窗口类名称if(!RegisterClass(&wndclass)/注册窗口类注册窗口类.如果注册失败如果注册失败MessageBox(NULL,TEXT(This program requires Windows NT!),szAppName,MB_ICONERROR);return 0;3.1.3 HELLOWIN程序程序hwnd=CreateWindow(s

19、zAppName,/window class name TEXT(The Hello Program),/window caption WS_OVERLAPPEDWINDOW,/window style CW_USEDEFAULT,/initial x position CW_USEDEFAULT,/initial y position CW_USEDEFAULT,/initial x size CW_USEDEFAULT,/initial y size NULL,/parent window handle NULL,/window menu handle hInstance,/program

20、 instance handle NULL);/creation parameters ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;3.1.3 HELLOWIN程序程序LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)HDC hdc;PAINTSTRUCT ps;

21、RECT rect;switch(message)case WM_CREATE:PlaySound(TEXT(hellowin.wav),NULL,SND_FILENAME|SND_ASYNC);return 0;3.1.3 HELLOWIN程序程序case WM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT(Hello,Windows 98!),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return 0;

22、case WM_DESTROY:PostQuitMessage(0);return 0;return DefWindowProc(hwnd,message,wParam,lParam);3.1.4 新的数据型态新的数据型态 数据类型数据类型UINT unsigned int;PSTR char*;WPARAM UINTLPARAM LONGLRESULT LONG函数类型函数类型WINAPI型态,型态,CALLBACK,_stdcall表示呼叫参数传递方式表示呼叫参数传递方式。数据结构数据结构MSG 消息结构,消息结构,WNDCLASS 窗口类别窗口类别 ,PAINTSTRUCT 绘图,绘图,

23、RECT 矩形结构矩形结构 句柄句柄HINSTANCE 执行实体句柄执行实体句柄 ,HWND 窗口句柄,窗口句柄,HDC 设备内容句柄设备内容句柄 HICON(图标句柄)、(图标句柄)、HCURSOR(鼠标光标句柄)和(鼠标光标句柄)和HBRUSH(画刷句柄)(画刷句柄)句柄是一个句柄是一个32位整数,它代表一个对象。位整数,它代表一个对象。程序通过呼叫程序通过呼叫Windows函数取得句柄。在其它函数取得句柄。在其它Windows函数中使用这个句柄,函数中使用这个句柄,以使用它代表的对象。以使用它代表的对象。Windows模块知道它相对应的对象。模块知道它相对应的对象。3.1.5 匈牙利表示

24、法匈牙利表示法 匈牙利表示法变量命名通则。这是为了纪念传奇性的匈牙利表示法变量命名通则。这是为了纪念传奇性的Microsoft程序写作者程序写作者Charles Simonyi。变量名以一个或者多个小写字母开始,这些字母表示变量的数据型态。变量名以一个或者多个小写字母开始,这些字母表示变量的数据型态。在命名结构变量时,可以用结构名的小写作为变量名的前缀,或者用作整个变量在命名结构变量时,可以用结构名的小写作为变量名的前缀,或者用作整个变量名。名。c char或或WCHAR或或TCHAR by BYTE(无正负号字符)(无正负号字符)n short i int x,y int分别用作分别用作x坐

25、标和坐标和y坐标坐标 cx,cy int分别用作分别用作x长度和长度和y长度长度b或或f BOOL(int);f代表旗标代表旗标 w WORD(无正负号短整数)(无正负号短整数)l LONG(长整数)(长整数)dw DWORD(无正负号长整数)(无正负号长整数)fn function(函数)(函数)s string(字符串)(字符串)sz 以字节值以字节值0结尾的字符串结尾的字符串 h 句柄句柄 p 指标指标 3.1.6 注册窗口类别注册窗口类别 窗口类别窗口类别窗口类别是建立窗口的依据,用以标识处理窗口消息的窗口类别是建立窗口的依据,用以标识处理窗口消息的窗口窗口函数函数。窗口类别定义了窗口

26、函数和依据此类别建立的窗窗口类别定义了窗口函数和依据此类别建立的窗口的其它特征。口的其它特征。RegisterClass函数函数RegisterClass(WNDCLASS*wndclass)函数参数为函数参数为WNDCLASS结构指针。结构指针。结构包括两个字符串,因此在结构包括两个字符串,因此在WI NUSER.H文件中定义了两种文件中定义了两种不同的版本,不同的版本,ASCII版和版和Unicode版。版。3.1.6 注册窗口类别注册窗口类别 ASCII版的版的WNDCLASSA:typedef struct tagWNDCLASSA UINT style;WNDPROC lpfnWnd

27、Proc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCSTR lpszMenuName;LPCSTR lpszClassName;WNDCLASSA,*PWNDCLASSA,NEAR*NPWNDCLASSA,FAR*LPWNDCLASSA;3.1.6 注册窗口类别注册窗口类别 Unicode版的结构定义:版的结构定义:typedef struct tagWNDCLASSW UINT style;WNDPROC lpfnWndProc;i

28、nt cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName;WNDCLASSW,*PWNDCLASSW,NEAR*NPWNDCLASSW,FAR*LPWNDCLASSW;3.1.6 注册窗口类别注册窗口类别 WNDCLASS结构字段 style:Wndclass.style=CS_HREDRAW|CS_VREDRAW;#define CS_VREDRAW 0 x0001#de

29、fine CS_HREDRAW 0 x0002#define CS_KEYCVTWINDOW 0 x0004#define CS_DBLCLKS 0 x0008#define CS_OWNDC 0 x0020#define CS_CLASSDC 0 x0040#define CS_PARENTDC 0 x0080#define CS_NOKEYCVT 0 x0100#define CS_NOCLOSE 0 x0200#define CS_SAVEBITS 0 x0800#define CS_BYTEALIGNCLIENT 0 x1000#define CS_BYTEALIGNWINDOW 0

30、x2000#define CS_GLOBALCLASS 0 x4000#define CS_IME 0 x00010000 每当窗口的水平方向大小(CS_HREDRAW)或者垂直方向大小(CS_VREDRAW)改变之后,窗口要完全重画3.1.7 注册窗口类别注册窗口类别 WNDCLASS结构的结构的第二个字段第二个字段lpfnWndProc:Wndclass.lpfnWndProc=WndProc;将这个窗口类别的将这个窗口类别的窗口消息处理程序窗口消息处理程序设定为设定为WndProc。这个过程将处理依这个过程将处理依据这个窗口类别建据这个窗口类别建立的所有窗口的全立的所有窗口的全部消息。部

31、消息。LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)HDC hdc;PAINTSTRUCT ps;RECT rect;switch(message)case WM_CREATE:PlaySound(TEXT(hellowin.wav),NULL,SND_FILENAME|SND_ASYNC);return 0;case WM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdc,TEXT(Hello,Wi

32、ndows 98!),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;return DefWindowProc(hwnd,message,wParam,lParam);3.1.7 注册窗口类别注册窗口类别 下面两个字段下面两个字段预留额外空间预留额外空间:wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;程序可以根据需要来使用预留的空间。程序可以根据需要来使用预留的空间。程

33、序的程序的执行实体执行实体句柄(句柄(WinMain的参数)的参数)Wndclass.hInstance=hInstance 设置图标光标画刷。设置图标光标画刷。wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);3.1.8 建立窗口建立窗口 hwnd=CreateWindow(szAppName,/window class name TEXT(The Hello P

34、rogram),/window caption WS_OVERLAPPEDWINDOW,/window style CW_USEDEFAULT,/initial x position CW_USEDEFAULT,/initial y position CW_USEDEFAULT,/initial x size CW_USEDEFAULT,/initial y size NULL,/parent window handle NULL,/window menu handle hInstance,/program instance handle NULL);/creation parameters

35、在这里,实际上有在这里,实际上有CreateWindowA和和CreateWindowW,分,分别将前两个参数当成别将前两个参数当成ASCII或者或者Unicode字符串来处理。字符串来处理。3.1.8 建立窗口建立窗口 此程序建立的窗口是一个此程序建立的窗口是一个重迭式窗口重迭式窗口。含有一个标题列,标题列左边有一个系统菜单按钮,标题含有一个标题列,标题列左边有一个系统菜单按钮,标题列右边有缩小、放大和关闭图示,四周还有一个表示窗口列右边有缩小、放大和关闭图示,四周还有一个表示窗口大小的边框。这是标准样式的窗口,名为大小的边框。这是标准样式的窗口,名为WS_OVERLAPPEDWINDOW,

36、出现在,出现在CreateWindow的窗口的窗口样式参数中。样式参数中。#define WS_OVERLAPPEDWINDOW(WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX)CreateWindow传回被建立的窗口的句柄传回被建立的窗口的句柄3.1.8 建立窗口建立窗口 ShowWindow(hwnd,iCmdShow);第一个参数是窗口句柄。第一个参数是窗口句柄。第二个参数是第二个参数是WinMain参数参数iCmdShow。SW_SHOWNORMALSW_SHOWMAXIMI

37、ZED;SW_SHOWMINNOACTIVE。UpdateWindow(hwnd);重画显示区域。它发送给窗口函数。重画显示区域。它发送给窗口函数。3.1.9 消息循环消息循环Windows为每个执行的为每个执行的Windows程序维护一个消息队列。程序维护一个消息队列。在发生输入事件之后,在发生输入事件之后,Windows将事件转换为一个消息并将事件转换为一个消息并将消息放入程序的消息队列中。将消息放入程序的消息队列中。程序通过执行消息循环从消息队列中取出消息:程序通过执行消息循环从消息队列中取出消息:while(GetMessage(&msg,NULL,0,0)TranslateMessa

38、ge(&msg);DispatchMessage(&msg);从消息队列中取出一个消息:从消息队列中取出一个消息:GetMessage(&msg,NULL,0,0)3.1.9 消息循环消息循环MSG的结构的结构MSG定义定义 typedef struct tagMSG HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;MSG,*PMSG;接收消息的窗口句柄。接收消息的窗口句柄。消息标识符,这些标识符定义于消息标识符,这些标识符定义于Windows表头文件中,以前缀表头文件中,以前缀WM(window m

39、essage)开头。)开头。wParam 32位消息参数,含义和数值根据消位消息参数,含义和数值根据消息的不同而不同。息的不同而不同。lParam 32位的消息参数,其值与消息有关。位的消息参数,其值与消息有关。3.1.9 消息循环消息循环MSG结构定义结构定义 typedef struct tagMSG HWND hwnd;UINT message;WPARAM wParam;LPARAM lParam;DWORD time;POINT pt;MSG,*PMSG;POINT是一个结构,定义如下:是一个结构,定义如下:typedef struct tagPOINT LONG x;LONG y;

40、POINT,*PPOINT;3.1.9 消息循环消息循环TranslateMessage(&msg);将将msg结构传给结构传给Windows,进行一些键盘转换。,进行一些键盘转换。DispatchMessage(&msg);将将msg结构回传给结构回传给Windows。Windows将该消息发送给将该消息发送给适当的窗口函数,让它进行处理。适当的窗口函数,让它进行处理。这也就是说,这也就是说,Windows将呼叫窗口函数。(为什么?)将呼叫窗口函数。(为什么?)3.1.9 消息循环消息循环消息循环消息循环 while(GetMessage(&msg,NULL,0,0)TranslateMes

41、sage(&msg);/将msg结构传给Windows,进行一些键盘转换。DispatchMessage(&msg);/将msg结构回传给Windows。Windows将该消息发送给适当的窗口函数,让它进行处理。3.1.10 窗口消息处理程序窗口消息处理程序 窗口函数可任意命名。窗口函数可任意命名。一个一个Windows程序可以包含多个窗口函数。程序可以包含多个窗口函数。一个窗口函数与一个窗口函数与RegisterClass注册的特定窗口类别相关联。注册的特定窗口类别相关联。CreateWindow函数根据窗口类别建立窗口。函数根据窗口类别建立窗口。依据一个窗口类别,可以建立多个窗口。依据一个

42、窗口类别,可以建立多个窗口。3.1.10 窗口消息处理程序窗口消息处理程序 窗口函数定义形式:窗口函数定义形式:LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)窗口函数参数与窗口函数参数与MSG结构的前四个字段是相同的。第一个结构的前四个字段是相同的。第一个接收消息的窗口句柄。接收消息的窗口句柄。第二个参数标识消息。第二个参数标识消息。最后两个参数是最后两个参数是32位消息参数,提供消息的更多信息。位消息参数,提供消息的更多信息。窗口函数由窗口函数由Windows呼叫。呼叫。程序通过呼叫程序

43、通过呼叫SendMessage函数呼叫窗口函数。函数呼叫窗口函数。3.1.11 处理消息处理消息窗口消息用一个数值(窗口消息用一个数值(message)来标识参数。头文件)来标识参数。头文件WINUSER.H为每个消息定义以为每个消息定义以WM(窗口消息)为前缀开(窗口消息)为前缀开头的标识符。头的标识符。窗口函数使用窗口函数使用switch和和case结构来确定接收的消息及如何结构来确定接收的消息及如何处理它。处理完消息后,必须传回处理它。处理完消息后,必须传回0。窗口函数不处理的消息应该被传给窗口函数不处理的消息应该被传给DefWindowProc的的Windows函数。函数。从从DefW

44、indowProc传回的值由窗口函数传回。传回的值由窗口函数传回。3.1.11 处理消息处理消息HELLOWIN中,窗口函数的结构如下:中,窗口函数的结构如下:switch(iMsg)caseWM_CREATE:处理处理WM_CREATE消息消息 return 0;caseWM_PAINT:处理处理WM_PAINT消息消息 return 0;caseWM_DESTROY:处理处理WM_DESTROY消息消息 return 0;return DefWindowProc(hwnd,iMsg,wParam,lParam);3.1.11 播放声音文件播放声音文件窗口函数接收的第一个消息是窗口函数接收的

45、第一个消息是WM_CREATE。当。当Windows处理处理CreateWindow函数时,函数时,WndProc接收这个消息。接收这个消息。HELLOWIN对这个消息的处理中播放一个名为对这个消息的处理中播放一个名为HELLOWIN.WAV的声音文件的声音文件(playSound)。WndProc通过从窗口函数中传回通过从窗口函数中传回0,结束了整个,结束了整个WM_CREATE的处理。的处理。3.1.12 WM_PAINT消息消息 WndProc处理的处理的第二个消息为第二个消息为WM_PAINT。这个。这个消息在消息在Windows程序设计中是很重要的。当窗口程序设计中是很重要的。当窗口

46、显示区域的一部分显示内容或者全部变为无效显示区域的一部分显示内容或者全部变为无效,以致于必须更新画面时,将由这个消息,以致于必须更新画面时,将由这个消息通知程序。通知程序。显示区域的显示内容怎么会变得无效呢?在最初显示区域的显示内容怎么会变得无效呢?在最初建立窗口的时候,整个显示区域都是无效的,因建立窗口的时候,整个显示区域都是无效的,因为程序还没有在窗口上画什么东西。第一条为程序还没有在窗口上画什么东西。第一条WM_PAINT消息(通常发生在消息(通常发生在WinMain中呼叫中呼叫UpdateWindow时)指示窗口函数在显示区域上时)指示窗口函数在显示区域上画一些东西。画一些东西。3.1

47、.12 WM_DESTROY消息消息WM_DESTROY消息是另一个重要消息。这一个消消息是另一个重要消息。这一个消息指示,息指示,Windows正在关闭窗口。正在关闭窗口。PostQuitMessage(0)在程序的消息队列中插入一在程序的消息队列中插入一个个WM_QUIT消息。导致消息。导致WinMain退出消息循环,退出消息循环,并终止程序。并终止程序。3.2 Windows 程序设计的难点程序设计的难点 Windows程序所作的一切都是响应发送给窗口函程序所作的一切都是响应发送给窗口函数的消息。这是概念上的主要难点之一。数的消息。这是概念上的主要难点之一。3.2.1 别呼叫我,我会呼叫

48、您别呼叫我,我会呼叫您 尽管尽管Windows有有1000个以上的函数可供程序呼叫,个以上的函数可供程序呼叫,但但Windows也呼叫使用者程序,如窗口函数也呼叫使用者程序,如窗口函数WndProc。窗口函数与窗口类别相关,窗口类别是程序呼叫窗口函数与窗口类别相关,窗口类别是程序呼叫RegisterClass注册的。依据该类别建立的窗口使用注册的。依据该类别建立的窗口使用这个窗口函数来处理窗口的所有消息。这个窗口函数来处理窗口的所有消息。Windows通过呼叫窗口函数对窗口发送消息。通过呼叫窗口函数对窗口发送消息。3.2.1 别呼叫我,我会呼叫您别呼叫我,我会呼叫您 在第一次建立窗口时,在第一

49、次建立窗口时,Windows呼叫呼叫WndProc。在窗口关闭时,在窗口关闭时,Windows也呼叫也呼叫WndProc。窗口。窗口改变大小、移动或者变成图示时,从菜单中选择改变大小、移动或者变成图示时,从菜单中选择某一项目、挪动滚动条、按下鼠标按钮或者从键某一项目、挪动滚动条、按下鼠标按钮或者从键盘输入字符时,以及窗口显示区域必须被更新时,盘输入字符时,以及窗口显示区域必须被更新时,Windows都要呼叫都要呼叫WndProc。所有这些所有这些WndProc呼叫都以消息的形式进行。在呼叫都以消息的形式进行。在大多数大多数Windows程序中,程序的主要部分都用来程序中,程序的主要部分都用来处

50、理消息。处理消息。Windows可以发送给窗口函数的消息可以发送给窗口函数的消息通常都以通常都以WM开头的名字标识,并且都在开头的名字标识,并且都在WINUSER.H表头文件中定义。表头文件中定义。3.2.1 别呼叫我,我会呼叫您别呼叫我,我会呼叫您 但在但在Windows中,这种概念扩展为包括一切事件。中,这种概念扩展为包括一切事件。窗口中发生的一切都以消息的形式传给窗口函数。窗口中发生的一切都以消息的形式传给窗口函数。然后,窗口函数以某种方式响应这个消息,或者然后,窗口函数以某种方式响应这个消息,或者将消息传给将消息传给DefWindowProc,进行内定处理。,进行内定处理。在在HELL

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁