版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 Windows编程基础,6.1 Windows程序的特点 6.2 基本概念 6.3 Win32程序的基本结构 6.4 利用API开发Win32程序实例 6.5 使用AppWizard生成Win32程序 习 题,6.1 Windows程序的特点,Windows程序的主要特点。 1用户界面统一、友好 2独立于设备的图形操作 3支持多任务 4队列化消息输入 5支持队列特征的消息驱动模型 6事件驱动的程序设计,7资源共享 系统资源与用户自定义资源的区别是: (1) 用户自定义资源是窗口可视元素的映像。 (2) 用户自定义资源的标志号可由一个自定义的整数或者名字来表示,一般在同类资源中,如对话框
2、,该整数在程序范围内是惟一的。,8程序和资源分开 引入资源有以下一些好处: (1) 可降低内存需求。 (2) 便于统一管理和重复利用。 (3) 应用程序与界面有一定的独立性。 9支持应用程序间的数据交换,6.2 基本概念,6.2.1 事件及事件驱动 事件通常以以下三种方式产生: l通过输入设备,如键盘和鼠标; l通过屏幕上可视的对象,如菜单、工具栏按钮、 滚动条和对话框上的控件; l 来自Windows内部,如当一个后面的窗口显示到前面来时。 基于事件驱动的程序模型如图6-1所示。,图6-1 基于事件驱动的程序模型,6.2.2 消息 1消息来源 Windows应用程序的消息来源有以下四种: (
3、1) 输入消息: (2) 控制消息: (3) 系统消息: (4) 用户消息:,VC+中存在几种系统定义的消息分类,不同的前缀符号经常用于识别不同的消息类,系统定义的消息宏前缀如下: lBM:按钮控制消息; l CB:组合框控制消息; l DM:默认下压式按钮控制消息; l EM:编辑控制消息; l LB:列表框控制消息; l SBM:滚动条控制消息; l WM:窗口控制消息。,2消息的数据结构 消息的数据结构MSG的定义如下: typedef struct tagMSG HWND hwnd; /用以检索消息的窗口句柄,如为NULL, /则可以检索所有驻留在消息队列中的消息 UINT messa
4、ge; /消息值,WPARAM wParam; /包含有关消息的附加信息 LPARAM lParam; /随不同的消息而有所不同 DWORD time; /消息送到队列的时间 POINT pt; /消息发送时,屏幕光标的位置 MSG;,其中:typedef struct tagPOINT LONG x,y; POINT;,3消息队列 支持队列特征的消息驱动模型如图6-2所示。,图6-2 支持队列特征的消息驱动模型,4常用消息 Windows程序常用的消息有: WM_LBUTTONDOWN:单击鼠标左键时产生的消息; WM_LBUTTONUP:放开鼠标左键时产生的消息; WM_RBUTTONDO
5、WN:单击鼠标右键时产生的消息; WM_RBUTTONUP:放开鼠标右键时产生的消息; WM_LBUTTONDBLCLK:双击鼠标左键时产生的消息; WM_RBUTTONDBLCLK:双击鼠标右键时产生的消息; WM_KEYDOWN:按下一个非系统键时产生的消息,附加信息参数wParam为按下键的虚拟键码,虚拟键码用以标识按下或释放的键,lParam记录按键的重复次数、扫描码等状态信息;,WM_CHAR:按下一个非系统键时产生的消息,附加信息参数wParam为按下键的ASCII码,lParam的意思同上; WM_CREATE:CreateWindows函数产生的消息; WM_CLOSE:关闭窗
6、口时产生的消息; WM_DESTROY:消除窗口时由DestroyWindows()发出的消息; WM_QUIT:退出应用程序时由PostQuitMessage()发出的消息; WM_PAINT:Windows系统需要重绘时产生的消息。,6.2.3 对象与句柄 常见Windows对象的句柄如下所示: Windows对象相关句柄 设备环境HDC 窗口HWND 菜单HMENU 光标HCURSOR 画笔HPEN,画刷HBRUSH 字体HFONT 图标HICON 位图HBITMAP 调色板HPALETTE 文件HFILE 区域HRGN 加速键表HACCEL,6.2.4 API函数 根据Windows
7、API函数的功能,可以将其分为三类: (1) 管理函数:实现窗口的创建、移动和修改功能。 (2) 图形设备函数:实现与设备无关的图形操作功能。 (3) 系统服务函数:实现与操作系统有关的多种功能。,6.3 Win32程序的基本结构,6.3.1 Win32源程序的组成 1WinMain函数 WinMain函数的功能是: (1) 注册窗口类,建立窗口及执行其他必要的初始化工作。 (2) 进入消息循环,根据从消息队列中接收的消息,调用相应的处理过程。 (3) 当消息循环检索到WM_QUIT消息时,终止程序执行。,WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环。 函数说明 WinM
8、ain函数 初始化 消息循环,窗口类的定义 注册窗口类RegisterClass() 创建窗口CreateWindow() 显示窗口ShowWindow(),1) 函数说明 WinMain函数的声明如下: int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) 2) 初始化 初始化包括窗口类的定义、注册窗口类、创建窗口和显示窗口四部分。需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow函数更新并绘制用户区,并发出WM_PAINT消息。,3
9、) 消息循环 应用程序通常有一段代码称为消息循环,形式如下: While(GetMessage( /将原始键盘消息转化为 /字符(WM_CHAR)消息,DispatchMessage( /确定应用程序中应该得到 /消息的窗口,并将消息发送给它 在应用程序的消息队列中检索到WM_QUIT消息之前,这个循环会不断运行。当它收到WM_QUIT时,GetMessage返回false,循环停止,同时应用程序终止。 2消息处理函数 消息处理函数是用于处理特定消息的一些代码,一般包括一个多分支switch语句结构。,LRESULT CALLBACK WndProc(HWND hwnd,UINT messag
10、e,WPARAM wParam,LPARAM lParam) switch(message) case WM_DESTROY: PostQuitMessage(0); default: return DefWindowProc(hwnd,message,wParam,lParam); return (0); ,图6-3是Windows程序和消息的基本流程。,图6-3 Windows程序和消息的基本流程,6.3.2 Windows数据类型 读者将看到Windows程序并不扩展标准C+数据类型的用途,诸如整型(int)或字符型(char)。相反,Windows将使用的所有类型定义在Windows.
11、h文件和其相关的文件中。一些常用的类型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整数(WORD)、布尔型(BOOL)、字符串指针(LPSTR)以及常量字符串指针(LPCSTR)等。 HANDLE是一个用作句柄的32位整数,句柄是代表某些资源的简单的数值,所有的句柄类型以H开头。,6.4 利用API开发Win32程序实例,下面介绍建立基于API的应用程序框架的步骤。 (1) 在File下拉菜单中选择New选项,以建立项目文件。 (2) 在弹出的New对话框中,选择Projects选项卡,并选择其中的Win32 Application项,在Project Name编辑框中填
12、人所要创建的项目文件名Myapi,然后单击OK按钮。 (3) 此时弹出如图6-4所示的界面,选择其中的An empty project选项,说明是创建一个空的项目文件。,图6-4 Win32 Application Step 1 of 1对话框,(4) 单击图6-4中的Finish按钮,出现如图6-5所示的界面,说明已经创建空的应用程序框架。,图6-5 New Project Information对话框,在图6-5中单击OK按钮,弹出如图6-6所示的界面。,图6-6 空的Win32应用程序框架界面,如图6-6所示,选择Source Files文件夹,单击鼠标右键,在弹出的快捷菜单中选择Add
13、 Files to Folder选项,然后在弹出的如图6-7所示的对话框中选择所要加入的源程序文件即可。,图6-7 Insert Files into Project对话框,例6-1 创建一个如图6-8所示的Windows窗口。,图6-8 Windows窗口程序的运行结果,源程序代码如下: #include /窗口函数说明 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /初始化窗口类 /WinMain函数说明 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst, LPSTR
14、 lpszCmdLine,int nCmdShow), HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; char lpszClassName = “窗口”; /窗口类名 char lpszTitle= My_Windows; /窗口标题名,/窗口类的定义 wndclass.style = 0; /窗口类型为缺省类型 wndclass.lpfnWndProc = WndProc ; /窗口处理函数为WndProc wndclass.cbClsExtra= 0 ; /窗口类无扩展 wndclass.cbWndExtra= 0 ; /窗口实例无扩展,wndclas
15、s.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 = lps
16、zClassName /窗口类名为“窗口示例”,/窗口类注册 if( !RegisterClass( ,/创建窗口 hwnd=CreateWindow(lpszClassName,/窗口类名 lpszTitle,/窗口实例的标题名 WS_OVERLAPPEDWINDOW, /窗口的风格 CW_USEDEFAULT, CW_USEDEFAULT, /窗口左上角坐标为缺省值 CW_USEDEFAULT,CW_USEDEFAULT, /窗口的高和宽为缺省值 NULL,/此窗口无父窗口 NULL,/此窗口无主菜单 hInstance,/创建此窗口的应用程序的当前句柄 NULL) ; /不使用该值 /显
17、示窗口 ShowWindow( hwnd, nCmdShow) ;,/绘制用户区 UpdateWindow(hwnd); /消息循环 while( GetMessage( /消息循环结束即程序终止时将信息返回系统 ,/窗口函数 LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam) switch(message) case WM_DESTROY: PostQuitMessage(0); /调用PostQuitMessage发出WM_QUIT消息,default: /默认时采用系统消息默认处理函数
18、 return DefWindowProc(hwnd,message,wParam,lParam); return (0); ,6.5 使用AppWizard生成Win32程序,前面我们已经利用API编写了一个Win32程序。下面将介绍怎样使用AppWizard创建一个典型的Win32窗口程序,步骤如下: (1) 在File下拉菜单中选择New选项,以建立工程文件。 (2) 在弹出的New对话框中,选 Projects选项卡,并选择其中的Win32 Application,在Project Name编辑框中填入所要创建的项目文件名,然后单击OK按钮。 (3) 此时弹出如图6-9所示的界面,选择
19、其中的A tapical “Hello World!” application选项,说明是创建一个典型的Win32窗口程序。,图6-9 Win32 ApplicationStep 1 of 1对话框,(4) 单击Finish按钮,完成创建。 完成以上操作步骤,AppWizard生成了如图6-10所示的文件。,图6-10 Mywin32的文件标签,(5) 编译运行程序,得到如图6-11所示的用户界面。,图6-11 Mywin32程序运行结果,在此我们没有添加任何代码,AppWizard就生成了基本的Mywin32程序,该程序有基本的菜单,能显示“Hello World!”信息。 向导生成的源代码
20、如下: / Mywin32.cpp : Defines the entry point for the application. #include stdafx.h #include resource.h #define MAX_LOADSTRING 100,/ Global Variables: HINSTANCE hInst;/ current instance TCHAR szTitleMAX_LOADSTRING;/ The title bar text TCHAR szWindowClassMAX_LOADSTRING;/ The title bar text / Foward de
21、clarations of functions included in this code module: ATOMMyRegisterClass(HINSTANCE hInstance); BOOLInitInstance(HINSTANCE, int);,LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
22、 LPSTR lpCmdLine, int nCmdShow), / TODO: Place code here. MSG msg; HACCEL hAccelTable; / Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_MYWIN32, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); / Perform application initi
23、alization:,if (!InitInstance (hInstance, nCmdShow) return FALSE; hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MYWIN32); / Main message loop: while (GetMessage( wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc= (WNDPROC)WndProc; wcex.cbClsExtra= 0; wce
24、x.cbWndExtra= 0;,wcex.hInstance= hInstance; wcex.hIcon=LoadIcon(hInstance, (LPCTSTR)IDI_MYWIN32); wcex.hCursor= LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName= (LPCSTR)IDC_MYWIN32; wcex.lpszClassName= szWindowClass; wcex.hIconSm= LoadIcon(wcex.hInstance,
25、 (LPCTSTR)IDI_SMALL); return RegisterClassEx( ,/ FUNCTION: InitInstance(HANDLE, int) / PURPOSE: Saves instance handle and creates main window / COMMENTS: / In this function, we save the instance handle in a global variable and / create and display the main program window. BOOL InitInstance(HINSTANCE
26、 hInstance, int nCmdShow), HWND hWnd; hInst = hInstance; / Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(h
27、Wnd); return TRUE; ,/ FUNCTION:WndProc(HWND, unsigned, WORD, LONG) / PURPOSE:Processes messages for the main window. / WM_COMMAND:process the application menu / WM_PAINT:Paint the main window / WM_DESTROY:post a quit message and return LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
28、 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(h
29、Inst, (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, ,case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message,
30、wParam, lParam); return 0; ,/ Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) switch (message) case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL), EndDialog(hDlg, LOWORD(wParam); return TRUE; break; return FALSE; ,在上述代码中,WinMain函数包含如下过程: (1) MyRegisterClass函数定义窗口类变量并利用RegisterClassEx函数注册。 (2) InitInstance函数调用CreateWindow创建窗口,如果创建成功,则显示和更新窗口。 (3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院入住管理制度
- 企业内部培训与成长制度
- 公共交通票务管理制度
- 2026年金融风险控制师知识水平测试题集
- 2026年儿科常见手术操作技巧与考试题
- 2026年营养师职业资格考试营养学与膳食管理题库集
- 2026年中级财务会计考试题目及解析
- 2026年会计职称考试题库与答案解析
- 2026年农业项目验收协议(全面·达标版)
- 护理措施精准化选择
- 2025年司法鉴定人资格考试历年真题试题及答案
- 江苏省连云港市2024-2025学年第一学期期末调研考试高二历史试题
- 生成式人工智能与初中历史校本教研模式的融合与创新教学研究课题报告
- 2025年湖北烟草专卖局笔试试题及答案
- 2026年开工第一课复工复产安全专题培训
- 特殊人群(老人、儿童)安全护理要点
- 2026年检察院书记员面试题及答案
- 《煤矿安全规程(2025)》防治水部分解读课件
- 2025至2030中国新癸酸缩水甘油酯行业项目调研及市场前景预测评估报告
- 2025年保安员职业技能考试笔试试题(100题)含答案
- 尾矿库闭库综合治理工程项目可行性研究报告
评论
0/150
提交评论