第3章 Windows编程与MFC GetMessageo函数只有在接收到wM_QUIT消息时,才返回0。此时whil语句判断的条件为假, 循环退出,程序才有可能结束运行。在没有接收到 WM QUIT消息时, Windows应用程序就通过这个 while循环来保证程序始终处于运行状态。 ②应用程序调用 Translate Message函数用于将虚拟键消息转 GetMessage函数从消 消息到指定窗口,由窗囗函数WdP对消息进将酒回传给厘用程序P并消息 换为字符消息。 DispatchMessage函数分派一个③应用程序调用 行处理。 作系统 消息队列 说明 ispachMessage s实际上是将消息回传给操作系|r 统,由操作系统调用窗口函数对消息进行处理 Window应用程序的消息处理机制可表示为图的 ④利用 WNDCLASS ①操作系统将接收到 的 IpfnWndProc成员 应用程序的窗口消息 2.3所示 保存的窗口函数的指 投递到其消息队列 针调用窗口函数,处 224 WinProc窗口函数 理消息 图23 Windows应用程序的消息处理机制 在完成上述步骤后,剩下的工作就是编写一个 窗口函数,用于处理发送给窗口的消息。 Win Proc函数由一个或多个 switch语句组成。每一条case语句 对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活。窗口函数的一般形式如下 LRESULT CALLBACK WndProc(HWNDhwnd, UINT messgae, WPARAM wParam, LPARAM lParam switch(message // message为标识的消息 I case break case WM DEStroy //退出 PostQuitMessage(0) de fault r teturn DefwindowProc (hwnd, message, wParam, lParam) 2.2.5 Windows编程实例 本节将通过一个实例讲解 Windows窗口的创建。该 Windows应用程序将创建并显示一个窗口,在 客户区中输出文本。 在 Visual c++60中,可以使用 App Wizard创建一个空的“win32 Application”工程,在其中创建 源文件,利用 Windows api函数实现基本的 Windows窗口程序编程。实例的具体实现过程如下 (1)启动Ⅴ isual c++6.0,利用 App wizard来建立一个“win32 Application”类型的工程 “ Windows demo”,向导默认选项就是创建一个空工程。 (2)通过执行“Fle”→“New”菜单命令,向工程添加源文件“ Apidemo.cpp”,具体方法参见 励志照亮人生编程改变命
35 励志照亮人生 编程改变命运 第 3 章 Windows编程与MFC基础 GetMessage()函数只有在接收到WM_QUIT消息时,才返回0。此时while语句判断的条件为假, 循环退出,程序才有可能结束运行。在没有接收到WM_QUIT消息时,Windows应用程序就通过这个 while循环来保证程序始终处于运行状态。 TranslateMessage()函数用于将虚拟键消息转 换为字符消息。DispatchMessage()函数分派一个 消息到指定窗口,由窗口函数WndProc()对消息进 行处理。 说明 DispachMessage实际上是将消息回传给操作系 统,由操作系统调用窗口函数对消息进行处理。 Windows应用程序的消息处理机制可表示为图 2.3所示。 2.2.4 WinProc窗口函数 在完成上述步骤后,剩下的工作就是编写一个 窗口函数,用于处理发送给窗口的消息。WinProc函数由一个或多个switch语句组成。每一条case语句 对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活。窗口函数的一般形式如下: 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); } 2.2.5 Windows编程实例 本节将通过一个实例讲解Windows窗口的创建。该Windows应用程序将创建并显示一个窗口,在 客户区中输出文本。 在Visual C++6.0中,可以使用AppWizard创建一个空的“Win32Application”工程,在其中创建 源文件,利用Windows API函数实现基本的Windows窗口程序编程。实例的具体实现过程如下: (1)启动Visual C++ 6.0,利用AppWizard来建立一个“Win32Application”类型的工程 “WindowsDemo”,向导默认选项就是创建一个空工程。 (2)通过执行“File”→“New”菜单命令,向工程添加源文件“Apidemo.cpp”,具体方法参见 2.2.2节。 图2.3 Windows应用程序的消息处理机制 ② 应用程序调用 GetMessage函数从消 息队列中取出消息, 并进行预处理 ④ 利用WNDCLASS 的lpfnWndProc成员 保存的窗口函数的指 针调用窗口函数,处 理消息 ① 操作系统将接收到 应用程序的窗口消息 投递到其消息队列 ③ 应用程序调用 DispatchMessage, 将消息回传给操 作系统 操作系统 窗口函数 应用程序 消息队列
Visual c++ (3)在“ Epidem.cpp”文件中,编辑代码如下 lude<windows.h> //包含 windows.h头文件 LRESULT CALLBACK WndProc(HWND,UINT, WPARAM, L PARAM);//窗口函数声明 /*入口函数 WinMain()*/ int APIENTRY winMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpcmdline int ncmdshow)I WNDCLASs wndclass /定义窗口类结构变量 HWNDhwnd //定义窗口句柄 定义消息结构变量 /*定义窗口类的各属性*/ wndclass style CS HREDRAW I CS VREDRAW //改变窗口大小则重画 wndclass. lpfnwndproc Wndproc //窗口函数为 WndProc wndclass. cbClsExtra =0 //窗口类无扩展 wndclass. cbWndExtra =0 /窗口实例无扩展 wndclass hInstance hInstance //注册窗口类实例句柄 wndclass. hicon= loadicon(NULL, IDI APPLICATION);//用箭头光标 wndclass cursor Loadcursor (NULL, IDC ARROW wndclass. hbrBackground=( HBRUSH) Getstockobject( WHITE BRUSH);//背景为白色 ndclass. lpszMenuN /窗口默认无菜单 wndclass.1pszC⊥ assName=" window窗口创建 //窗口类名为 window窗口创建 /*注册窗口类*/ if(! Registerclass(&wndclass)) return FALSE 创建窗口*/ hwnd= createwindow(" window窗口创建 //窗口类名 window窗口创建 window窗口创建 //窗口名 window窗口创建 WS OVERLAPPEDWIN DOW //重叠式窗口 CW USEDEFAULT, CW USEDEFAULT, //左上角屏幕坐标默认值 CW USEDEFAULT, CW USEDEFAULT /窗口宽度和高度默认值 NULL, //此窗口无父窗口 NULL //此窗口无主菜单 hInstance //创建此窗口的实例句柄 NULL) //此窗口无创建参数 /*显示并更新窗口* Showwindow(hwnd, ncmdshow) //显示窗口 Updatewindow (hwnd) //更新窗口的客户区 /*消息循环*/ while(GetMessage (&msg, NULL, 0,0)) TranslateMessage /键盘消息转换 DispatchMessage (&msg) //派送消息给窗口函数 return msg. wParam; //返回退出值 /*窗口函数+ LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM IParam)( //根据消息值转相应的消息处理 itch (message)( case M PAInt //重画窗口客户区消息处理 DC hdc 定义设备描述表句柄 励志照亮人生编程改变命运
(3)在“Apidemo.cpp”文件中,编辑代码如下: #include<windows.h> //包含windows.h头文件 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM ); //窗口函数声明 /*入口函数 WinMain()*/ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASS wndclass; //定义窗口类结构变量 HWND hwnd; //定义窗口句柄 MSG msg; //定义消息结构变量 /*定义窗口类的各属性*/ wndclass.style = CS_HREDRAW|CS_VREDRAW; //改变窗口大小则重画 wndclass.lpfnWndProc = WndProc; //窗口函数为WndProc wndclass.cbClsExtra = 0; //窗口类无扩展 wndclass.cbWndExtra = 0; //窗口实例无扩展 wndclass.hInstance = hInstance; //注册窗口类实例句柄 wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //用箭头光标 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景为白色 wndclass.lpszMenuName = NULL; //窗口默认无菜单 wndclass.lpszClassName = "window窗口创建"; //窗口类名为window窗口创建 /*注册窗口类*/ if(! RegisterClass(&wndclass)) return FALSE; /*创建窗口*/ hwnd = CreateWindow("window窗口创建", //窗口类名 window窗口创建 "window窗口创建", //窗口名window窗口创建 WS_OVERLAPPEDWINDOW, //重叠式窗口 CW_USEDEFAULT, CW_USEDEFAULT, //左上角屏幕坐标默认值 CW_USEDEFAULT, CW_USEDEFAULT, //窗口宽度和高度默认值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口的实例句柄 NULL); //此窗口无创建参数 /*显示并更新窗口*/ ShowWindow(hwnd,nCmdShow); //显示窗口 UpdateWindow (hwnd); //更新窗口的客户区 /*消息循环*/ while(GetMessage (&msg,NULL,0,0)) { TranslateMessage (&msg); //键盘消息转换 DispatchMessage (&msg); //派送消息给窗口函数 } return msg.wParam; //返回退出值 } /*窗口函数*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam){ //根据消息值转相应的消息处理 switch (message){ case WM_PAINT: //重画窗口客户区消息处理 HDC hdc; //定义设备描述表句柄 36 励志照亮人生 编程改变命运 零基础学 Visual C++