02_Windows编程与MFC基础.pdf
《02_Windows编程与MFC基础.pdf》由会员分享,可在线阅读,更多相关《02_Windows编程与MFC基础.pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、30励 志 照 亮 人 生 编 程 改 变 命 运零基础学Visual C+第2 章Windows编程与MFC基础要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制。本章首先将剖析Windows程序的内部运行机制,为读者扫清VC+学习路途中的第一个障碍,而后简单介绍一下MFC的基础知识,为进一步学习MFC程序开发打下基础。2.1 Windows编程基础Windows操作系统采用了图形用户界面,借助于它提供的API(Application ProgrammingInterface)函数,用户可以编出具有漂亮图形界面的程序。本节将主要介绍一下涉及Windo
2、ws编程中用到的一些概念。2.1.1 Windows API函数为方便用户开发Windows应用程序,Windows操作系统提供了各种各样的函数。这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数。用户在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在“Windows.h”头文件中进行了声明。Windows API也是Windows操作系统自带的在Windows环境下运行的软件开发包(SDK)。程序员总是直接或间接引用API进行应用程序的开发,所以Win
3、dows应用程序就有大致相同的用户界面。说明SDK的全称是Software Development Kit,中文译为软件开发包。假如现在需要开发视频会议系统,在购买视频数据采集卡时,厂商就会提供频数据采集卡的SDK开发包,以方便对频数据采集卡的编程操作。这个开发包通常都会包含频数据采集卡的API函数库、帮助文档、使用手册和辅助工具等资源。也就是说,SDK实际上就是开发所需资源的一个集合。2.1.2 窗口与句柄窗口是Windows应用程序中一个非常重要的元素,它是Windows应用程序与用户进行交互的接口。一个Windows应用程序至少要有一个窗口,称为主窗口。通过窗口,可以接收用户的输入,并显
4、示输出。一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最小(大)化按钮、边框和滚动条等。窗口可以分为客户区和非客户区。客户区是窗口的一部分,应用程序通常在客户区中显示文字或者绘制图形。标题栏、菜单栏、系统菜单、最小(大)化按钮和边框统称为窗口的非客户区,它们由Windows系统来管理,而应用程序则主要管理客户区的外观及操作。在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。要对某个窗口进行操作,首先就要得到这个窗口的句柄。句柄(HANDLE)是Windows程序中一个重要的概念。在Windows程序中,有各种各样的资源(窗口、图标和光标等),系统在创建这些资源时会为它们
5、分配内存,并返回31励 志 照 亮 人 生 编 程 改 变 命 运第 3 章 Windows编程与MFC基础标识这些资源的标识号,即句柄。Windows中,常用句柄类型及其说明如表2.1所示。表2.1 常用句柄类型及其说明句柄说明句柄说明HWND窗口句柄HDC设备环境句柄HBITMAP位图句柄HCURSOR光标句柄HICON图标句柄HFONT字体句柄HMENU菜单句柄HPEN画笔句柄HFILE文件句柄HBRUSH画刷句柄HINSTANCE当前实例句柄HLOCAL局部内存对象句柄HGLOBAL全局内存对象句柄2.1.3 事件与消息Windows程序采用的是事件驱动方式的程序设计模式,其操作主要是
6、基于消息的。在应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小和移动等,对系统而言,这些都是事件。只要有事件发生,系统即产生特定的消息。消息描述了事件的类别,包含了相关信息,Windows应用程序利用消息与系统及其他应用程序进行信息交换。由于Windows事件的发生是随机的,程序的执行先后顺序也无法预测,系统采用消息队列来存放事件发生的消息,然后从消息队列中依次取出消息进行相应的处理,可表示为如图2.1所示。2.1.4 常用的Windows数据类型Windows应用程序中常用的数据类型如表2.2所示。表2.2 Windows应用程序常用的
7、数据类型数 据 类 型说明BYTE8位无符号字符PSTR32位字符指针COLORREF32位整数,表示一个颜色WORD16位无符号整数LONG32位有符号整数DWORD32位无符号整数,是WORD的两倍长度UINT32位无符号整数BOOL布尔值,值为TRUE或FALSEHANDLE句柄 图2.1 事件与消息处理事件键盘消息应用程序提取消息处理消息鼠标消息其他消息消息队列Windows系统32励 志 照 亮 人 生 编 程 改 变 命 运零基础学Visual C+(续)数 据 类 型说明LPSTR32位指针,指向字符LPCSTR32位指针,指向字符串常量LPTSTR32位指针,指向字符串,此字符
8、串可移植到Unicode和DBCS双字符集LPCTSTR32位指针,指向字符串常量,此串可移植到Unicode和DBCS双字符集LPVOID32位指针,可指向任何类型数据LPRESULT32位数值,作为窗口函数或CALLBACK函数的返回类型WNDPROC32位指针,指向一个窗口函数LPARAM32位数值,作为窗口函数和CALLBACK函数的参数WPARAM作为窗口函数和CALLBACK函数的参数,在win 16中是16位,在win 32中是32位2.2 Windows应用程序分析WinMain和WinProc函数构成了Windows应用程序的主体。WinMain函数负责建立窗口和建立消息循环
9、,WndProc函数负责消息的处理。典型的Windows窗口的创建与处理过程可表示为图2.2所示。图2.2 Windows窗口创建及处理过程2.2.1 WinMain函数传统的DOS程序以main函数作为进入程序的初始入口点,在Windows应用程序中,main函数被WinMain函数取代。当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数。WinMain函数是Windows程序的入口点函数,当WinMain函数结束或返回时,Windows应用程序结束。WinMain函数的原型如下:int WINAPI WinMain(HINSTANCE hThisInst,/应用
10、程序当前实例句柄HINSTANCe hPrevInst,/应用程序其他实例句柄LPSTR lpszCmdLine,/指向程序命令行参数的指针Int nCmdShow,/应用程序开始执行时窗口显示方式的整数值标识)程序开始执行程序打开窗口否是否应用程序处理消息是处理消息程序结束,关闭窗口检测发向窗口的消息WM_QUITWinMain()函数负责windows默认处理WndProc()函数负责 参数hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在Windows下运行时,它唯一标识运行中的实例。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通
11、过hInstance参数传递给WinMain函数。参数hPrevInstance表示当前实例的前一个实例的句柄。在Win32环境下,这个参数不再起作用,为NULL。参数lpCmdLine是一个字符串指针,指定传递给应用程序的命令行参数。参数nCmdShow指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。WinMain函数接收4个参数,这些参数都是在系统调用WinMain函数时,传递给应用程序的。2.2.2 创建窗口创建一个完整的窗口,需要经过下面4个操作步骤:定义窗口类、注册窗口类、创建窗口实例、显示及更新窗口。
12、1.定义窗口类在创建一个窗口前,必须对该类型的窗口进行设计,指定窗口的特征。窗口的特征是由WNDCLASS结构体来定义的。WNDCLASS结构体的定义如下:typedef struct tagWNDCLASS UINT style;/窗口风格WNDPROC lpfnWndProc;/指向窗口处理函数的函数指针int cbClsExtra;/窗口结构中的预留字节数int cbWndExtra;/为其他创建窗口预留字节数HINSTANCE hInstance;/注册该窗口类的实例句柄HICON hIcon;/代表该窗口类的图标句柄HCURSOR hCursor;/该窗口客户区鼠标光标句柄HBRUS
13、H hbrBackGround;/该窗口背景颜色句柄LPCSTR lpszMenuName;/指向窗口菜单名的字符指针LPCSTR lpszClassName;/指向窗口名的字符指针 WNDCLASS,*PWNDCLASS,NEAR*NPWNDCLASS,FAR*LPWNDCLASS;2.注册窗口类窗口类(WNDCLASS)设计完成后,需要调用RegisterClass()函数对其进行注册,注册成功后,才可以创建该类型的窗口。注册函数的原型声明如下:BOOL RegisterClass(CONST WNDCLASS*lpWndClass);该函数只有一个参数,即上一步骤中所设计的窗口类对象的指
14、针。3.创建窗口实例设计好窗口类并且将其成功注册之后,就可以用CreateWindow()函数产生这种类型的窗口了。函数Create Window()原型如下:HWND CreateWindow(LPCTSTR lpszClassName,/窗口类名33励 志 照 亮 人 生 编 程 改 变 命 运第 3 章 Windows编程与MFC基础LPCTSTR lpszTitle,/窗口标题名DWORD dwStyle,/创建窗口的样式int x,y,/窗口左上角坐标int nWidth,nHeight,/窗口宽度和度高HWND hwndParent,/该窗口的父窗口句柄HWENU hMenu,/窗
15、口主菜单句柄HINSTANCE hInstance,/创建窗口的应用程序当前句柄LPVOID lpParam,/指向一个传递给窗口的参数值的指针)注意区分WNDCLASS中的style成员与CreateWindow()函数的dwStyle参数,前者是指定窗口类的样式,基于该窗口类创建的窗口都具有这些样式,后者是指定某个具体的窗口的样式。4.显示及更新窗口窗口创建之后,就可以调用函数ShowWindow()来显示窗口,该函数的原型如下:BOOL ShowWindow(HWND hWnd,int nCmdShow);ShowWindow()函数有两个参数,第一个参数hWnd就是在上一步骤中成功创建
16、窗口后返回的那个窗口句柄;第二个参数nCmdShow指定了窗口显示的状态。在调用ShowWindow()函数之后,紧接着调用UpdateWindow()函数来刷新窗口。UpdateWindow()函数的原型如下:BOOL UpdateWindow(HWND hWnd);其参数hWnd指的是创建成功后的窗口的句柄。UpdateWindow()函数通过发送一个WM_PAINT消息来刷新窗口,UpdateWindow()函数将WM_PAINT消息直接发送给窗口过程函数进行处理,而没有放到消息队列里。到此,一个窗口就算创建完成了。2.2.3 消息循环在创建窗口、显示窗口和更新窗口后,就需要编写一个消息
17、循环,不断地从消息队列中取出消息,并进行响应。要从消息队列中取出消息,需要调用GetMessage()函数,其原型如下:GetMessage(lpMSG,/指向MSG结构的指针hwnd,/窗口句柄nMsgFilteMin,/用于消息过滤的最小消息号值nMsgFilterMax/用于消息过滤的最大消息号值)只要从消息队列中取出消息不为WM_QUIT,GetMessage()函数就返回一个非零值,否则程序就结束循环并退出。通常编写的消息循环代码如下:MSG Msg;while(GetMessage(&Msg,NULL,0,0)TranslateMessage(&Msg);/将消息的虚拟键转换为字符
18、信息DispatchMessage(&Msg);/将消息传送到指定窗口函数34励 志 照 亮 人 生 编 程 改 变 命 运零基础学Visual C+35励 志 照 亮 人 生 编 程 改 变 命 运第 3 章 Windows编程与MFC基础GetMessage()函数只有在接收到WM_QUIT消息时,才返回0。此时while语句判断的条件为假,循环退出,程序才有可能结束运行。在没有接收到WM_QUIT消息时,Windows应用程序就通过这个while循环来保证程序始终处于运行状态。TranslateMessage()函数用于将虚拟键消息转换为字符消息。DispatchMessage()函数分
19、派一个消息到指定窗口,由窗口函数WndProc()对消息进行处理。说明DispachMessage实际上是将消息回传给操作系统,由操作系统调用窗口函数对消息进行处理。Windows应用程序的消息处理机制可表示为图2.3所示。2.2.4 WinProc窗口函数在完成上述步骤后,剩下的工作就是编写一个窗口函数,用于处理发送给窗口的消息。WinProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活。窗口函数的一般形式如下:LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,WPAR
20、AM 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”工程
21、,在其中创建源文件,利用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成员保存的窗口函数的指针调
22、用窗口函数,处理消息 操作系统将接收到应用程序的窗口消息投递到其消息队列 应用程序调用DispatchMessage,将消息回传给操作系统操作系统窗口函数应用程序消息队列(3)在“Apidemo.cpp”文件中,编辑代码如下:#include/包含windows.h头文件LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);/窗口函数声明/*入口函数 WinMain()*/int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmd
23、Show)WNDCLASS wndclass;/定义窗口类结构变量HWND hwnd;/定义窗口句柄MSG msg;/定义消息结构变量/*定义窗口类的各属性*/wndclass.style=CS_HREDRAW|CS_VREDRAW;/改变窗口大小则重画wndclass.lpfnWndProc=WndProc;/窗口函数为WndProcwndclass.cbClsExtra=0;/窗口类无扩展wndclass.cbWndExtra=0;/窗口实例无扩展wndclass.hInstance=hInstance;/注册窗口类实例句柄wndclass.hIcon=LoadIcon(NULL,IDI_
24、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窗口创建,
25、/窗口类名 window窗口创建window窗口创建,/窗口名window窗口创建WS_OVERLAPPEDWINDOW,/重叠式窗口CW_USEDEFAULT,CW_USEDEFAULT,/左上角屏幕坐标默认值CW_USEDEFAULT,CW_USEDEFAULT,/窗口宽度和高度默认值NULL,/此窗口无父窗口NULL,/此窗口无主菜单hInstance,/创建此窗口的实例句柄NULL);/此窗口无创建参数/*显示并更新窗口*/ShowWindow(hwnd,nCmdShow);/显示窗口UpdateWindow(hwnd);/更新窗口的客户区/*消息循环*/while(GetMessag
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 _Windows 编程 MFC 基础
限制150内