GDI+入门

一、GDI简介
     GDI是位于停用程序与不同硬件之间的中间层。这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件中的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性香格里,使WINDOWS应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。GDI+则是GDI的增强版本,对GDI进行了很大的改进。GDI+允许你创建独立于设备的应用程序,也就是说不用考虑应用程序将在什么样的硬件上运行。

二、GDI+的编程模式变化
     "GDI used a stateful model.whereas GDI+ uses a stateless"---GDI是有状态的,而GDI+是无状态的。
1、不再使用设备环境或句柄
     使用GDI+绘图时vubi像GDI那样指定一个环境设备(DC),取而代之是使用Graphics对象。Graphics对象与一个设备环境句柄存在联系(HDC),而其余的Pen、Brush、Image和Font等对象则不再使用环境设备。
2、对象是图形对象独立的
     画笔等对象与用于提供绘制方法的图形对象分别创建与维护,Graphics绘图方法直接将Pen对象作为参数哦,从而避免了使用SelectObject进行繁琐的切换。
3、取消“当前位置”
     GDI+绘图取消了GDI中的默认的“当前位置”,直接在DrawLine中指定了直线起止点的坐标。
4、绘制与填充
     在GDI中,形状轮廓绘制和填充使用的是同一个函数,例如Rectangle,无论我们是否需要填充绘制的图形,都需要分别指定一个画笔和一个画刷。而GDI+中轮廓的绘制和填充则分为了不同的方法,例如DrawRectangle和FillRectangle分别用来绘制和填充矩形。
5、多图片格式的支持
     GDI+提供了对各种图片的打开和存储功能。通过GDI+,我们能够直接将一幅BMP文件存储成JPG或其他格式的图片文件。

三、在VS中使用GDI+
1.添加GDI+的支持
//引入GDI+头文件
#incldue "gdiplus.h"
//使用GDI+的命名空间
using namespace Gdiplus;
2.添加成员变量
//全局变量,用来作为GDI+标识,在关闭时使用。
ULONG_PTR gdiplusToken;
3.重写ExitInstance,添加GDI+的关闭代码:
GdiplusShutdown(gdiplusToken);
4.重写InitInstance,添加GDI+的初始化代码:
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken,&gdiplusStartInput,NULL);

四、GDI+例子
1.使用GDI+输出文本
//获取窗口句柄
CDC *pDC = GetDC();
HDC hDlgDC = pDC->m_hDC;
//建立Graohics对象
Graphics graphics(hDlgDC);
//建立画笔、画刷、字体等对象
Pen pen(Color(255,0,0,255));
SolidBrush brush(Color(255,0,0,255));
FontFamily fontFamily(_T("宋体"));
Font font(&fontFamily,24,FontStyleRegular,UnitPixel);
//在窗口中间输出文本
CRect rect;
GetClientRect(&rect);
PointF pointF(rect.right/2,rect.botton/2);
graphics.DrawString(_T("GDI+程序示意",-1,&font,pointF,&brush));

2.在打印机中进行GDI+操作
void CGDISINGLEView::OnPrintOut()
{
     RedrawWindow();
     DOCINFO docInfo;

     //清空文档信息
     ZeroMemory(&docInfo,sizeof(DOCINFO));     
     docInfo.cbSize = sizeof(DOCINFO);     

     //打印文档名
     docInfo.lpszDocName = _T("GdiplusPrint");

     //建立打印对话框
     PRINTDLG printDlg;
     ZeroMemory(&printDlg, sizeof(PRINTDLG));
     printDlg.lStructSize = sizeof(PRINTDLG);

     //需要返回DC
     printDlg.Flags = PD_RETURNDC;

     //显示打印对话框
     if (!PrintDlg(&printDlg))
    {
     AfxMessageBox(_T("建立打印对话框失败"));
     return;
     }
     else
     {
          //使用由打印对话框返回的设备环境句柄进行GDI+的所有操作
          //开始记录文档
          StartDoc(printDlg.hDC, &docInfo);
          StartPage(printDlg.hDC);
          //使用打印机设备环境句柄建立绘图平面类
          Graphics graphics(printDlg.hDC);
          //以下所有的输出都在打印机设备句柄中进行
          //加载图片
          Image image(L"sonnic.bmp");
          //绘制图片
          graphics.DrawImage(&image, 0.0f, 0.0f);

          Pen pen(Color(255,0,0,0));
          //画矩形
          graphics.DrawRectangle(&pen,200,500,200,150);
          //画椭圆
          graphics.DrawEllipse(&pen,200,500,200,150);
          //画直线
          graphics.DrawLine(&pen,200,500,400,650);
          //开始打印
          EndPage(printDlg.hDC);
          EndDoc(printDlg.hDC);
          }

          //释放打印资源
          if (printDlg.hDevMode)
          GlobalFree(printDlg.hDevMode);
          if (printDlg.hDevNames)
          GlobalFree(printDlg.hDevNames);
          if (printDlg.hDC)
          GlobalFree(printDlg.hDC);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值