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操作系统中存在着四个不同的空间,每个空间都有相互独立的坐标系,即四个坐标空间。
世界坐标空间(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
相关文章推荐
- GDI绘图(一)
- C语言Windows程序设计 -> 第九天 -> GDI绘图基础
- 【win32】day07-图形绘制/GDI绘图对象-画笔/画刷
- GDI高效绘图
- C++ GDI绘图程序框架模板
- c# GDI+简单绘图(一)
- GDI绘图步骤
- GDI_绘图
- GDI绘图基本步骤总结
- GDI绘图时导致的内存泄露
- C#学习笔记30——C# GDI+绘图
- C# GDI+ 简单绘图 (三)----QQ截图功能
- C#知识点-GDI绘图
- C# GDI+简单绘图(一)
- C语言Windows程序设计 -> 第九天 -> GDI绘图基础
- GDI绘图之画刷
- GDI绘图之指针时钟
- C++ GDI绘图程序框架模板
- c# GDI+简单绘图(二)
- MFC学习笔记——GDI绘图