首页 > 代码库 > GDI+(1)--入门
GDI+(1)--入门
GDI+入门
摘要:最近在对以前的的项目进行优化,重新做了个面板,为了达到逼真的效果,界面面很多地方需要实现透明、半透明、镂空、分层、旋转等效果。在做UI的过程中,发现了很多GDI无法处理的问题,于是我转而结合使用GDI+。本文着重于GDI+入门介绍,同时也GDI与GDI+进行了对比。
GDI+与GDI一样都具有设备无关性。所以使用GDI+ 时候,我们无需考虑显示设备的具体情况(这一点跟DirectX有和大区别)。GDI+将应用程序和图形硬件隔离,正是这种隔离允许我们开发与设备无关的应用程序。
总的来讲GD I+在功能上要比GDI强大多了,而且在编码上也更加简洁。GDI+主要提供了三类功能:1)二维矢量图形,包括直线、曲线、图形等的绘制;2)图像处理,GDI+的图像处理功能比GDI强大的多;3)文字显示,GDI+的文本显示功能非常强大,GDI+的新功能是子像素消除锯齿,它使得字体的显示更加平滑。
DC是GDI中常用的一种结构,使用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环境中都需要以上配置,但是在MFC中GDI+环境都是默认打开的,不需要上述步骤就可直接使用(可能低版本VS中还是需要配置)。完成上述步骤后我们就可以使用GDI+了下面分别展示GDI和GDI+画一条简单的直线。
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); //红色画笔,Pen是GDI+对象
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+不支持图的位运算,那么就不能进行异或绘图等操作。而且在vc中GDI+也不存在双缓冲机制(内存DC及显示DC),这将大大影响GDI+在高速图形、图像及动画和视频等方面的应用。
通过以上讲解,大家对GDI+应该有了初步的了解。纸上得来终觉浅,绝知此事要躬行,想更加深入的学习与了解GDI+的强大功能,还是得自己多动手进行实践。
下一片将会继续讲解GDI+的使用。将会结合GDI+讲解图片的旋转。图片的旋转中也会涉及到界面的透明分层等知识。