Win32编程.docx

上传人:b****1 文档编号:10213316 上传时间:2023-05-24 格式:DOCX 页数:25 大小:69.51KB
下载 相关 举报
Win32编程.docx_第1页
第1页 / 共25页
Win32编程.docx_第2页
第2页 / 共25页
Win32编程.docx_第3页
第3页 / 共25页
Win32编程.docx_第4页
第4页 / 共25页
Win32编程.docx_第5页
第5页 / 共25页
Win32编程.docx_第6页
第6页 / 共25页
Win32编程.docx_第7页
第7页 / 共25页
Win32编程.docx_第8页
第8页 / 共25页
Win32编程.docx_第9页
第9页 / 共25页
Win32编程.docx_第10页
第10页 / 共25页
Win32编程.docx_第11页
第11页 / 共25页
Win32编程.docx_第12页
第12页 / 共25页
Win32编程.docx_第13页
第13页 / 共25页
Win32编程.docx_第14页
第14页 / 共25页
Win32编程.docx_第15页
第15页 / 共25页
Win32编程.docx_第16页
第16页 / 共25页
Win32编程.docx_第17页
第17页 / 共25页
Win32编程.docx_第18页
第18页 / 共25页
Win32编程.docx_第19页
第19页 / 共25页
Win32编程.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Win32编程.docx

《Win32编程.docx》由会员分享,可在线阅读,更多相关《Win32编程.docx(25页珍藏版)》请在冰点文库上搜索。

Win32编程.docx

Win32编程

 

Win32编程

此资料为ITjob软件开发教程网提供,特此分享,互相学习!

C/C++/VC/MFC技术交流群:

95453496

一、Win32编程基本概念

1、消息驱动

在介绍Windows消息驱动概念之前,我们首先来回顾面向过程的程序结构:

main()程序有明显的开始、中间过程和结束点,程序是围绕这个过程编写好相关的子过程,再把这些子过程串联在一起。

程序编好以后,该过程也就确定了,程序必须按照规定好的顺序执行:

是否需要用户的输入、输入什么、程序取得用户输入以后做什么处理,处理完毕将结果显示给用户。

该过程一旦确定,程序的执行过程也是固定的,用户不能干预。

而Windows编程所采用设计思想是:

消息驱动,又叫做事件驱动。

在这种程序结构中,程序没有明显的开始、结束,程序流程的控制由各种随机发生、不确定、没有预先设定顺序的事件的发生来触发。

是一个不断产生消息和处理消息的过程。

也就是说程序一运行开始处于等待消息状态,取得消息以后,就对该消息做出相应的处理,完成处理以后又进入等待消息的状态。

这种程序结构与Windows操作系统结合非常紧密,最明显一点就是消息的管理是由操作系统完成的。

应用程序从操作系统获得消息有两种方式:

一种就是应用程序调用Windows提供的消息获取函数;另外一种就是回调函数,由操作系统自己调用。

这种消息驱动机制,有点像银行的柜台业务:

早上八点,银行开门(Windows应用程序开始运行),每个营业员(Windwows线程)回到自己的柜台开始办公。

如果有顾客来办理相关业务(相当于Windows消息),那么对应的业务员就进行处理。

顾客来办理业务的时间以及业务类型都是随机的,如果某一时刻没有顾客办理业务并且没有到下班时间(Windows应用程序退出)的话,那么相关的业务员进入等待状态。

所有的业务员不断重复该过程,直到下班(Windows应用程序退出)。

2、应用程序、操作系统、IO设备之间的相互关系

3、窗口元素

窗口:

是Windows操作系统最重要最基本的一个概念。

它是一个正在运行的应用程序相对应的矩形区域,通过它用户可以和应用程序进行交互。

客户区:

是窗口中最大的一块空白的矩形区域,是用户和系统进行交互的主要区域,一般用于显示应用程序的输出。

标题栏:

位于窗口顶部,用于显示应用程序名称的。

菜单栏:

位于标题栏下方,菜单栏列出了应用程序支持的大部分功能。

图标:

适用于提醒用户的一个小图像,代表一个应用程序。

光标:

Windows光标显示在屏幕上的一个小位图。

工具栏:

一般位于菜单栏下方,上面有一些位图按钮,代表一些常用功能。

状态栏:

位于这个窗口底端,用于输出菜单提示信息和一些其他详细信息。

对话框:

一种特殊的窗口,用于接受用户的输入输出。

控件:

对话框上的许多小窗口都是控件。

如按钮,编辑框等都是控件。

4、编程术语

窗口:

是应用程序操作的基本单元,是用户可以通过它和应用程序进行交互的接口环境,也是系统管理应用程序的基本单位。

从程序运行的内存组织结构看,窗口对应一个数据结构WNDCLASS。

实例:

实际上实例就是一个可执行程序在内存中的拷贝。

一个可执行程序运行多次,在内存中就有多个内存拷贝。

系统是通过实例句柄来识别一个可执行程序的拷贝。

句柄:

系统用来识别不同对象或者同类对象的不同实例的"编号"。

它是一个无符号整数。

几乎所有对对象的引用都是通过句柄来进行的。

如使用HINSTANCE、HWND、HCURSOR、HICON、HDC、HBRUSH、HPEN等。

资源:

构成应用程序的元素称为资源:

菜单、工具条、位图、字符串等。

窗口函数:

用户通过窗口和应用程序交互时产生的消息,送给一个函数进行处理。

该函数体结构大致由一个Switch结构组成,是消息驱动机制的发动机。

图形设备接口:

GDI(GraphicDeviceInterface)是Windows系统的重要组成部分。

负责系统和用户或者绘图程序之间的信息交换,并控制输出设备上图形和文字的输出。

最大的优点就是设备无关性:

将程序员和设备相隔离,程序员不必关心物理设备的细节,直接调用相关的API函数就可以在输出设备上显示图形或者文字。

回调函数:

写好了等系统进行调用的函数。

只能由系统自动调用。

前面所说的窗口函数就是一个典型的回调函数。

二、第一个Win32程序

Win32程序的入口为WinMain`函数,是由操作系统调用的。

和main()函数不同,WinMain有严格的原型定义,不能改变。

其原型如下:

intWINAPIWinMain(

HINSTANCEhInstance,//当前实例句柄

HINSTANCEhPrevInstance,//前一个实例句柄

LPSTRlpCmdLine,//命令行参数

intnCmdShow//窗口显示方式,如SW_SHOWNORMAL等

);

这里我们看到了一些不认识的大写字符,在此后的学习中,我们还会大量遇到这种情况。

稍后我们会专门讲解。

Windows编程和DOS编程最大的不同之一就在于DOS是字符界面的,而Windows是图形界面的,因此Win32编程第一个重要的工作就是创建窗口。

创建一个Win32程序的典型步骤如下:

●注册窗口类:

RegisterClass()。

定义窗口类,以指明窗口的外观和窗口回调函数等

●创建窗口:

CreateWindow()。

创建一个窗口实例

●显示窗口:

ShowWindow()。

显示刚刚创建的窗口

●更新窗口:

UpdateWindow()。

更新窗口

●消息循环:

while(GetMessage(&msg,NULL,0,0))。

进行消息循环,不断的处理消息。

●实现回调函数:

由系统调用,程序员负责代码实现,告诉系统如何响应消息。

例1、创建一个简单的Win32应用程序MyWin

打开VS6.0,选择File菜单的New,在出现的对话框中,选择Projects栏目(新建工程),并点取其下的Win32Application项,表示使用Win32环境创建应用程序。

先在Locatin(路径)中选择要保存项目文件的路径,然后在ProjectName(项目名称)中填入"MyWin",其它按照缺省设置)。

单击OK按钮。

代码如下:

#include

#include

//声明窗口回调函数

LRESULTCALLBACKWinProc(

HWNDhwnd,//窗口句柄

UINTuMsg,//消息ID

WPARAMwParam,//第1个消息参数

LPARAMlParam//第2个消息参数

);

//程序入口

intWINAPIWinMain(

HINSTANCEhInstance,//当前实例句柄

HINSTANCEhPrevInstance,//前一实例句柄

LPSTRlpCmdLine,//命令行参数

intnCmdShow//窗口显示方式

{

//1.注册窗口

WNDCLASSwndcls;//定义并填充窗口类

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.hInstance=hInstance;

wndcls.lpfnWndProc=WinProc;//重点:

指定回调函数

wndcls.lpszClassName="Itjob2010";

wndcls.lpszMenuName=NULL;

wndcls.style=CS_HREDRAW|CS_VREDRAW;

RegisterClass(&wndcls);//注册窗口

//2.创建窗口

HWNDhwnd;

hwnd=CreateWindow(

wndcls.lpszClassName,//窗口类名称

"一个简单的Win32程序",//窗口标题

WS_OVERLAPPEDWINDOW,//窗口风格,定义为普通型

0,//窗口位置的x坐标

0,//窗口位置的y坐标

600,//窗口的宽度

400,//窗口的高度

NULL,//父窗口句柄

NULL,//菜单句柄

hInstance,//应用程序实例句柄

NULL);//窗口创建数据指针

//3.显示窗口

ShowWindow(hwnd,SW_SHOWNORMAL);

//4.更新窗口

UpdateWindow(hwnd);

//5.消息循环

MSGmsg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);//把虚键消息翻译成字符消息(WM_CHAR),

//再把它放回到应用程序的消息队列中去

DispatchMessage(&msg);//指示操作系统把这条消息发送到窗口

//过程WinProc进行处理

}

return0;

}

//窗口回调函数,由操作系统调用,程序员

//不要调用,但程序员需要编写其实现代码

LRESULTCALLBACKWinProc(

HWNDhwnd,//窗口句柄

UINTuMsg,//消息ID

WPARAMwParam,//第1个消息参数

LPARAMlParam//第2个消息参数

{

switch(uMsg)

{

caseWM_CHAR:

sprintf(szChar,"你按下了%c键",(char)wParam);

MessageBox(hwnd,szChar,"WM_CHAR",0);

break;

caseWM_LBUTTONDOWN:

HDChdc;

hdc=GetDC(hwnd);

TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));

ReleaseDC(hwnd,hdc);

break;

caseWM_PAINT:

HDChDC;

PAINTSTRUCTps;

hDC=BeginPaint(hwnd,&ps);

TextOut(hDC,0,0,"Hello,World!

",strlen("Hello,World!

"));

EndPaint(hwnd,&ps);

break;

caseWM_DESTROY:

PostQuitMessage(0);

break;

default:

returnDefWindowProc(hwnd,uMsg,wParam,lParam);

}

return0;

}

编译,运行该程序。

运行结果为出现一个简单的Windows窗口。

在窗口空白区点击鼠标左键,会在屏幕上出现:

计算机编程语言培训;按下a键,会提示:

你按下了a键!

这是一个最简单的Win32应用程序,其他较复杂的Windows应用程序都是在这样的程序框架上扩展得到的。

下面对上述程序进行解释说明。

●WinMain()函数

WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点。

它与DOS程序的main()函数起同样的作用,有一点不同的是,WinMain()函数必须带有四个参数,它们是系统传递给它的。

WinMain()函数的原型如下:

intWINAPIWinMain(

HINSTANCEhInstance,//当前实例句柄

HINSTANCEhPrevInstance,//前一个实例句柄

LPSTRlpCmdLine,//命令行参数

intnCmdShow//窗口显示方式,如SW_SHOWNORMAL等

);

参数说明如下:

hInstance:

是标识该应用程序当前的实例的句柄。

它是HINSTANCE类型,HINSTANCE是HandleofInstance的缩写,表示实例的句柄。

hInstance是一个很关键的数据,它唯一的代表该应用程序,在后面初始化程序主窗口的过程中需要用到这个参数。

这里有两个概念,一个是实例,一个是句柄。

实例代表的是应用程序执行的整个过程和方法,一个应用程序如果没有被执行,只是存在于磁盘上,那么就说它是没有被实例化的;只要一执行,则说该程序的一个实例在运行。

句柄,顾名思义,指的是一个对象的把柄。

在Windows中,有各种各样的句柄,它们都是32位的指针变量,用来指向该对象所占据的内存区。

句柄的使用,可以极大的方便Windows管理其内存中的各种对象。

hPrevInstance:

它是用来标识该应用程序的前一个实例句柄。

对于基于Win32的应用程序来说,这个参数总是NULL。

这是因为在Win95操作系统中,应用程序的每个实例都有各自独立的地址空间,即使同一个应用程序被执行了两次,在内存中也会为它们的每一个实例分配新的内存空间,所以一个应用程序被执行后,不会有前一个实例存在的可能。

也就是说,hPrevInstance这个参数是完全没有必要的,只是为了提供与16位Windows的应用程序形式上的兼容性,才保留了这个参数。

在以前的16位Windows环境下(如Windows3.2),hPrevInstance用来标识与hInstance相关的应用程序的前一个句柄。

lpCmdLine:

是指向应用程序命令行参数字符串的指针。

如在"开始"菜单中单击"运行",输入"WinMain.exehello",则此参数指向的字符串为"hello"。

nCmdShow:

是一个用来指定窗口显示方式的整数。

这个整数值可以是SW_SHOW、SW_HIDE、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED等

●注册窗口类

注册窗口类主要是对一个窗口类结构WNDCLASS的实例进行填充,然后调用RegisterClass()进行注册。

每个窗口都有一些基本的属性,如窗口边框、窗口标题文字、窗口大小和位置、鼠标、背景色、处理窗口消息的回调函数的名称等等。

注册的过程也就是将这些属性告诉系统,然后再调用CreateWindow()函数创建出窗口。

typedefstruct_WNDCLASS{

UINTstyle;//窗口风格,通常取值CS_HREDRAW|CS_VREDRAW

WNDPROClpfnWndProc;//指定处理窗口消息的回调函数的远指针

intcbClsExtra;//指定分配给窗口类结构之后的额外字节数,0

intcbWndExtra;//指定分配给窗口实例之后的额外字节数,0

HANDLEhInstance;//指定窗口过程所对应的实例句柄

HICONhIcon;//指定窗口的图标,LoadIcon

HCURSORhCursor;//指定窗口的鼠标,LoadCursor

HBRUSHhbrBackground;//指定窗口的背景画刷,CreateSolidBrush

LPCTSTRlpszMenuName;//窗口的菜单资源名称

LPCTSTRlpszClassName;//该窗口类的名称

}WNDCLASS;

在这里提一下匈牙利表示法:

其中的lpfn字首代表“指向函数的长指针”。

cb字首代表“字节数”而且通常作为一个常数来表示一个字节的大小。

h字首是一个句柄,而hbr字首代表“一个画刷的句柄”。

lpsz字首代表“指向以0结尾字符串的指针”。

参数含义如下:

style:

一般取值CS_VREDRAW|CS_HREDRAW,表示当窗口的水平方向或垂直方向的大小改变之后,窗口要全部重画。

style窗口类型定义如下:

#defineCS_VREDRAW0x0001

#defineCS_HREDRAW0x0002

#defineCS_KEYCVTWINDOW0x0004

#defineCS_DBLCLKS0x0008

#defineCS_OWNDC0x0020

由于每个识别字都可以在一个复合值中设置一个位的值,所以按这种方式定义的识别字通常称为“位标识”。

lpfnWndProc:

设定这个窗口类的窗口消息处理程序,即设定消息过程处理函数。

该函数将处理根据这个窗口类所建立的所有窗口的全部消息。

在C语言中,像这样在结构中使用函数名时,真正提供的是指向函数的指针。

cbClsExtra:

指定分配给窗口类结构之后的额外字节数,一般设为0

cbWndExtra:

指定分配给窗口实例之后的额外字节数,一般设为0

hInstance:

程序的执行实体句柄(它也是WinMain的参数之一)

hIcon:

LoadIcon(NULL,IDI_APPLICATION);为窗口设置一个图标。

图标是一个小的点阵图图像,它对使用者代表程序,将出现在Windows工作列中和窗口的标题列的左端。

在本书的后面,您将学习如何为您的Windows程序自定义图标。

现在,为了方便起见,我们将使用预先定义的图标。

要取得预先定义图标的句柄,可以将第一个参数设定为NULL来调用LoadIcon。

在载入程序写作者自定义的图标时(图标应该存放在磁片上的.EXE程序文件中),这个参数应该被设定为程序的执行实体句柄hInstance。

第二个参数代表图标。

对于预先定义图标,此参数是以IDI开始的识别字(「ID代表图标」),识别字在WINUSER.H中定义。

IDI_APPLICATION图标是一个简单的窗口小图形。

LoadIcon函数传回该图标的句柄。

我们并不关心这个句柄的实际值,它只用于设置hIcon栏位的值。

该栏位在WNDCLASS结构中定义为HICON型态,此型态名的含义为「handletoanicon(图标句柄)」。

hCursor:

LoadCursor(NULL,IDC_ARROW);与hIcon非常相似。

LoadCursor函数载入一个预先定义的鼠标游标(命名为IDC_ARROW),并传回该游标的句柄。

该句柄被设定给WNDCLASS结构的hCursor栏位。

当鼠标游标在依据这个类别建立的窗口的显示区域上出现时,它变成一个小箭头。

hbrBackground:

指定窗口背景颜色。

hbrBackground栏位名称中的hbr字首代表「handletoabrush(画刷句柄)」。

画刷是个绘图词汇,指用来填充一个区域的着色样式。

Windows有几个标准画刷,也称为「备用(stock)」画刷。

这里所示的GetStockObject调用将传回一个白色画刷的句柄:

GetStockObject(WHITE_BRUSH);这意味著窗口显示区域的背景完全为白色,这是一种极其普遍的做法。

lpszMenuName:

指定菜单。

这里没有菜单,可以设定为NULL。

lpszClassName:

给出一个类别名称。

对于小程序,类别名称可以与程序名相同。

对WNDCLASS填充完毕后,调用RegisterClass函数进行窗口注册。

函数原型如下:

ATOMRegisterClass(CONSTWNDCLASS*lpWndClass);

该函数如调用成功,则返回一个非0值,表明系统中已经注册了一个名为lpszClassName的窗口类。

如果失败,则返回0。

●创建窗口

当窗口类注册完毕之后,并不会有窗口显示出来,因为注册的过程仅仅是为创建窗口所做的准备工作。

实际创建一个窗口的是通过调用CreateWindow()函数完成的。

窗口类中已经预先定义了窗口的一般属性,而CreateWindow()中的参数可以进一步指定一个窗口的更具体的属性,CreateWindow()的函数函数原型为:

HWNDCreateWindow(

LPCTSTRlpClassName,//窗口类名称

LPCTSTRlpWindowName,//窗口标题

DWORDdwStyle,//窗口风格,定义为普通型

intx,//窗口位置的x坐标

inty,//窗口位置的y坐标

intnWidth,//窗口的宽度

intnHeight,//窗口的高度

HWNDhWndParent,//父窗口句柄

HMENUhMenu,//菜单句柄

HANDLEhInstance,//应用程序实例句柄

LPVOIDlpParam//窗口创建数据指针,一般为NULL

);

部分参数的含义如下:

lpszClassName:

创建该窗口所使用的窗口类的名称,该名称应与前面所注册的窗口类的名称一致。

lpWindowName:

窗口标题栏的文字。

dwStyle:

窗口的风格,下面列出了常用的窗口风格:

WS_OVERLAPPEDWINDOW:

创建一个层叠式窗口,有边框、标题栏、系统菜单、最大化和最小化按钮,本质是以下几种风格的与或:

WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX

WS_POPUPWINDOW:

创建一个弹出式窗口,是以下几种风格的与或:

WS_BORDER,WS_POPUP,WS_SYSMENU。

WS_OVERLAPPED:

创建一个层叠式窗口,它有标题栏和边框,同WS_TILED

WS_POPUP:

该窗口为弹出式窗口,不能与WS_CHILD同时使用

WS_BORDER:

窗口有单线边框

WS_CAPTION:

窗口有标题栏

WS_CHILD:

该窗口为子窗口,不能与WS_POPUP同时使用

WS_DISABLED:

该窗口为无效,即对用户操作不产生任何反应

WS_VISIBLE:

窗口为可见

WS_HSCROLL:

窗口有水平滚动条

WS_VSCROLL:

窗口有垂直滚动条

WS_MAXIMIZE:

窗口初始化为最大化

WS_MINIMIZE:

窗口初始化为最小化

WS_MAXIMIZEBOX:

窗口有最大化按钮

WS_MINIMIZEBOX:

窗口有最小化按钮

WS_SIZEBOX:

边框可进行大小控制的窗口

WS_SYSMENU:

创建一个有系统菜单的窗口,必须与WS_CAPTION风格同时使用

WS_THICKFRAME:

创建一个大小可控制的窗口,与WS_SIZEBOX风格一样.

WS_TILED:

创建一个层叠式窗口,有标题栏

如果窗口创建成功,返回值是新窗口的句柄,否则返回NULL。

特别注意:

CreateWindow函数在返回之前,会发送一条WM_CREATE消息到窗口的消息队列,对于Overlapped、Pop-up和Child窗口,CreateWindow函数还会发送WM_GETMINMAXI

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2