1 win32思想Word文件下载.docx

上传人:b****7 文档编号:22744743 上传时间:2023-02-05 格式:DOCX 页数:23 大小:27.13KB
下载 相关 举报
1 win32思想Word文件下载.docx_第1页
第1页 / 共23页
1 win32思想Word文件下载.docx_第2页
第2页 / 共23页
1 win32思想Word文件下载.docx_第3页
第3页 / 共23页
1 win32思想Word文件下载.docx_第4页
第4页 / 共23页
1 win32思想Word文件下载.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

1 win32思想Word文件下载.docx

《1 win32思想Word文件下载.docx》由会员分享,可在线阅读,更多相关《1 win32思想Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。

1 win32思想Word文件下载.docx

图标:

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

光标:

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

工具栏:

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

状态栏:

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

对话框:

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

控件:

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

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

⏹Windows应用程序设计相关基本术语

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

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

实例:

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

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

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

句柄:

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

编号"

它是一个无符号整数。

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

如使用HWND、HCURSOR、HDC。

资源:

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

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

窗口函数:

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

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

图形设备接口:

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

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

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

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

回调函数:

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

只能由系统自动调用。

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

//********************************************************************************

//工程:

Mywin

//文件:

Mywin.cpp

//内容:

一个简单的Win32程序

//***********************************************************************

#include<

windows.h>

windowsx.h>

//函数声明

BOOLInitMyWindow(HINSTANCEhInstance,intnCmdShow);

LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);

//**********************************************************************

//函数:

WinMain()

//功能:

Win32应用程序入口函数。

创建主窗口,处理消息循环

//**************************************************************************

intPASCALWinMain(HINSTANCEhInstance,//当前实例句柄

HINSTANCEhPrevInstance,//前一个实例句柄

LPSTRlpCmdLine,//命令行字符(参数)

intnCmdShow)//窗口显示方式

{

MSGmsg;

//创建主窗口

if(!

InitMyWindow(hInstance,nCmdShow))

returnFALSE;

//进入消息循环:

//从该应用程序的消息队列中检取消息,送到消息处理过程,

//当检取到WM_QUIT消息时,退出消息循环。

while(GetMessage(&

msg,NULL,0,0))

{

TranslateMessage(&

msg);

DispatchMessage(&

}

//程序结束

returnmsg.wParam;

}

//************************************************************************

InitMyWindow()

创建窗口。

staticBOOLInitMyWindow(HINSTANCEhInstance,intnCmdShow)

HWNDhwnd;

//窗口句柄

WNDCLASSwc;

//窗口类结构

//填充窗口类结构

wc.style=CS_VREDRAW|CS_HREDRAW;

wc.lpfnWndProc=(WNDPROC)WinProc;

wc.cbClsExtra=0;

wc.cbWndExtra=0;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(hInstance,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);

wc.lpszMenuName=NULL;

wc.lpszClassName="

MyWin"

;

//注册窗口类

RegisterClass(&

wc);

//创建主窗口

hwnd=CreateWindow(

"

//窗口类名称

一个简单的Win32程序"

//窗口标题

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

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

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

500,//窗口的宽度

400,//窗口的高度

NULL,//父窗口句柄

NULL,//菜单句柄

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

NULL);

//窗口创建数据指针

if(!

hwnd)

//显示并更新窗口

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

returnTRUE;

********************************************************************

WinProc()

处理主窗口消息

//*************************************************************************

LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

switch(message)

caseWM_KEYDOWN:

//击键消息

switch(wParam)

{

caseVK_ESCAPE:

MessageBox(hWnd,"

你按下了ESC键!

"

"

键盘"

MB_OK);

break;

}

break;

caseWM_RBUTTONDOWN:

//鼠标消息

{

MessageBox(hWnd,"

你按下了鼠标右键!

鼠标"

break;

}

caseWM_PAINT:

//窗口重绘消息

{

charhello[]="

你好,我是最简单的Win!

HDChdc;

PAINTSTRUCTps;

hdc=BeginPaint(hWnd,&

ps);

//取得设备环境句柄

SetTextColor(hdc,RGB(0,0,255));

//设置文字颜色

TextOut(hdc,20,10,hello,strlen(hello));

//输出文字

EndPaint(hWnd,&

//释放资源

caseWM_DESTROY:

//退出消息

PostQuitMessage(0);

//调用退出函数

}

//调用缺省消息处理过程

returnDefWindowProc(hWnd,message,wParam,lParam);

编译,运行该程序。

运行结果为弹出一个简单的Windows窗口,提示:

你好,我是简单的Win!

点击鼠标右键,会谈出提示框:

你按下了鼠标右键!

按下Esc键,会提示:

你按下了ESC键!

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

下面对框架里边比较重要的函数进行解释说明。

WinMain()函数

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

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

WinMain()函数的原型如下:

HINSTANCEhPrevInstance,//前一个实例句柄

LPSTRlpCmdLine,//命令行字符

intnCmdShow)//窗口显示方式

第一个参数hInstance,是标识该应用程序当前的实例的句柄。

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

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

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

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

只要一执行,则说该程序的一个实例在运行。

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

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

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

第二个参数是hPrevInstance,它是用来标识该应用程序的前一个实例句柄。

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

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

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

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

第三个参数是lpCmdLine,是指向应用程序命令行参数字符串的指针。

如在Win95的"

开始"

菜单中单击"

运行"

,输入"

easywinhello"

,则此参数指向的字符串为"

hello"

最后一个参数是nCmdShow,是一个用来指定窗口显示方式的整数。

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

注册窗口类

上面的例程中,创建主窗口的函数是InitMyWindow()。

通常要对填充一个窗口类结构WNDCLASS,然后调用RegisterClass()对该窗口类进行注册。

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

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

这好比人们量体裁衣。

typedefstruct_WNDCLASS{

UINTstyle;

//窗口的风格

NDPROClpfnWndProc;

//指定窗口的消息处理函数的远指针

intcbClsExtra;

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

intcbWndExtra;

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

HANDLEhInstance;

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

HICONhIcon;

//指定窗口的图标

HCURSORhCursor;

//指定窗口的鼠标

HBRUSHhbrBackground;

//指定窗口的背景画刷

LPCTSTRlpszMenuName;

//窗口的菜单资源名称

LPCTSTRlpszClassName;

//该窗口类的名称

}WNDCLASS;

在Win95和WinNT的具有新界面特性的系统中,为了支持新的窗口界面特性,还有一种扩展的窗口类型WNDCLASSEX,它的定义如下:

typedefstruct_WNDCLASSEX{

UINTcbSize;

//指定WNDCLASSEX结构的大小

WNDPROClpfnWndProc;

HICONhIconSm;

//窗口的小图标

}WNDCLASSEX;

结构中相关成员这里进行简单解释一下,实际应用过程中查阅MSDN。

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

函数原型如下:

ATOMRegisterClass(CONSTWNDCLASS*lpWndClass);

ATOMRegisterClassEx(CONSTWNDCLASSEX*lpwcx);

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

如果失败,则返回0。

创建窗口

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

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

窗口类中已经预先定义了窗口的一般属性,而CreateWindow()中的参数可以进一步指定一个窗口的更具体的属性,在MyWin程序中,是如下调用CreateWindow()函数来创建窗口的:

hwnd=CreateWindow(

"

//创建窗口所用的窗口类的名称

//窗口标题

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

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

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

500,//窗口的宽度

400,//窗口的高度

NULL,//父窗口句柄

NULL,//菜单句柄

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

NULL);

//一般都为NULL

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

显示和更新窗口

窗口创建后,并不会在屏幕上显示出来,要真正把窗口显示在屏幕上,还得使用ShowWindow()函数,其原型如下:

BOOLShowWindow(HWNDhWnd,intnCmdShow);

参数hWnd指定要显示得窗口的句柄,nCmdShow表示窗口的显示方式,这里指定为从WinMain()函数的nCmdShow所传递而来的值。

由于ShowWindow()函数的执行优先级不高,所以当系统正忙着执行其它的任务时,窗口不会立即显示出来,此时,调用UpdateWindow()函数以可以立即显示窗口。

其函数原型如下:

BOOLUpdateWindow(HWNDhWnd);

消息循环

在Win32编程中,消息循环是相当重要的一个概念,看似很难,但是使用起来却是非常简单。

在WinMain()函数中,调用InitWindow()函数成功的创建了应用程序主窗口之后,就要启动消息循环,其代码如下:

while(GetMessage(&

msg,NULL,0,0))

TranslateMessage(&

DispatchMessage(&

Windows应用程序可以接收以各种形式输入的信息,这包括键盘、鼠标动作、记时器产生的消息,也可以是其它应用程序发来的消息等等。

Windows系统自动监控所有的输入设备,并将其消息放入该应用程序的消息队列中。

Windows消息结构及分类在下一章节进行讲解。

GetMessage()函数还可以过滤消息,它的第二个参数是用来指定从哪个窗口的消息队列中获取消息,其它窗口的消息将被过滤掉。

如果该参数为NULL,则GetMessage()从该应用程序线程的所有窗口的消息队列中获取消息。

第三个和第四个参数是用来过滤MSG结构中主消息值的,主消息值在wMsgFilterMin和wMsgFilterMax之外的消息将被过滤掉。

如果这两个参数为0,则表示接收所有消息。

当且仅当GetMessage()函数在获取到WM_QUIT消息后,将返回0值,于是程序退出消息循环。

TranslateMessage()函数的作用是把虚拟键消息转换到字符消息,以满足键盘输入的需要。

DispatchMessage()函数所完成的工作是把当前的消息发送到对应的窗口过程中去。

消息处理函数

消息处理函数又叫窗口过程,在这个函数中,不同的消息将用switch语句分配到不同的处理程序中去。

Windows的消息处理函数都有一个确定的样式,即这种函数的参数个数和类型以及其返回值的类型都有明确的规定。

在VC的说明书中,消息处理函数的原型是这样定义的:

LRESULTCALLBACKWindowProc(

HWNDhwnd,//接收消息窗口的句柄

UINTuMsg,//消息值

WPARAMwParam,//消息值对应的第一个参数

LPARAMlParam//消息值对应的第二个参数

);

如果你的程序中还有其它的消息处理函数,也都必须按照上面的这个样式来定义,但函数名称可以随便取。

EasyWin中的WinProc()函数就是这样一个典型的消息处理函数。

消息处理函数的四个参数是由GetMessage()函数从消息队列中获得MSG结构,然后分解后得到的。

第二个参数uMsg和MSG结构中的message值是一致的,代表了主消息值。

程序中用switch语句来将不同类型的消息分配到不同的处理程序中去。

WinProc()函数明确的处理了4个消息,分别是WM_KEYDOWN(击键消息)、WM_RBUTTONDOWN(鼠标右键按下消息)、WM_PAINT(窗口重画消息)、WM_DESTROY(销毁窗口消息)。

值得注意的是,应用程序发送到窗口的消息远远不止以上这几条,象WM_SIZE、WM_MINIMIZE、WM_CREATE、WM_MOVE等这样频频使用的消息就有几十条。

为了减轻编程的负担,Windows的API提供了DefWindowProc()函数来处理这些最常用的消息,调用了这个函数后,这些

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

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1