1、临沂大学信息学院 丁林花,1,第二个windows程序 空白窗口,目标:掌握windows API创建窗口程序的步骤主程序1. 创建窗口1.1 定义窗口类对象1.2 注册窗口类1.3 创建窗口实例1.4 显示1.5 更新窗口2. 处理消息(消息循环)窗口函数(消息处理函数),临沂大学信息学院 丁林花,2,第二个windows程序 空白窗口,主程序课外阅读匈牙利命名法函数调用约定国际化编程Unicode编码Ascll编码,int WINAPI WinMain( HINSTANCE hlnstance, HINSTANCE hPrelnstance, LPSTR lpCmdLine, int nC
2、mdShow),临沂大学信息学院 丁林花,3,创建窗口第一步,定义窗口类,typedef struct tagWNDCLASSA UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDC
3、LASSA;typedef struct tagWNDCLASSW UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;#ifdef UNICODEtypedef W
4、NDCLASSW WNDCLASS;typedef PWNDCLASSW PWNDCLASS;typedef NPWNDCLASSW NPWNDCLASS;typedef LPWNDCLASSW LPWNDCLASS;#elsetypedef WNDCLASSA WNDCLASS;typedef PWNDCLASSA PWNDCLASS;typedef NPWNDCLASSA NPWNDCLASS;typedef LPWNDCLASSA LPWNDCLASS;#endif / UNICODE,#include ,临沂大学信息学院 丁林花,4,创建窗口第二步,注册窗口类 RegisterClas
5、s,ATOMRegisterClass(CONST WNDCLASS*lpWndClass );,临沂大学信息学院 丁林花,5,创建窗口第三步,创建窗口实例 CreateWindow,HWND CreateWindow ( LPCTSTR lpszClassName, /窗口类名LPCTSTR lpszTitle, /窗口标题名DWORD dwStyle, /创建窗口的样式int x,y, /窗口左上角坐标int nWidth,nHeight, /窗口宽度和度高HWND hwndParent, /该窗口的父窗口句柄HWENU hMenu, /窗口主菜单句柄HINSTANCE hInstance
6、, /创建窗口的应用程序当前句柄LPVOID lpParam /指向一个传递给窗口的参数值的指针 ),临沂大学信息学院 丁林花,6,窗口样式,临沂大学信息学院 丁林花,7,创建窗口 第四步,显示窗口 ShowWindow,BOOLShowWindow(HWNDhWnd, intnCmdShow );,临沂大学信息学院 丁林花,8,创建窗口 第五步,刷新窗口 UpdateWindow,BOOL UpdateWindow( HWND hWnd );,显示窗口后,应用程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息。 UpdateWindow(hwnd);,临沂大学信息学
7、院 丁林花,9,建立消息循环,Windows应用程序的运行以消息为核心,应用程序必须读取应用程序消息队列,检索消息并将它们发送出去,以便适当的窗口函数能够处理它们,完成这一任务的便是消息循环。,临沂大学信息学院 丁林花,10,建立消息循环,从消息队列中获取消息GetMessage翻译消息和派遣消息TranslateMessageDispatchMessage,临沂大学信息学院 丁林花,11,GetMessage,从消息队列中读取一条消息,并将消息放在MSG结构中,其中函数GetMessage形式为:GetMessage( lpMSG, /指向MSG结构的指针 hwnd, nMsgFilteMi
8、n, /用于消息过滤的最小消息号值 nMsgFilterMax /用于消息过滤的最大消息号值 ),返回零值,即检索到WM_QUIT消息,程序结束循环并退出,临沂大学信息学院 丁林花,12,消息响应,操作系统能够感知输入设备的变化(事件),并且能够知道具体的事件情况,但操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。对事件作出反应的过程就是消息响应。,临沂大学信息学院 丁林花,13,消息,操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递
9、给应用程序。,临沂大学信息学院 丁林花,14,消息结构体,MSG结构定义如下:,typedef struct tagMSG HWNDhwnd; /窗口句柄 UINTmessage; /主消息 WPARAMwParam; /附加消息 LPARAMlParam; DWORDtime; /送至队列的时间 POINTpt; /消息发送时屏幕光标的位置 MSG, *PMSG;,临沂大学信息学院 丁林花,15,Windows对象,Windows窗口是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。Windows Object是Windows系
10、统的内部结构,是Windows的规范部件,包括各种窗口、菜单、按钮、对话框以及程序模块等,通过一个句柄来引用。,临沂大学信息学院 丁林花,16,句柄(Handle),句柄(HANDLE),Windows用来标识被应用程序建立或使用的Windows对象的一个唯一的整数值。操作系统要管理和操作这些Windows对象(资源),都是通过句柄来找到对应的对象。按Windows对象的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号(整数值)即窗口句柄。,- 1
11、7 -,Windows编程基础句柄,临沂大学信息学院 丁林花,18,主消息,由事先定义好的消息名标识采用不同的前缀符号来区别能够解释和处理消息的窗口类型WM_ 窗口消息BM_ 按钮控制消息CB_ 组合框控制消息DM_ 默认下压式按钮控制消息EM_ 编辑控制消息LB_ 列表框控制消息SMB_ 滚动条控制消息,临沂大学信息学院 丁林花,19,附加消息,与主消息有关wParamlParam,临沂大学信息学院 丁林花,20,窗口过程,窗口过程函数用来对消息进行处理,LRESULT CALLBACKWndProc (HWNDhWnd,UINT message,WPARAM wParam,LPARAM l
12、Param );,临沂大学信息学院 丁林花,21,窗口函数的一般形式如下:LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae, WPARAM wParam,LPARAM lParam ) switch(message) message为标识的消息 case break; case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lParam); return(0);,在消息处理程序段中一般都有对WM_DESTROY的处理,该消息是关闭窗
13、口时发出的。它向应用程序发出WM_QUIT消息,请求退出处理函数: void PostQuitMessage(int nExitCode) /nExitCode为应用程序的退出代码,为未定义处理过程的消息提供缺省处理,临沂大学信息学院 丁林花,22,程序执行流程,第二个windows程序 代码示例,临沂大学信息学院 丁林花,23,#include #include LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);/窗口处理函数声明int WINAPI WinMain(_in HINSTANCE
14、hInstance, _in_opt HINSTANCE hPrevInstance, _in LPSTR lpCmdLine,_in int nShowCmd )TCHAR lpszClassName = _T(MyWindow);TCHAR lpszWindowName = _T(我的第一个窗口);HWND hwnd;/1.定义窗口类对象WNDCLASS wndclass;wndclass.style = 0;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hIn
15、stance = hInstance;wndclass.hIcon = NULL;wndclass.hCursor = NULL;wndclass.hbrBackground = NULL;wndclass.lpszMenuName = NULL;wndclass.lpszClassName = lpszClassName;,第二个windows程序 代码示例续,临沂大学信息学院 丁林花,24,/2.注册窗口if(!RegisterClass(/将消息传递到窗口函数,将紫色部分分别改成NULL试试,将消息循环注释掉试试,第二个windows程序 代码示例续,临沂大学信息学院 丁林花,25,LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)switch(uMsg)case WM_CLOSE:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);return 0;,将紫色部分注释掉试试,