VisualC高级编程第二讲

上传人:无*** 文档编号:166045971 上传时间:2022-10-31 格式:PPT 页数:33 大小:265KB
收藏 版权申诉 举报 下载
VisualC高级编程第二讲_第1页
第1页 / 共33页
VisualC高级编程第二讲_第2页
第2页 / 共33页
VisualC高级编程第二讲_第3页
第3页 / 共33页
资源描述:

《VisualC高级编程第二讲》由会员分享,可在线阅读,更多相关《VisualC高级编程第二讲(33页珍藏版)》请在装配图网上搜索。

1、 Microsoft Visual C+提供了几种不同途径的GUI(图形用户界面)编程方法:1、直接调用底层Win32应用程序接口(API)提供的函数用C或C+编写GUI程序。API函数是Windows操作系统的一部分。2、利用Microsoft基础类(MFC),用C+进行编程。MFC可以简化GUI Win32 API,提供更高级、更具移植性的编程接口。3、可以用MFC和Microsoft向导编写C+下的GUI程序,应用程序向导可以用来生成各种不同的GUI程序源文件,然后可以用Class Wizard工具生成派生类、定义处理消息等大部分代码。在SDI(单文档接口)应用程序中,一般包括四个主类:

2、文档类:用来存放程序数据 视图类:用来显示程序数据 主帧窗口类:管理主程序窗口 应用程序类:完成程序任务,如初始化程序和完成最后程序整理等程序的流程如下:调用CWinApp类构造器 程序入口函数WinMain函数接收控制 初始化处理 消息处理循环 程序的终止初始化所有全局对象初始化所有全局对象CWinApp构造函数构造函数主函数主函数消息消息循环循环应用程序构造函数应用程序构造函数InitInstance函数函数疑问1:主函数到底在那里?疑问2:MFC如何完成主函数的功能疑问3:由操作系统传入的四个参数如何获取?疑问4:CWinApp类中的主窗口句柄在哪里?问题四的答案SDK的窗口函数MFC的

3、消息映射 在MFC程序中,WINMAIN函数还是存在的,它由MFC准备好的并由链接器直接加入应用程序代码中的(StartUp代码)。MFC中消息处理循环 VC中四个重要的工具 在利用VC开发游戏程序时,由于MFC的APP向导是一个程序代码产生器在各项选择中产生出某种特色的主干程序,这个过程会嵌入许多默认的窗口、对话框、菜单等组件,这些组件在游戏中根本用不上,因此我们一般采用第二种开发方式:即利用Microsoft基础类(MFC)开发游戏程序。程序项目的建立:P1819(选择Win32)STDAFX.H文件的建立:这个文件用来作为Precompiled head file(预编译头文件),其内只

4、是载入其他MFC头文件。资源文件的建立 启动Class Wizard用来管理类、消息映射等 设置使用MFC函数库 使用Class Wizard建立应用程序类和窗口类 生成应用程序类实例,改写InitInstance函数(生成主窗口)构造游戏主窗口 MFC其实是把Windows API做了一层薄薄包装,包装于各个设计良好的classes而已。MFC非常巨大,主要可以分为下列几大群组:一般用途Classes:提供字符串类、数据处理类、异常处理类、文件类等 Windows API Classes:用来封装Windows API,例如窗口类、对话框类、DC类等 应用程序骨干类:包括Document/V

5、iew、消息泵、动态创建、文件读写等 高级抽象类:如工具栏、状态栏、对话框等 操作系统扩展类:如OLE、ODBC、DAO、MAPI等 Windows不允许用户直接存取VGA显卡上的内存,所以在MFC中提供了大量的GDI(图形设备接口)类:CGdiObjiectCBitmapCBrushCFontCPaletteCPenCRgnP30 在绝大多数的WINDOWS应用都需要在屏幕上显示自己的数据。由于WINDOWS是一个设备无关的操作系统,所以任何向屏幕上进行输出的功能都要间接地通一个叫做设备上下文(device context)的对象来完成。我们向设备上下文提出屏幕输出的要求,然后由WINDOW

6、S自己来调用具体的输出设备的驱动程序来完成实际的输出工作。DC代表一条图形的输出途径,在MFC中通过CDC类来实现图形的输出(显示)来简化图形显示的操作.CDCCClientDCCMetaFileDCCPaintDCCWindowDCCObjectP31MoveTo:移动当前位置。LineTo:从当前位置到一点画直线。TextOut:用当前的字体显示字符串。BitBlt:从指定设备上下文拷贝图像。CreateCompatibleDC:创建内存设备上下文,与另一设备上下文匹配。如在内存中准备显示的图像。SelectObject:选择画笔等GDI绘图对象。在MFC程序中一般通过响应WM_PAINT

7、消息来实现窗口图形的重绘。如果程序在视图窗口以外的窗口(如对话框)显示图形,则窗口应提供WM_PAINT的消息处理函数-OnPaint,已便绘制或重绘图形.与其他窗口类似,视图窗口要绘制或重绘时也收到WM_PAINT消息,但CView类提供了一个OnPaint函数,并调整设备描述表,然后将对象传入OnDraw函数.因此,只有非CView派生的窗口类才需要提供自己的OnPaint函数.在程序中绘制文字首先需要建立新的字体,在MFC中通过CFont类来实现新字体的建立,基本步骤如下:CFont newFont,*oldFont;/新字体和旧字体指针新字体和旧字体指针 newFont.CreateF

8、ont();/建立新字体建立新字体 oldFont=dc.SelectObject(&newFont);/选入新字体并保存原来字体选入新字体并保存原来字体 TextOut()/绘制文字绘制文字 dc.SelectObject(oldFont);/恢复原来字体恢复原来字体 绘制线段可以通过CPen来实现,绘制填充区域可以通过CBrush来实现,基本步骤与绘制文字类似。总结GDI使用过程如下:首先,建立新的GDI类实例;然后,在响应函数中通过选入具体实例进行具体绘制;最后,绘制完毕后恢复原有的GDI。MFC的的GDI类类 现实中颜色的种类是无穷的,而计算机显示系统所能表现的颜色数量是有限的,因此,

9、为了使计算机能最好地重现实际图景,就必须用一定的技术来管理和取舍颜色。Windows提供一个独立于硬件的颜色接口。程序提供一个“绝对”的颜色码,Windows把这个代码映射成计算机显示器上合适的颜色或颜色组合。受显存的限制,标准的VGA显示卡采用4色代码,这意味着它只能一次显示16中颜色。每一像素点的红、绿、蓝三原色分别用8位来表示,这就是我们所说的24位真彩色,如果使用24位真彩色显示卡,则可以直接使用所有的颜色,在Windows中提供一个RGB的宏将不同的RGB颜色转换成24位的真彩色。RGB的原型为:COLORREF(BYTE bRed,BYTE bGreen,BYTE bBlue)该宏

10、表示颜色值的数据类型,是一个32位的无符号长整型。bRed、bGreen、bBlue分别表示红、绿、蓝三原色的浓度,其类型为BYTE,长度为8。其16进制数据表示为:0 x00bbggrr,bb、gg、rr分别表示蓝、绿、红浓度,最高字节为0,用于保留与将来的系统兼容。在Windows中有两种类型的位图:DDB位图(设备相关位图,或称为GDI位图)和DIB位图(设备无关位图)。DDB位图对象由MFC中CBitmap类定义,DDB位图对象有一个与之关联的Windows数据结构BITMAP。DIB是标准的Windows位图格式,BMP文件就包含了一个DIB。Win32 SDK支持一些重要的DIB操

11、作函数,但是这些函数还没有封装到MFC中。typedef struct tagBITMAP int bmType;/位图的类型,必须为位图的类型,必须为0 int bmWidth;/位图的高度位图的高度 int bmHeight;/位图的宽度位图的宽度 int bmWidthBytes /位图中每一行中的字节数位图中每一行中的字节数 BYTE bmPlanes;/颜色的层数颜色的层数 BYTE bmBitsPixel;/每一像素所占的位数每一像素所占的位数 void FAR*bmBits;/存放像素值内存块的地址存放像素值内存块的地址BITMAP;int GetBitmap(BITMAP*pB

12、itMap)从位图中获取信息,并填充BITMAP结构,该函数用于查看CBitmap对象的信息。函数调用成功返回非零值,否则为0。BOOL LoadBitmap(UINT nIDResource)从应用程序的资源中加载位图资料,并将其与从应用程序的资源中加载位图资料,并将其与CBitmap对象连接对象连接BOOL CreateCompatibleBitmap(CDC*pDC;/指定设备上下文指定设备上下文Int nWidth;/指定位图的宽度(像素为单位)指定位图的宽度(像素为单位)Int nHeight;/指定位图的高度(像素为单位)指定位图的高度(像素为单位)创建与指定设备兼容的位图,并将其

13、与创建与指定设备兼容的位图,并将其与CBitmap连接,该函数初始化连接,该函数初始化一个与一个与pDC指定设备上下文兼容的位图,位图与指定设备上下文兼容的位图,位图与pDC具有相同的颜色具有相同的颜色位或相同的每个像素的位数。位或相同的每个像素的位数。1、创建位图CBitmap bitmap;bitmap.LoadBitmap(IDB_BITMAP1);2、创建兼容DCCDC dcCompatible;dcCompatible.CreateCompatibleDC(pDC);3、将位图选到兼容DC中dcCompatible.SelectObject(&bitmap);4、将兼容DC中的位图贴

14、到当前DC中。pDC-BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);位图兼容DC当前DC 对于要加载的位图在硬盘我们也可以通过Windows API中的LoadImage函数来实现:HANDLE LoadImage(HINSTANCE hinst,/位图实例的句柄 LPCTSTR lpszName,/位图所在的路径 UINT uType,/加载位图的类型 int cxDesired,/位图的宽度 int cyDesired,/位图的高度 UINT fuload /加载位图的方式 )

15、;成功地将位图加载到内存DC中之后,利用内存DC中的内容贴入位图DC中就行了,可以利用CDC类中的BitBlt函数来实现:BOOL BitBlt(int x,/位图DC中显示位图的左上角点的X坐标 int y,/位图DC中显示位图的左上角点的Y坐标 int nWidth,/位图DC中显示位图的宽度 int nHeight,/位图DC中显示位图的高度 CDC*pSrcDC,/存储来源位图的DC int xSrc,/内存DC中位图的左上角点的X坐标 int ySrc,/内存DC中位图的左上角点的Y坐标 DWORD dwRop /Raster运算值 );在BitBlt函数中最后一个参数是Raster

16、值,这个值可以用来实现设置位图贴到目的DC的方式.(P45表)镂空图就是将图片中一部分显示在另一张背景图上,而且除去图片中不需要显示的部分。蒙版:原图的二值化图片,需要显示与不需要显示的部分取不同的值。利用Raster运算我们可以实现镂空图的制作:使用BitBlt函数将蒙版与背景图AND运算 再以要镂空的图与背景做OR运算Raster运算运算镂空图制作镂空图制作B G RB G RB G RB G RB G RB G R.0 1 2 3 4 5 W-3 W-2 W-1W W+1 W+2W*(H-1)H-1W-1令图片大小为Width*Height(以像素点计),则有:图片每行包含字节数为:图片

17、每行包含字节数为:Width*PixelBytes(图片宽度图片宽度*每像素点所占字节数)每像素点所占字节数)图片每列包含字节数为:图片每列包含字节数为:Height*PixelBytes(图片高度图片高度*每像素点所占字节数)每像素点所占字节数)BITMAP结构中指定了结构中指定了bmBitsPixel(每一像素所占的位数),一字节为(每一像素所占的位数),一字节为8位位每像素点所占字节数每像素点所占字节数PixelBytes=bmBitsPixel8结论:如果获取图片像素的起始地址以及结论:如果获取图片像素的起始地址以及BITMAP结构则可以定位每一像素点进行结构则可以定位每一像素点进行加工和处理。加工和处理。半透明处理的步骤为:取出位图的各像素点,将像素点的RGB值乘以透明度百分比,存入内存数组中;取出背景与位图重叠部分像素点,乘以透明百分比,存入另一内存数组中;两数组相加,贴回目标DC实现半透明效果半透明图片制作半透明图片制作

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!