Win32编程(1).doc
《Win32编程(1).doc》由会员分享,可在线阅读,更多相关《Win32编程(1).doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Win32编程C/C+/VC/MFC技术交流群:95453496一、Win32编程基本概念1、消息驱动在介绍Windows消息驱动概念之前,我们首先来回顾面向过程的程序结构:main()程序有明显的开始、中间过程和结束点,程序是围绕这个过程编写好相关的子过程,再把这些子过程串联在一起。程序编好以后,该过程也就确定了,程序必须按照规定好的顺序执行:是否需要用户的输入、输入什么、程序取得用户输入以后做什么处理,处理完毕将结果显示给用户。该过程一旦确定,程序的执行过程也是固定的,用户不能干预。而Windows编程所采用设计思想是:消息驱动,又叫做事件驱动。在这种程序结构中,程序没有明显的开始、结束,
2、程序流程的控制由各种随机发生、不确定、没有预先设定顺序的事件的发生来触发。是一个不断产生消息和处理消息的过程。也就是说程序一运行开始处于等待消息状态,取得消息以后,就对该消息做出相应的处理,完成处理以后又进入等待消息的状态。这种程序结构与Windows操作系统结合非常紧密,最明显一点就是消息的管理是由操作系统完成的。应用程序从操作系统获得消息有两种方式:一种就是应用程序调用Windows提供的消息获取函数;另外一种就是回调函数,由操作系统自己调用。这种消息驱动机制,有点像银行的柜台业务:早上八点,银行开门(Windows应用程序开始运行),每个营业员(Windwows线程)回到自己的柜台开始办
3、公。如果有顾客来办理相关业务(相当于Windows消息),那么对应的业务员就进行处理。顾客来办理业务的时间以及业务类型都是随机的,如果某一时刻没有顾客办理业务并且没有到下班时间(Windows应用程序退出)的话,那么相关的业务员进入等待状态。所有的业务员不断重复该过程,直到下班(Windows应用程序退出)。2、应用程序、操作系统、IO设备之间的相互关系3、窗口元素窗口:是Windows操作系统最重要最基本的一个概念。它是一个正在运行的应用程序相对应的矩形区域,通过它用户可以和应用程序进行交互。客户区:是窗口中最大的一块空白的矩形区域,是用户和系统进行交互的主要区域,一般用于显示应用程序的输出
4、。标题栏:位于窗口顶部,用于显示应用程序名称的。菜单栏:位于标题栏下方,菜单栏列出了应用程序支持的大部分功能。图标: 适用于提醒用户的一个小图像,代表一个应用程序。光标:Windows光标显示在屏幕上的一个小位图。工具栏:一般位于菜单栏下方,上面有一些位图按钮,代表一些常用功能。状态栏:位于这个窗口底端,用于输出菜单提示信息和一些其他详细信息。对话框:一种特殊的窗口,用于接受用户的输入输出。控件:对话框上的许多小窗口都是控件。如按钮,编辑框等都是控件。4、编程术语窗口:是应用程序操作的基本单元,是用户可以通过它和应用程序进行交互的接口环境,也是系统管理应用程序的基本单位。从程序运行的内存组织结
5、构看,窗口对应一个数据结构WNDCLASS。实例:实际上实例就是一个可执行程序在内存中的拷贝。一个可执行程序运行多次,在内存中就有多个内存拷贝。系统是通过实例句柄来识别一个可执行程序的拷贝。句柄:系统用来识别不同对象或者同类对象的不同实例的编号。它是一个无符号整数。几乎所有对对象的引用都是通过句柄来进行的。如使用HINSTANCE、HWND、HCURSOR、HICON、HDC、HBRUSH、HPEN等。资源:构成应用程序的元素称为资源:菜单、工具条、位图、字符串等。窗口函数:用户通过窗口和应用程序交互时产生的消息,送给一个函数进行处理。该函数体结构大致由一个Switch结构组成,是消息驱动机制
6、的发动机。图形设备接口:GDI(Graphic Device Interface)是Windows系统的重要组成部分。负责系统和用户或者绘图程序之间的信息交换,并控制输出设备上图形和文字的输出。最大的优点就是设备无关性:将程序员和设备相隔离,程序员不必关心物理设备的细节,直接调用相关的API函数就可以在输出设备上显示图形或者文字。回调函数:写好了等系统进行调用的函数。只能由系统自动调用。前面所说的窗口函数就是一个典型的回调函数。二、第一个Win32程序Win32程序的入口为WinMain函数,是由操作系统调用的。和main()函数不同,WinMain有严格的原型定义,不能改变。其原型如下:in
7、t WINAPI WinMain(HINSTANCEhInstance,/当前实例句柄HINSTANCEhPrevInstance,/前一个实例句柄LPSTRlpCmdLine,/命令行参数intnCmdShow/窗口显示方式,如SW_ SHOWNORMAL等);这里我们看到了一些不认识的大写字符,在此后的学习中,我们还会大量遇到这种情况。稍后我们会专门讲解。Windows编程和DOS编程最大的不同之一就在于DOS是字符界面的,而Windows是图形界面的,因此Win32编程第一个重要的工作就是创建窗口。创建一个Win32程序的典型步骤如下:l 注册窗口类:RegisterClass()。定义
8、窗口类,以指明窗口的外观和窗口回调函数等l 创建窗口:CreateWindow()。创建一个窗口实例l 显示窗口:ShowWindow()。显示刚刚创建的窗口l 更新窗口:UpdateWindow()。更新窗口l 消息循环:while (GetMessage(&msg, NULL, 0, 0)。进行消息循环,不断的处理消息。l 实现回调函数:由系统调用,程序员负责代码实现,告诉系统如何响应消息。例1、 创建一个简单的Win32应用程序MyWin打开VS6.0,选择File菜单的New,在出现的对话框中,选择Projects栏目(新建工程),并点取其下的Win32 Application项,表示
9、使用Win32环境创建应用程序。先在Locatin(路径)中选择要保存项目文件的路径,然后在Project Name(项目名称)中填入MyWin,其它按照缺省设置)。单击OK按钮。代码如下:#include #include /声明窗口回调函数LRESULT CALLBACK WinProc(HWND hwnd,/ 窗口句柄UINT uMsg,/ 消息IDWPARAM wParam,/ 第1个消息参数LPARAM lParam/ 第2个消息参数);/程序入口int WINAPI WinMain( HINSTANCE hInstance,/ 当前实例句柄 HINSTANCE hPrevInsta
10、nce,/ 前一实例句柄 LPSTR lpCmdLine,/ 命令行参数 int nCmdShow/ 窗口显示方式)/1. 注册窗口WNDCLASS wndcls;/定义并填充窗口类wndcls.cbClsExtra = 0;wndcls.cbWndExtra = 0;wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndcls.hCursor = LoadCursor(NULL, IDC_ARROW);wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndcls.hInstan
11、ce = hInstance;wndcls.lpfnWndProc = WinProc;/重点:指定回调函数wndcls.lpszClassName = Itjob2010;wndcls.lpszMenuName = NULL;wndcls.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wndcls);/注册窗口/2. 创建窗口HWND hwnd;hwnd = CreateWindow(wndcls.lpszClassName,/窗口类名称一个简单的Win32程序,/窗口标题WS_OVERLAPPEDWINDOW,/窗口风格,定义为普通型0,/窗
12、口位置的x坐标0,/窗口位置的y坐标600,/窗口的宽度400,/窗口的高度NULL,/父窗口句柄NULL,/菜单句柄hInstance,/应用程序实例句柄NULL);/窗口创建数据指针/3. 显示窗口ShowWindow(hwnd, SW_SHOWNORMAL);/4. 更新窗口UpdateWindow(hwnd);/5. 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);/把虚键消息翻译成字符消息(WM_CHAR),/再把它放回到应用程序的消息队列中去DispatchMessage(&msg);/指示
13、操作系统把这条消息发送到窗口/过程WinProc进行处理return 0;/窗口回调函数,由操作系统调用,程序员/不要调用,但程序员需要编写其实现代码LRESULT CALLBACK WinProc(HWND hwnd,/ 窗口句柄UINT uMsg,/ 消息IDWPARAM wParam,/ 第1个消息参数LPARAM lParam/ 第2个消息参数)switch (uMsg)case WM_CHAR:sprintf(szChar, 你按下了%c键, (char)wParam);MessageBox(hwnd, szChar, WM_CHAR, 0);break;case WM_LBUTTO
14、NDOWN:HDC hdc;hdc = GetDC(hwnd);TextOut(hdc, 0, 50, 计算机编程语言培训, strlen(计算机编程语言培训);ReleaseDC(hwnd, hdc);break;case WM_PAINT:HDC hDC;PAINTSTRUCT ps;hDC = BeginPaint(hwnd, &ps);TextOut(hDC, 0, 0, Hello, World!, strlen(Hello, World!);EndPaint(hwnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;defa
15、ult:return DefWindowProc(hwnd, uMsg, wParam, lParam);return 0;编译,运行该程序。运行结果为出现一个简单的Windows窗口。在窗口空白区点击鼠标左键,会在屏幕上出现:计算机编程语言培训;按下a键,会提示:你按下了a键!这是一个最简单的Win32应用程序,其他较复杂的Windows应用程序都是在这样的程序框架上扩展得到的。下面对上述程序进行解释说明。l WinMain()函数WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点。它与DOS程序的main()函数起同样的作用,有一点不同的是,WinM
16、ain()函数必须带有四个参数,它们是系统传递给它的。WinMain()函数的原型如下:int WINAPI WinMain(HINSTANCEhInstance,/当前实例句柄HINSTANCEhPrevInstance,/前一个实例句柄LPSTRlpCmdLine,/命令行参数intnCmdShow/窗口显示方式,如SW_ SHOWNORMAL等);参数说明如下:hInstance:是标识该应用程序当前的实例的句柄。它是HINSTANCE类型,HINSTANCE是Handle of Instance的缩写,表示实例的句柄。hInstance是一个很关键的数据,它唯一的代表该应用程序,在后面
17、初始化程序主窗口的过程中需要用到这个 参数。这里有两个概念,一个是实例,一个是句柄。实例代表的是应用程序执行的整个过程和方法,一个应用程序如果没有被执行,只是存在于磁盘上,那么就说它是没有被实例化的;只要一执行,则说该程序的一个实例在运行。句柄,顾名思义,指的是一个对象的把柄。在Windows中,有各种各样的句柄,它们都是32位的指针变量,用来指向该对象所占据的内存区。句柄的使用,可以极大的方便Windows管理其内存中的各种对象。 hPrevInstance:它是用来标识该应用程序的前一个实例句柄。对于基于Win32的应用程序来说,这个参数总是NULL。这是因为在Win95操作系统中, 应用
18、程序的每个实例都有各自独立的地址空间,即使同一个应用程序被执行了两次,在内存中也会为它们的每一个实例分配新的内存空间,所以一个应用程序被执行后,不会有前一个实例存在的可能。也就是说,hPrevInstance这个参数是完全没有必要的,只是为了提供与16位Windows的应用程序形式上 的兼容性,才保留了这个参数。在以前的16位Windows环境下(如Windows3.2),hPrevInstance用来标识与hInstance 相关的应用程序的前一个句柄。lpCmdLine:是指向应用程序命令行参数字符串的指针。如在开始菜单中单击运行,输入WinMain.exe hello,则此参数指向的字符
19、串为hello。nCmdShow:是一个用来指定窗口显示方式的整数。这个整数值可以是SW_SHOW、SW_HIDE、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED等l 注册窗口类注册窗口类主要是对一个窗口类结构WNDCLASS的实例进行填充,然后调用RegisterClass()进行注册。每个窗口都有一些基本的属性,如窗口边框、窗口标题文字、窗口大小和位置、鼠标、背景色、处理窗口消息的回调函数的名称等等。注册的过程也就是将这些属性告诉系统,然后再调用CreateWindow()函数创建出窗口。typedef struct _WNDCLASS UINTstyle; /窗口风格
20、,通常取值CS_HREDRAW|CS_VREDRAWWNDPROClpfnWndProc; /指定处理窗口消息的回调函数的远指针intcbClsExtra; /指定分配给窗口类结构之后的额外字节数,0intcbWndExtra; /指定分配给窗口实例之后的额外字节数,0HANDLEhInstance; /指定窗口过程所对应的实例句柄HICONhIcon; /指定窗口的图标,LoadIconHCURSORhCursor; /指定窗口的鼠标,LoadCursorHBRUSHhbrBackground; /指定窗口的背景画刷,CreateSolidBrushLPCTSTRlpszMenuName;
21、/窗口的菜单资源名称LPCTSTRlpszClassName; /该窗口类的名称 WNDCLASS;在这里提一下匈牙利表示法:其中的lpfn字首代表“指向函数的长指针”。cb字首代表“字节数”而且通常作为一个常数来表示一个字节的大小。h字首是一个句柄,而hbr字首代表“一个画刷的句柄”。lpsz字首代表“指向以0结尾字符串的指针”。参数含义如下:style:一般取值CS_VREDRAW|CS_HREDRAW,表示当窗口的水平方向或垂直方向的大小改变之后,窗口要全部重画。style窗口类型定义如下:#define CS_VREDRAW 0x0001#define CS_HREDRAW 0x000
22、2#define CS_KEYCVTWINDOW 0x0004#define CS_DBLCLKS 0x0008#define CS_OWNDC 0x0020由于每个识别字都可以在一个复合值中设置一个位的值,所以按这种方式定义的识别字通常称为“位标识”。lpfnWndProc:设定这个窗口类的窗口消息处理程序,即设定消息过程处理函数。该函数将处理根据这个窗口类所建立的所有窗口的全部消息。在C语言中,像这样在结构中使用函数名时,真正提供的是指向函数的指针。cbClsExtra:指定分配给窗口类结构之后的额外字节数,一般设为0cbWndExtra:指定分配给窗口实例之后的额外字节数,一般设为0hI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Win32 编程
限制150内