资源预览内容
第1页 / 共54页
第2页 / 共54页
第3页 / 共54页
第4页 / 共54页
第5页 / 共54页
第6页 / 共54页
第7页 / 共54页
第8页 / 共54页
第9页 / 共54页
第10页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第4章自动生成与消息处理,本章主要介绍如何利用系统给定的程序框架进行Win32程序设计及在此基础上添加功能的方法,最后根据消息处理的新思路,进行改制,以便进一步熟悉Windows程序的消息处理机制,为学习使用MFC编程打下基础。,主要内容,4.1 使用预定格式自动产生一个程序4.2 改造程序结构 修改头文件并编制相应的cpp文件4.3 添加新的功能 添加菜单资源并修改对话框窗口函数4.4 使用model对话框4.5 其他资源4.6 改变消息处理方法 将消息和消息处理的函数关联起来,4.1使用预定格式自动产生一个程序,从第3章的程序中可以看出,Windows程序有很强的模块化结构特性,各种Windows应用程序之间有很多共同点。如果将这些共同点都固定下来,并使用自动编程方法加以实现,就可以省去编程人员的许多麻烦。假设在建立一个wnd4项目时,选择“A typical Hello Word!application”(参见图2.1),则自动生成一个Windows程序。图4.1是其运行示意图。,图4.1自动生成程序运行示意图,图4.1自动生成程序运行示意图,该程序不是使用WNDCLASS,而是使用 WNDCLASSEX 定义窗口,即 WNDCLASSEX wcex;WNDCLASSEX只是多了两个参数,使用方法一样。这个程序表演了使用菜单和对话框资源,回调函数的消息处理如下:switch (message) case WM_COMMAND:wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections:switch (wmId) case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break;,case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); break; case WM_PAINT:hdc = BeginPaint(hWnd, &ps);/ TODO: Add any drawing code here.RECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);EndPaint(hWnd, &ps);break;,case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);由此可见,命令在WM_COMMAND消息中,具体是哪一个命令则再次使用swich语句进行筛选。例如本程序中设计了IDM_ABOUT和IDM_EXIT两个菜单消息,前者由“Help”菜单的“About”菜单项产生,后者由“File”菜单的“Exit”菜单项产生,在resource.h中定义它们的值。,程序还使用了字符串资源,如图4.2所示。如将“Hello Word!”修改为“Hello”,则窗口的输出内容为“Hello”。IDS_APP_TIFLE的内容是标题条内容“wnd4”,可以改变它的内容,例如将它的内容修改成“简单的Hello程序”。,图4.2 String Table资源示意图,资源文件为wnd4.rc,其中的菜单定义如下:IDC_WND4 MENU DISCARDABLE BEGIN POPUP &File /菜单条上的File弹出菜单 BEGIN MENUITEM E&xit, IDM_EXIT /File菜单Exit菜单项 END POPUP &Help /菜单条上的Help弹出菜单 BEGIN MENUITEM &About ., IDM_ABOUT /Help菜单About菜单项 ENDEND,资源文件还为对话框定义了加速键(即热键),“Alt+?”和“Alt+/”均可弹出对话框。IDC_WND4 ACCELERATORS MOVEABLE PURE BEGIN ?, IDM_ABOUT, ASCII, ALT /, IDM_ABOUT, ASCII, ALTEND这种消息的处理也很简单,先判是否有加速键消息,如果有则调相应函数处理,否则继续按常规处理。while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg);DispatchMessage(&msg);,注意自动增加的源文件StdAfx.cpp,它只有如下一句话: #include stdafx.h文件stdafx.h 中包含有windows.h文件,这是Visual C+ 6.0自动生成的结构形式。在单独编译时,需要先编译这个文件。由此可见,可以使用Visual C+ 6.0的向导自动生成程序界面并实现部分常用功能。用户可以根据自己的需要修改和增加程序体,实现自己的特定要求。,4.2 改造程序结构如果对结构不满意,还可以进行改造。这里采取简单的方法,将文件wnd4.cpp中的两个窗口回调函数全部单独分离开来,做在文件wndProc.cpp中。 4.2.1 修改头文件函数原型声明和公共变量放在resource.h文件中,增加内容如下:/增加的常数定义#define MAX_LOADSTRING 100/ 增加的外部句柄声明extern HINSTANCE hInst;/增加的函数声明ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);int APIENTRY WinMain(HINSTANCE,HINSTANCE, LPSTR, int);LRESULT CALLBACK About(HWND, UINT , WPARAM , LPARAM );LRESULT CALLBACK WndProc(HWND , UINT, WPARAM , LPARAM );,增加的这些语句既可以放在语句 #define IDC_STATIC -1之后,也可以放在文件的开始处 。4.2.2 编制Wnd4Proc.cpp文件 添加一个Wnd4Pro.cpp文件,直接将wnd4.cpp中的两个回调函数剪切过来,然后将其文件开始处的包含语句拷贝过来。例如:#include stdafx.h#include resource.h/ FUNCTION: WndProc(HWND, unsigned, WORD, LONG)/.LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHelloMAX_LOADSTRING;LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch (message) case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections:switch (wmId) case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);,break;case IDM_EXIT: DestroyWindow(hWnd); break;default: return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_PAINT: hdc = BeginPaint(hWnd, &ps); / TODO: Add any drawing code here. RECT rt;GetClientRect(hWnd, &rt);DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);EndPaint(hWnd, &ps);,break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam); return 0;/ Mesage handler for about box.LRESULT CALLBACK About( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam),
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号