WinSDK入门.docx
- 文档编号:2646981
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:17
- 大小:1.63MB
WinSDK入门.docx
《WinSDK入门.docx》由会员分享,可在线阅读,更多相关《WinSDK入门.docx(17页珍藏版)》请在冰点文库上搜索。
WinSDK入门
窗口程序简介
张松
一、简单的窗口程序
在VC中创建一个Win32Application类型的程序,输入以下代码:
Eg1:
运行结果:
分析:
Ø控制台程序从main函数开始,WINDOWS程序从WinMan函数开始。
Ø创建windows窗口程序,就需要使用微软公司提供的专用函数,这里MessageBox就是一个,它的作用是创建一个对话框。
(这里加上两个冒号,以为了和以往函数相区别,这是MS公司的习惯。
)
Ø控制台程序只能同时运行一个程序,而窗口程序可以同时运行多个。
一个运行的程序叫作一个进程,操作系统为了每个进程有一个唯一的编号(PID)。
Ø窗口程序从WinMain函数开始,它有四个参数,第一个参数hInstance是就系统设置的,记录当前程序的编号。
Ø由于窗口中会有各式各样的编号,所以把这个编号叫作句柄,HINSTANCE是程序句柄 类型,其功能等效于int。
二、基本程序框架
Eg2:
运行结果:
分析:
ØWindow程序界面皆窗口,窗口的作用是接收用户的输入(鼠标、键盘和定时器)和输出程序的运行结果。
一个程序可以有很多窗口,窗口之间可以有父子关系,与工具栏是一个窗口,但它是移不出主程序窗口的,它是主程序窗口的子窗口。
还有状态栏,对话框,按钮控件,而控制台程序有文字模式。
ØCreateWindow函数功能是创建一个窗口,窗口创建成功后,系统就返回了一个窗口句柄hWnd;
Ø在CreateWidnow之前,还要通过RegisterClassEx来设置另一部分窗口参数,它把这个些参数都汇集到一个WNDCLASSEX类型的结构变量wcex之中,向操作系统提交窗口参数的过程,叫作“注册窗口类”,用wcex表示的每一份窗口参数都用一个字符串标识即:
wcex。
lpszClassName="TB";
Ø窗口创建之后,并没有显示,需要使用:
:
ShowWindow(hWnd,SW_SHOW);来显示,其中宏SW_SHOW表示以正常方式显示;
Ø窗口的一个主要作用是接收用户输入操作,系统中有一个队列,鼠标第一个动作,如一单点左点,系统就用605表示,收到这个动作,并把这个标识号加入到队列中,把唯一标识每一个动作的标识叫作消息,这一个队列叫作消息队列。
使用GetMessage函数从队列中取得消息;使用DispatchMessage发到我们程序中来处理。
程序不断运行的过程,就是一个不断发送消息,处理消息的过程。
取消息GetMessage是一个循环结构:
while(:
:
GetMessage(&msg,NULL,0,0))
{
:
:
DispatchMessage(&msg);
}
Ø在程序中最终由WndProc函数来处理由DispathcMessage函数发出的消息,因为在窗口创建之前已经由在wcex。
lpfnWndProc=(WNDPROC)WndProc;记录下了函数名;
Ø回调函数intWndProc(HWNDhWnd,intmessage,intwParam,intlParam)是由操作系统调用的,调用时设置了四个参数message表示消息类型号当窗口关闭时,WndProc将收到WM_DESTROY消息收到此消息时,调用:
:
PostQuitMessage(0);向消息队列放置了一个为0的消息,在消息循环中得到这个0消息,循环退出,程序就结束了;
ØWM_LBUTTONDOWN这个宏定义的消息表示鼠标左键按下,按下后显示一个消息框维护一个程序运行需要处理大量消息,但很多情况下,可以使用系统的默认实现,所以对于不处理消息可调用DefWindowProc来默认处理。
三、窗口绘制
Eg3:
在窗口过程WndProc中,加入如下代码:
分析:
Ø在可以WM_PAINT消息中实现图形绘制;
Ø要在窗口上画图,先要得得到窗口设备环境句柄(hDC):
HDChDC=:
:
BeginPaint(hWnd,&ps);所有窗口绘制的函数,第一个参都是这个hDC。
所有绘图完成后,一定要调用EndPaint,“释放”hDC;
ØTestOut是在窗口中显示文字第二,三个参数是文字的位置;
Ø窗口绘制的坐标系(0,0)在客户区左上角,x轴向右,y轴向下。
ØMoveToEx,移动画笔的位置,配合上LineTo就能画一条直线;
ØRectangle是画一个矩形,50,50,200,300指是矩形左上角和右下角的坐标。
Eg4:
分析:
Ø绘制的图形可以设置线型、线宽、颜色和填充色。
Ø线型、线宽和颜色三个概念叫作笔(Pen)
Ø填充色叫作实心刷子(SolidBrush)
Ø可以使用CreatePen函数,创建一个笔,格式是CreatePen(线型,线宽,颜色)
Ø可以使用CreateBrush函数,创建一个实心刷子CreateSolidBrush(颜色)
ØPS_SOLID表示实线型。
Ø程序中,每一个颜数由三基色(红,绿,蓝)按比例组合而成一个整数值――每一个基色分量值从0至255;反过来,一个整数可以表示一种颜色。
也可以使用宏RGB来得到指定颜色的值,如nR=RGB(255,0,0),nR保存了表示红色的整数值。
Ø创建好的笔和刷叫作一个绘制对象,用一个句柄标识,只有使用SelectObject函数,将其实选入到当前DC中去,绘制画效果才能发生改变。
Ø绘制对象在使用完之后,一定要调用DeleteObject将其释放,不然会有严重的内存泄漏。
Eg5在窗口中显示鼠标移动的位置坐标
分析:
Ø在除了WM_PAINT以外的消息中,得到/释放DC的句柄,要使用GetDC/ReleaseDC这一对函数。
Ø在所有与鼠标相关的消息中(如LBUTTONDOWN,RBUTTONDOWN,…),在lPram的高字节部分记录鼠标的x位置,低字节记录了鼠标的y位置。
可以使用系统定义好的宏LOWORD和HIWORD来取得
intnX=LOWORD(lParam);
intnY=HIWORD(lParam);
四、定时器
Eg6:
分析:
Ø定时器是系统内部的一个时钟,设定好时间间隔后,在每个时间间隔中处理问题,使用定时器的步骤;
Ø设置定时器SetTimer;
Ø响应定时器消息WM_TIMER;
Ø用完之后要销毁掉定时器KillTimer。
运行结果:
每隔一秒钟,计数就加一:
五、位图直接显示
Eg7:
在窗口中显示如下图所示的一幅图片(文件名:
role.bmp,大小是110x114256色):
分析:
显示位图的步骤:
1、用CreateCompatibleDC创建一个DC以来为存放位图;
2、用LoadImage把位图从文件中读到内存中,得到位图的句柄上hBitmap;
3、再把位置选入其DC中,SelectObject(g_hBitmapDC,hBitmap);,以后对这个DC的操作就是对位图的操作;
4、在WM_PAIN消息中,使用BltBit来显示位图。
:
:
BitBlt(hDestDC,//目的DC
x1,y1,//窗口中用来显示图片的区域的位置
w1,h1,//窗口中用来显示图片的区域的大小
hSrcDC,//容放位图的DC
x2,y2//图片显示的起始位置
SRCCOPY);//显示方式,一般使用直接显示方式SRCCOPY
六、位图透明显示
Eg8:
分析:
ØTransparentBlt可以把图形以透明的方式显示在背景上但要注意,要使用这个函数,需要加入以下预编译语句:
#pragmacomment(lib,"msimg32。
lib");
:
:
TransparentBlt(hDestDC,
x1,y1,w1,h1,//窗口中用来显示图片的区域
hSrcDC,
x2,y2,w2,h2,//需要显示图片的区域
nC);//图片中不需要显示出来的像素的颜色
Ø函数GetPixel是可以得指定DC中像素的颜色,intnC=:
:
GetPixel(g_hBitmapDC,0,0);表示得到由g_hBitmapDC表示位图,(0,0)位置像素的颜色;
Ø对于一般绝大多数图像而言,左上角点都是背景色,所以得到这个颜色值后,并把它作为TransparentBlt显示的最后一个参数,那么显示时,凡遇到这个色的像素就不显示,因此就会得到背景被镂空的效果。
七、菜单功能
1。
加入资源文件
在VisualC++6。
0的环境,经常会有一种后缀名为。
rc的文件,这种文件就是资源配置文件。
其中可以包含菜单配置。
新建一个资源文件,【文件】->【新建…】,选择【ResourceScript】,键入文件名,其他按照默认设置,点击【确定】按钮就可以了。
这样一个资源文件就引入到工程中。
在VC的工作区中就可以看到多出一个选项卡,中间的那个选项卡就是资源选项卡。
使用鼠标右键点击树的根节点,在弹出的菜单中选择【Insert…】,来实现添加一个资源类别。
2。
加入菜单资源
按照上述操作流程,添加一个资源文件,然后在这个资源文件中添加一个菜单资源。
然后编辑这个菜单资源,并且为它添加三个菜单项。
如图所示:
给每一个菜单项都赋予一个ID值,这里,分别赋予IDM_MENUITEM1、IDM_MENUITEM2、IDM_MENUITEM3,保存并关闭资源窗口。
3。
为窗口指定菜单
在注册窗口类的时候,窗口类结构体WNDCLASSEX中有一个成员lpszMenuName就起着为窗口指定菜单的作用。
lpszMenuName成员本身是一个字符串指针,只需要为它指定一个菜单资源就可以了。
在注册窗口类时使用如下语句:
wcex。
lpszMenuName=(char*)IDR_MENU1;
运行程序,会发现窗口的顶端会出现一个菜单。
4响应菜单事件
当点击菜单项之后,窗口会得到WM_COMMAND消息,俗称命令消息。
所有的菜单点击事件都会产生WM_COMMAND消息,为每一个菜单项设置一个ID值。
关于ID值,每一个菜单ID值都必须是唯一的能够代表这个菜单项。
这里,分别给它们赋予IDM_MENUITEM1、IDM_MENUITEM2、IDM_MENUITEM3,如图所示:
完成后退出,回到源代码编辑窗口,在回调函数中加入消息响应代码:
Eg9响应菜单消息
ØWM_COMMAND消息的参数wParam的低字节部分记录了被点击菜单项的ID值。
Ø如果哪一项都不符合,使用DefWindowProc函数,将消息作缺省处理。
因为程序控制能执行到这里,一定是接收到了WM_COMMAND消息,只是nID的值没有那一项符合,即不需要作处理,就使用DefWindowProc函数作缺省处理。
八、小结
使用C++语言进行窗口应用程序的开发,主要需要调用微软公司已经发布系统函数(即API函数),其语言规则,仍是使用最C++,所以在实际开过程中,需要查阅函数库。
这里仅就以上介绍过程中提到过的内容作一个简单的归纳。
MS-API函数:
函数名
功能
WinMain
窗口程序的起始函数
MessageBox
显示一个消息框,用来输出简短提示
CreateWindow
创建一个窗口,返回标识这个窗口的句柄
RegiesterClassEx
提交创建窗口所需参数
ShowWindows
显示窗口
GetMessage
从消息队列中取得消息
DispatchMessage
向窗口过程发送消息
PostQuitMessage(0)
向窗口的消息队列发送一个结束消息,以些来结束程序。
DefWindowProc
消息的默认处理
BeginPaint
仅在WM_PAINT消息使用,用来得到窗口的dc
EndPaint
仅在WM_PAINT消息使用,用来释放窗口的dc
GetDC
在非WM_PAINT消息中,用来得到窗口的dc
ReleaseDC
在非WM_PAINT消息中,释放得到窗口的dc
TextOut
输入文字
MoveTo
移动当前绘制起点到指定位置
LineTo
从绘制起点到指定位置绘一条直线段
Ellipse
绘制一个椭圆
Rectangle
绘制一个矩形
CreatePen
创建一个笔(线型,线宽,颜色)
CreateSolidBrush
创建一个实线刷子(填充色)
SelectObject
选择绘图对象(笔,刷子,位图DC)到一个DC中
DeleteObject
释放绘图对象(笔,刷子,位图DC)
KillTimer
取消指定定时器
SetTimer
设置一个定时器
LoadImage
从bmp文件中装入一个位图,到内存中去。
CreateCompatibleDC
创建一个单独容放位图的DC
TransparentBlt
位图的透明显示
BitBlt
位图的原样显示
常用窗口消息
消息名
发送时机
携带参数
WM_CREATE
创建被窗口后立即被发送
省略
WM_DESTROY
当窗口关闭前,由系统发送
省略
WM_PAINT
窗口需要刷新时
省略
WM_LBUTTONDOWN
鼠标左键按下时
lParam中记录鼠标的位置
ntnX=LOWORD(lParam);
intnY=HIWORD(lParam);
WM_RBUTTONDOWN
鼠标右键按下时
WM_MOUSEMOVE
鼠标移动时
WM_TIMER
定时器时间间隔到时
wParam记录了定时器的编号
WM_COMMAND
菜单项被选择时
wParam低字节部分记录,所选菜单的ID号intnID=LOWORD(wParam);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WinSDK 入门