GDI+编程模块
1、只有Graphics 对象使用设备环境或句柄
Graphics 对象是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。
Graphics 对象与设备环境句柄还存在着联系,
其余的如 Pen、Brush、Image 和 Font 等对象均不再使用设备环境。
2、绘图方式
GDI 绘制该直线的代码:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPen newPen( PS_SOLID, 3, RGB(255, 0, 0) );
CPen* pOldPen = pDC->SelectObject( &newPen );
pDC->MoveTo( 20, 10 );
pDC->LineTo( 200, 100);
pDC->SelectObject( pOldPen );
}
(1) GDI 中需要先创建一个 CPen(画笔)对象,然后通过 SelectObject 将该画笔选入到设备环境(pDC)中
(2) GDI 画完后需要恢复设备环境中原来的GDI 对象
GDI+绘制该直线的代码:
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
using namespace Gdiplus; // 使用名称空间
Graphics graphics( pDC->m_hDC );
Pen newPen( Color( 255, 0, 0 ), 3 );
graphics.DrawLine(&newPen, 20, 10, 200, 100);
}
(1)GDI+使用 Graphics 类将 pDC 设备环境传入 Graphics 对象
(2)然后创建 Pen 类对象
(3)最后调用相应的画线方法,将Pen指针作为参数传入。由于 Pen 和设备环境是
相互独立的,因而不需要像 GDI 那样恢复设备环境中原来的设置
GDI 与GDI+ 绘图区别
(1)Graphics 绘图方法直接将 Pen、Brush、Path、Image 和 Font等对象作为自己的参数
(2)GDI 中画直线时先设置起始点,MoveTo(); 再设置结束点,通过LineTo 画直线,画线结束后再将结束点 设置成起始点。GDI+ 中直接在 DrawLine 中指定直线起止点的坐标。
(3)GDI中形状轮廓绘制和填充使用同一个绘图函数,如Rectangle;GDI+将形状轮廓绘制和填充操作分开而 采用不同的方法DrawRectangle 和 FillRectangle
(4)GDI CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn 和 CreatePolyPolygonRgn 等来创建区域;GDI+简化一般区域创建的方法,而将更复杂的区域创建交由 Path 接管。由于 Path 对象是与设备环境分离开来的,因而可以直接在 Region 构造函数中加以指定。
3、 坐标空间及其变换
1. 世界坐标系、设备坐标系和页面坐标系
(1)"世界坐标系"是应用程序用来进行图形输入输出所使用的一种与设备无关的笛卡尔坐
标系。通常,我们可以根据自己的需要和方便定义一个自己的世界坐标系,这个坐标系称为
用户坐标系。例如,前面"DrawLine(&newPen, 20, 10, 200, 100);"中的坐标都是以这个用户
坐标系为基准的,默认时使用像素为单位。
(2)"设备坐标系"是指显示设备或打印设备坐标系下的坐标,它的特点是以设备上的象素点
为单位。对于窗口中的视图而言,设备坐标的原点在客户区的左上角,x 坐标从左向右递增,
y 坐标自上而下递增。由于设备的分辨率不同,相同坐标值的物理位置可能不同。如对于边
长为 100 的正方形,当显示器为 640 x 480 和 800 x 600 时的大小是不一样的。
(3)"页面坐标系"是指某种映射模式下的一种坐标系。所谓映射是指将世界坐标系通过某种
方式进行的变换。默认时,设备坐标和页面坐标是一致的
2. 坐标映射和坐标原点的设置
(1)SetPageUnit 和 GetPageUnit 设置和获取每个单位所对应的实际度量单位
UnitDisplay – 每个页面单位为 1/75 英寸;
UnitPixel – 每个页面单位为 1 个像素,此时页面坐标与设备坐标相同;
UnitPoint – 每个页面单位为 1/72 英寸;
UnitInch – 每个页面单位为 1 英寸;
UnitDocument – 每个页面单位为 1/300 英寸;
UnitMillimeter-- 每个页面单位为 1 毫米。
Graphics graphics( dc.m_hDC );
graphics.SetPageUnit(UnitMillimeter);
(2)SetPageScale 和 GetPageScale 设置和获取页面的缩放比例
graphics.SetPageUnit(UnitMillimeter);
graphics.SetPageScale( (REAL)0.1);
(3)TranslateTransform 方法用来改变坐标的原点位置,
例如TranslateTransform(100, 50)是将坐标原点移到点(100,50)。