博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDI绘图
阅读量:4110 次
发布时间:2019-05-25

本文共 2963 字,大约阅读时间需要 9 分钟。

▲坐标空间

坐标用以确定图形在确定空间中的位置,在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

转载地址:http://qqosi.baihongyu.com/

你可能感兴趣的文章
WebRequest post读取源码
查看>>
使用TcpClient可避免HttpWebRequest的常见错误
查看>>
EntityFramework 学习之一 —— 模型概述与环境搭建 .
查看>>
C# 发HTTP请求
查看>>
初试visual studio2012的新型数据库LocalDB
查看>>
启动 LocalDB 和连接到 LocalDB
查看>>
Palindrome Number --回文整数
查看>>
Reverse Integer--反转整数
查看>>
Container With Most Water --装最多水的容器(重)
查看>>
Longest Common Prefix -最长公共前缀
查看>>
Letter Combinations of a Phone Number
查看>>
Single Number II --出现一次的数(重)
查看>>
Valid Parentheses --括号匹配
查看>>
Generate Parentheses--生成匹配括号(重)
查看>>
Remove Element--原地移除重复元素
查看>>
Remove Duplicates from Sorted Array--从有序数组中移除重复元素
查看>>
Count and Say
查看>>
Gas Station
查看>>
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
Valid Palindrome 简单的回文判断
查看>>