首页 > 代码库 > GDI+(1)--入门

GDI+(1)--入门

GDI+入门

摘要:最近在对以前的的项目进行优化,重新做了个面板,为了达到逼真的效果,界面面很多地方需要实现透明、半透明、镂空、分层、旋转等效果。在做UI的过程中,发现了很多GDI无法处理的问题,于是我转而结合使用GDI+。本文着重于GDI+入门介绍,同时也GDIGDI+进行了对比。

GDI+GDI一样都具有设备无关性。所以使用GDI+ 时候,我们无需考虑显示设备的具体情况(这一点跟DirectX有和大区别)。GDI+将应用程序和图形硬件隔离,正是这种隔离允许我们开发与设备无关的应用程序。

总的来讲GD I+在功能上要比GDI强大多了,而且在编码上也更加简洁。GDI+主要提供了三类功能:1)二维矢量图形,包括直线、曲线、图形等的绘制;2)图像处理,GDI+的图像处理功能比GDI强大的多;3)文字显示,GDI+的文本显示功能非常强大,GDI+的新功能是子像素消除锯齿,它使得字体的显示更加平滑。

DCGDI中常用的一种结构,使用GDI绘图,必须先获取DC句柄。在GDI+中我们不需要直接使用句柄或者设备上下文,而是使用HDC创建一个Graphics对象,然后用面像对象的方法调用其中的方法进行绘图。使用GDI+首先需要导入GDI+库和包含相应头文件如下:

//use GDIPlus

#include <GdiPlus.h>

#include <GdiPlusInit.h>

#pragma comment(lib, "gdiplus.lib ") //也可以在项目属性中配置导入gdiplus.lib

using namespace Gdiplus;

初始化GDI+环境:

private:

ULONG_PTR  m_gdiplusToken;       

构造函数中

GdiplusStartupInput StartupInput;  

GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL); 

最后别忘了关闭:

析构函数中 :

GdiplusShutdown(m_gdiplusToken);

当然在哪儿打开和关闭GDI+环境视情况而定吧,不一定在构造或者析构函数中。

在一般的Windows环境中都需要以上配置,但是在MFCGDI+环境都是默认打开的,不需要上述步骤就可直接使用(可能低版本VS中还是需要配置)。完成上述步骤后我们就可以使用GDI+了下面分别展示GDIGDI+画一条简单的直线。

GDI API画线,使用Win32API: 

HDC hdc = GetDC(m_hWnd);

HPEN hPen;

hPen = CreatePen(PS_SOLID, 3, RGB(255, 0, 0));//创建红色画-笔宽为3像素

HGDIOBJ hOldObj =  SelectObject(hdc, hPen);//

MoveToEx(hdc, 20, 10, NULL);

LineTo(hdc, 200, 100);

SelectObject(hdc, hOldObj); //选入旧画笔, 移除当前画笔

DeleteObject(hPen);

 

GDI+画线:

HDC hdc = ::GetDC(m_hWnd); //DC句柄

Pen pen(Color::Red, 3); //红色画笔,PenGDI+对象

Graphics g(hdc);//创建Graphics对象

g.DrawLine(&pen, 20, 10, 200, 100);//直接调用画-线方

对比可发现GDI+GDI更简洁,Graphics类是GDI+绘图的核心类。通常在用GDI画曲线或者一些不规则形状时候会发现线条锯齿很严重,在GDI+中可以利用Graphics类中的平滑模式成员函数SetSmoothingMode(SmoothingMode smoothingMode)来设置绘图时候的平滑处理。

本文简单介绍了一些GDI+的特点及应用。虽然相GDl来说,GDI+确实增加了许多新的特性,而且功能很强大。但是,这并不等于GDI+就能完全替代GDI。实际上GDI+GDI的封装和扩展,GDI+的执行效率一般来说要低于GDI的,然而就我使用经验而言,GDI+在对三十二位图像处理上比GDI效率高。GDI+不支持图的位运算,那么就不能进行异或绘图等操作。而且在vcGDI+也不存在双缓冲机制(内存DC及显示DC),这将大大影响GDI+在高速图形、图像及动画和视频等方面的应用。

通过以上讲解,大家对GDI+应该有了初步的了解。纸上得来终觉浅,绝知此事要躬行,想更加深入的学习与了解GDI+的强大功能,还是得自己多动手进行实践。

下一片将会继续讲解GDI+的使用。将会结合GDI+讲解图片的旋转。图片的旋转中也会涉及到界面的透明分层等知识。