Win32编程基础知识Word格式文档下载.docx
- 文档编号:16313284
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:14
- 大小:24.26KB
Win32编程基础知识Word格式文档下载.docx
《Win32编程基础知识Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Win32编程基础知识Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
//内容:
一个基本的Win32程序//*******************************************************************
#include<
windows.h>
windowsx.h>
//函数声明
BOOLInitWindow(HINSTANCEhInstance,intnCmdShow);
LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);
//*******************************************************************
//函数:
WinMain()
//功能:
Win32应用程序入口函数。
创建主窗口,处理消息循环
intPASCALWinMain(HINSTANCEhInstance,//当前实例句柄
HINSTANCEhPrevInstance,//前一个实例句柄
LPSTRlpCmdLine,//命令行字符
intnCmdShow)//窗口显示方式
{
MSGmsg;
//创建主窗口
if(!
InitWindow(hInstance,nCmdShow))
returnFALSE;
//进入消息循环:
//从该应用程序的消息队列中检取消息,送到消息处理过程,
//当检取到WM_QUIT消息时,退出消息循环。
while(GetMessage(&
msg,NULL,0,0))
TranslateMessage(&
msg);
DispatchMessage(&
}
//程序结束
returnmsg.wParam;
//******************************************************************
InitWindow()
创建窗口。
staticBOOLInitWindow(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=GetStockObject(WHITE_BRUSH);
wc.lpszMenuName=NULL;
wc.lpszClassName="
EasyWin"
//注册窗口类
RegisterClass(&
wc);
hwnd=CreateWindow(
//窗口类名称
一个基本的Win32程序"
//窗口标题
WS_OVERLAPPEDWINDOW,//窗口风格,定义为普通型
100,//窗口位置的x坐标
100,//窗口位置的y坐标
400,//窗口的宽度
300,//窗口的高度
NULL,//父窗口句柄
NULL,//菜单句柄
hInstance,//应用程序实例句柄
NULL);
//窗口创建数据指针
if(!
hwnd)returnFALSE;
//显示并更新窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
returnTRUE;
WinProc()
处理主窗口消息
LRESULTCALLBACKWinProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
switch(message)
caseWM_KEYDOWN:
//击键消息
switch(wParam)
caseVK_ESCAPE:
MessageBox(hWnd,"
ESC键按下了!
"
Keyboard"
MB_OK);
break;
caseWM_RBUTTONDOWN:
//鼠标消息
鼠标右键按下了!
Mouse"
caseWM_PAINT:
//窗口重画消息
charhello[]="
你好,我是EasyWin!
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);
程序输入完毕,即可编译执行。
在窗口中击鼠标键或按ESC键时,会弹出一个对话框以表示你的操作。
其实,这个程序可以看成是所有Win32应用程序的框架,在以后所有的程序中,你会发现它们都是在这个程序的基础之上再添加代码。
WinMain()函数
WinMain()函数是应用程序开始执行时的入口点,通常也是应用程序结束任务退出时的出口点。
它与DOS程序的main()函数起同样的作用,有一点不同的是,WinMain()函数必须带有四个参数,它们是系统传递给它的。
WinMain()函数的原型如下:
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等,关于这些值的含义,将在下一节说明。
注册窗口类
一个应用程序可以有许多窗口,但只有一个是主窗口,它是与该应用程序的实例句柄唯一关联的。
上面的例程中,创建主窗口的函数是InitWindow()。
通常要对填充一个窗口类结构WNDCLASS,然后调用RegisterClass()对该窗口类进行注册。
每个窗口都有一些基本的属性,如窗口边框、窗口标题栏文字、窗口大小和位置、鼠标、背景色、处理窗口消息函数的名称等等。
注册的过程也就是将这些属性告诉系统,然后再调用CreateWindow()函数创建出窗口。
这也就象你去裁缝店订做一件衣服,先要告诉店老板你的身材尺寸、布料颜色、以及你想要的款式,然后他才能为你做出一件让你满意的衣服。
在VC的帮助中,可以看到WNDCLASS结构是这样定义的:
typedefstruct_WNDCLASS{
UINTstyle;
//窗口的风格*
WNDPROClpfnWndProc;
//指定窗口的消息处理函数的远指针*
intcbClsExtra;
//指定分配给窗口类结构之后的额外字节数*
intcbWndExtra;
//指定分配给窗口实例之后的额外字节数
HANDLEhInstance;
//指定窗口过程所对应的实例句柄*
HICONhIcon;
//指定窗口的图标
HCURSORhCursor;
//指定窗口的鼠标
HBRUSHhbrBackground;
//指定窗口的背景画刷
LPCTSTRlpszMenuName;
//窗口的菜单资源名称
LPCTSTRlpszClassName;
//该窗口类的名称*
}WNDCLASS;
在Win95和WinNT的具有新界面特性的系统中,为了支持新的窗口界面特性,还有一种扩展的窗口类型WNDCLASSEX,它的定义如下:
typedefstruct_WNDCLASSEX{
UINTcbSize;
//指定WNDCLASSEX结构的大小
HICONhIconSm;
//窗口的小图标
}WNDCLASSEX;
WNDCLASS和WNDCLASSEX这两个结构基本上是一致的,只是WNDCLASSEX结构中多了cbSize和hIconSm这两个成员。
WNDCLASS结构的各成员中,其注释后打了星号的表示该项应特别注意。
WNDCLASS结构的第一个成员style表示窗口类的风格,它往往是由一些基本的风格通过位的“或”操作(操作符位“|”)组合而成。
下表列出了一些常用的基本窗口风格:
风格含义
CS_HREDRAW如果窗口客户区宽度发生改变,重绘整个窗口
CS_VREDRAW如果窗口客户区高度发生改变,重绘整个窗口
CS_DBLCLKS能感受用户在窗口中的双击消息
CS_NOCLOSE禁用系统菜单中的“关闭”命令
CS_OWNDC为该窗口类的各窗口分配各自独立的设备环境
CS_CLASSDC为该窗口类的各窗口分配一个共享的设备环境
CS_PARENTDC指定子窗口继承其父窗口的设备环境
CS_SAVEBITS把被窗口遮掩的屏幕图象部分作为位图保存起来。
当该窗口被移动时,Windows使用被保存的位图来重建屏幕图象
在EasyWin应用程序中,是按如下方式对WNDCLASS结构进行填充和注册的:
可以看到,wc.style被设为CS_VREDRAW|CS_HREDRAW,表示只要窗口的高度或宽度发生变化,都会重画整个窗口。
第二个成员lpfnWndProc的值为(WNDPROC)WinProc。
表明该窗口类的消息处理函数是WinProc()函数。
这里,要指定窗口的消息处理函数的远指针,输入消息处理函数的函数名称即可,必要时应该进行强制类型转换,将其转换成WNDPROC型。
接下来的cbClsExtra和wc.cbWndExtra在大多数情况下都会设为0。
然后的hInstance成员,给它的值是由WinMain()传来的应用程序的实例句柄,表明该窗口与该实例是相关联的。
事实上,只要是注册窗口类,该成员的值始终是该程序的实例句柄,你应该象背书一样记住它。
下面的hIcon,是让你给这个窗口指定一个图标,调用LoadIcon(hInstance,IDI_APPLICATION),可以调用系统内部预先定义好的标志符为IDC_APPLICATION的图标作为该窗口的图标。
同样,调用LoadCursor(NULL,IDC_ARROW)为该窗口调用系统内部预先定义好的箭头型鼠标。
hbrBackground成员用来定义窗口的背景画刷颜色,也就是该窗口的背景色。
调用GetStockObject(WHITE_BRUSH)可以获得系统内部预先定义好的白色画刷作为窗口的背景色。
上面的LoadIcon()、LoadCursor()、GetStockObject()都是Windows的API函数,它们的用法可以参看VC的帮助,这里就不多介绍了。
lpszMenuName成员的值我们给它NULL,表示该窗口将没有菜单。
如果你想让你的窗口拥有菜单,就把lpszMenuName成员赋值为标志菜单资源的字符串。
WNDCLASS结构的最后一个成员lpszClassName是让你给这个窗口类起一个唯一的名称,因为Windows操作系统中有许许多多的窗口类,必须用一个独一无二的名称来代表它们。
通常,你可以用你的程序名来命名这个窗口类的名称。
这个名称将在创建窗口的CreateWindow()函数中用到。
填充完毕后,对于WNDCLASS结构,调用RegisterClass()函数进行注册;
对于WNDCLASSEX结构,调用RegisterClassEx()函数进行注册,它们的原型分别如下:
ATOMRegisterClass(CONSTWNDCLASS*lpWndClass);
ATOMRegisterClassEx(CONSTWNDCLASSEX*lpwcx);
该函数如调用成功,则返回一个非0值,表明系统中已经注册了一个名为EasyWin的窗口类。
如果失败,则返回0。
创建窗口
当窗口类注册完毕之后,并不会有窗口显示出来,因为注册的过程仅仅是为创建窗口所做的准备工作。
实际创建一个窗口的是通过调用CreateWindow()函数完成的。
窗口类中已经预先定义了窗口的一般属性,而CreateWindow()中的参数可以进一步指定一个窗口的更具体的属性,在EasyWin程序中,是如下调用CreateWindow()函数来创建窗口的:
//创建窗口所用的窗口类的名称*
WS_OVERLAPPEDWINDOW,//窗口风格,定义为普通型*
hInstance,//应用程序实例句柄*
//一般都为NULL
CreateWindow()函数的参数的含义在上面的注释中已有介绍,注释后打了星号标记的参数应该着重注意,其它的参数都很简单,不多做介绍,可参看VC的帮助。
第一个参数是创建该窗口所使用的窗口类的名称,注意这个名称应与前面所注册的窗口类的名称一致。
第三个参数为创建的窗口的风格,下表列出了常用的窗口风格:
WS_OVERLAPPEDWINDOW创建一个层叠式窗口,有边框、标题栏、系统菜单、最大最小化按钮,是以下几种风格的集合:
WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX
WS_POPUPWINDOW创建一个弹出式窗口,是以下几种风格的集合:
WS_BORDER,WS_POPUP,WS_SYSMENU。
WS_CAPTION与WS_POPUPWINDOW风格必须一起使用才能使窗口菜单可见
WS_OVERLAPPED创建一个层叠式窗口,它有标题栏和边框,与WS_TILED风格一样
WS_POPUP该窗口为弹出式窗口,不能与WS_CHILD同时使用
WS_BORDER窗口有单线边框
WS_CAPTION窗口有标题栏
WS_CHILD该窗口为子窗口,不能与WS_POPUP同时使用
WS_DISABLED该窗口为无效,即对用户操作不产生任何反应
WS_HSCROLL窗口有水平滚动条
WS_ICONIC窗口初始化为最小化
WS_MAXIMIZE窗口初始化为最大化
WS_MAXIMIZEBOX窗口有最大化按钮
WS_MINIMIZE与WS_MAXIMIZE一样
WS_MINIMIZEBOX窗口有最小化按钮
WS_SIZEBOX边框可进行大小控制的窗口
WS_SYSMENU创建一个有系统菜单的窗口,必须与WS_CAPTION风格同时使用
WS_THICKFRAME创建一个大小可控制的窗口,与WS_SIZEBOX风格一样.
WS_TILED创建一个层叠式窗口,有标题栏
WS_VISIBLE窗口为可见
WS_VSCROLL窗口有垂直滚动条
程序中使用了WS_OVERLAPPEDWINDOW标志,它是创建一个普通窗口常用的标志。
而在DirectX编程中,我们常用的是WS_POPUP,用这个标志创建的窗口没有标题栏和系统菜单,如果设定窗口为最大化,客户区可以占满整个屏幕,以满足DirectX编程的需要。
CreateWindow()函数后面的参数中,仍用到了该应用程序的实例句柄hInstance。
如果窗口创建成功,返回值是新窗口的句柄,否则返回NULL。
显示和更新窗口
窗口创建后,并不会在屏幕上显示出来,要真正把窗口显示在屏幕上,还得使用ShowWindow()函数,其原型如下:
BOOLShowWindow(HWNDhWnd,intnCmdShow);
参数hWnd指定要显示得窗口的句柄,nCmdShow表示窗口的显示方式,这里指定为从WinMain()函数的nCmdShow所传递而来的值。
由于ShowWindow()函数的执行优先级不高,所以当系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Win32 编程 基础知识