初学GDI绘图之心得

来源:互联网 发布:淘宝产品改动价格 编辑:程序博客网 时间:2024/06/09 23:04

1.GDI绘图提供了逻辑绘图设备与物理输出设备的分离。
2.设备上下文,这个概念从字面上有点难以理解,其实它是一个windows数据结构,MFC把包装成了CDC对象,设备上下文提供了应用程序的绘图的环境,也是应用程序的绘图输出设备,我个人是这么理解的:设备上下文在MFC中就是CDC对象,CDC就是一个很厉害的纸,这个纸可以对应你窗口的客户区,也能是你看不见的内存。
3.API可以用HDC,在MFC中都是用CDC以及CDC的派生类。API函数CreateDC与DeleteDC对应,API函数GetDC与ReleaseDC对应,API函数Attach与Detach对应,别搞混了。其实细细理解还是很容易就能记住它的用法的,你创建了,当然要删除;你获得了,当然要释放;你将一个CDC对象与一个设备句柄关联,当然要分离。学习GDI一定要把API函数和MFC类中的函数分清,往往MFC的同名函数要比API省事。
4.API函数GetWindowDC可以在整个窗口包括非客户区绘图。
5.为了简化与窗口相关的两种设备上下文的获取和释放,MFC提供了CClientDC和CWindowDC两个CDC的子类。
6.在第二点里面已经提到设备上下文了,最好理解的就是把它当作纸,而客户区就是这个纸,不过还有一种是内存设备上下文,它是一块内存区域,当内存设备上下文最初被创建时,它可以说就是一张空白的纸,只有将于一个CBitmap选入该设备之后,才能实际绘制。首先要定义一个CDC对象,然后创建这个CDC对象,从这个已存在的对象,通过调用CreateCompatibleDC可以获得一个与之兼容的内存设备上下文对象。然后用CreateCompatibleBitmap创建一个位图对象,将它选入内存设备。好像有点晕是吧,我是这样理解的,我首先创建了一个CDC,这个CDC对象就是屏幕,我要把这个屏幕的图像存入内存中,首先我得为它分配一块内存区域,这还没完,我还得给这内存设备上下文指定我准备绘制的是什么东西没,把这些准备工作做完之后接着就是抓图与显示了。
7.GDI对象,就是画笔,画刷,字体位图等等。在MFC中要做的只是把GDI对象选入设备上下文,在用完后选出即可。
8.坐标变换,CDC对逻辑空间的坐标变换只提供了SetWindowOrg平移变换。对于仿射变换,我们需要自己通过写代码才能实现。
9.坐标映射,我们通过CDC::SetMapMode(int nMapMode)设置映射模式,坐标映射其实就是一个x或y逻辑单位相当于多少像素。关于CDC::DPtoLP(将设备坐标转化为逻辑坐标)和CDC::LPtoDP(将逻辑坐标转化为设备坐标)这两个函数,我是这样认为的:GDI绘图用的坐标都是逻辑坐标,而我们经常用GetClientRect,GetWindowRect,还有鼠标单击位置等获取一些坐标,而这些坐标是设备坐标,要想让GDI用,首先应转化为逻辑坐标.
10.绘制图形,比如画线,画弧线,多边形,贝济埃样条等,还有路径,填充,区域,这些要想好好掌握,应该多实践.
11.位图,通过CBitmap类和CImage类提供的方法可以很轻松的完成位图的创建,销毁,加载,保存,显示,裁减,缩放以及像素的变换等.

 

原创粉丝点击