您的位置:首页 > 其它

GDI绘图

2011-05-14 21:53 155 查看
▲坐标空间

坐标用以确定图形在确定空间中的位置,在windows操作系统中存在着四个不同的空间,每个空间都有相互独立的坐标系,即四个坐标空间。

世界坐标空间(World-Space):支持几何变换。只有调用SetWorldTransform函数才会使用世界坐标空间。

页面坐标空间(Page-Space):被默认使用的坐标空间。

设备坐标空间(Device-Space):同设备上下文相关联的设备空间。可以表示物理设备的一小块或者整个物理设备。
物理设备坐标空间(Physical-Device Space):图形设备的物理表面的部分或全部,是图形驱动程序所使用的坐标空间。该空间完全由系统管理。

世界坐标空间和页面坐标空间统称为逻辑坐标空间,是GDI用户所能够直接使用的坐标空间。也就是说进行GDI输出时,你所指定的位置、大小等信息只能是相对于逻辑坐标空间的数据。

 



 

 

▲绘图过程

前提:获取DC(即与输出设备上输出区域相关的设备描述表,包括了相关的坐标空间)

1.绘图指令(作用于窗口,采用逻辑单位)

      ↓ (按指定映射模式)

2.图形映射至设备空间(作用于视口,采用设备单位)

      ↓ (系统内部管理)

3.图形映射至物理设备空间(显示在输出设备上)

 

▲映射模式

映射模式指定了窗口中使用的是那一种逻辑单位,以及原点位置和Y轴的方向。缺省的映射模式为MM_TEXT,此时逻辑单位为像素,原点在窗口左上角,Y轴方向向下为正。

SetMapMode(...)    //改变映射模式

 

▲坐标原点、范围



在输出设备上,输出区域的左上角始终是(0,0)。窗口与视口的原点、范围始终是相对于输出设备上输出区域的左上角而言的。默认情况下,窗口与视口的原点就在输出区域的左上角,窗口与视口的范围相等。

 

SetWindowOrgEx(...)     //设置窗口原点

GetWindowOrgEx(...)    //获得窗口原点

SetViewportOrgEx(...)    //设置视口原点

GetViewportOrgtEx(...)    // 获得视口原点

---------------------------------------------------

SetWindowExtEx(...)     //设置窗口范围

GetWindowExtEx(...)    //获得窗口范围

SetViewportExtEx(...)    //设置视口范围

GetViewportExtEx(...)    // 获得视口范围

 

▲坐标值的转换

以X轴为例,逻辑(窗口)坐标xL转换为设备(视口)坐标xD公式:

                                            视口X轴范围

xD = (
xL- 窗口X轴原点


×
▬▬▬▬▬▬▬
 + 视口X轴原点

                                            窗口X轴范围

LPtoDP(...)    //将逻辑坐标值转换为设备坐标值

DPtoLP(...)    //将设备坐标值转换为逻辑坐标值

 

▲获取DC/释放DC

GetDC/ReleaseDC

CClientDC dc(this)    //CClientDC类实例化对象,析构时自动释放DC

CWindowDC dc(this)   //CWindowDC实例化对象,可获得整个窗口(客户区+非客户区)DC,析构时自动释放DC

CWindowDC dc(GetDesktopWindow())       //获得整个屏幕DC

 

▲画笔

CPen pen(...)         //创建画笔对象,设置画笔线型,粗细,颜色

SelectObject(pen)    //将画笔选入DC中

 

▲画刷

CBrush brush(...)      //创建画刷对象,设置画刷颜色
 

/////////////////////////

CBitmap bitmap                 //创建位图对象

bitmap.LoadBitmap(...)      //初始化位图对象

CBrush brush(&bitmap)     //创建位图画刷

////////////////////////

CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH))   //获得透明画刷

 

▲绘图命令

SetPixel(...)     //按指定的颜色在指定位置画点

----------------------------------------------------

MoveTo(...)    //设置直线起点

LineTo(...)      //设置直线终点

---------------------------------------------------

Rectangle(...)   //画矩形

----------------------------------------------------

Ellipse(...)      //画圆/椭圆

 

▲绘画模式

SetROP2(...)     //设置画图模式  

 

▲CMetaFileDC(元文件DC)

MetaFileDC对象可以容纳一连串的GDI命令,当需要的时候可以在DC中播放元文件,即按照元文件中的GDI序列在DC中作图。

一般使用步骤:

CMetaFileDC mfdc;       //实例化CMetaFileDC对象

mfdc.Create();             //初始化

mfdc.Rectangle(...);     //向元文件DC对象输出GDI命令

...

HMETAFILE hmf;          //定义元文件句柄

hmf=mfdc.Close();      //关闭元文件DC对象并返回元文件句柄

dc.PlayMetaFile(hmf);  //通过播放元文件在DC中作图

DeleteMetaFile(hmf);   //释放元文件句柄

CMetaFileDC是CDC的子类,因此可以在元文件DC对象中播放元文件以再现之前元文件DC对象中的GDI命令。

-----------------------------------------------------------

元文件的存取

CopyMetaFile(...)    //将元文件保存到磁盘上的指定文件中

GetMetaFile(...)       //从磁盘上的指定文件中获取元文件

 

▲兼容DC(CompatibleDC)
当获取到目的DC后,可以在内存中创建一个与获取的DC相兼容的DC,即兼容DC。对兼容DC的操作不会影响到目的DC,且对兼容DC进行GDI输出操作前,必须将一幅位图选择进兼容DC,此时兼容DC的尺寸与位图尺寸一致。当创建兼容DC时,系统自动为其选择一幅大小为1*1的单色块位图。

CClientDC dc(this);                  //获取目的DC

CDC compdc;

compdc.CreateCompatibleDC(&dc);  //创建与目的DC相兼容的DC

CBitMap bitmap;

bitmap.CreateCompatibleBitmap(&dc...);  //创建兼容位图

compdc.SelectObject(&bitmap);     //将兼容位图选进兼容DC

compdc.BitBlt(...&dc...);   //因兼容位图没有颜色信息,需将目的DC颜色信息拷贝进兼容DC

compdc.TextOut(...);      //在兼容DC中输出

...

dc.BitBlt(...&compdc...);  //将兼容DC中内容拷贝至目的DC

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图形 磁盘 windows null