GDI 学习笔记之GDI 环境初始化

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

作者:朱金灿
来源:http://blog.csdn.net/clever101/


          尽管以前接触过一下GDI+,但决心从现在开始系统学习GDI+,所用的教材为《精通GDI编程》。在VS 2010以下版本的VS 编译器使用GDI+都需要对GDI+环境进行初始化操作(VS 2010中的MFC 10依赖GDI+,故不用初始化)。

    VS 2003、VS 2005和VS 2008的GDI+环境初始化操作步骤一样。


      在应用程序类添加一个保护权限的数据成员:

  1. ULONG_PTR m_gdiplusToken;  
ULONG_PTR m_gdiplusToken; 


在应用程序类的实现文件包含gdi+的头文件:


  1. #include <GdiPlus.h>  
#include <GdiPlus.h> 


在工程附加库加上:GdiPlus.lib


然后在应用程序类的InitInstance加上下面初始化代码:


  1. BOOL C***App::InitInstance()  
  2. {  
  3.     Gdiplus::GdiplusStartupInput StartupInput;  
  4.     GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);  
  5. }  
BOOL C***App::InitInstance(){ Gdiplus::GdiplusStartupInput StartupInput; GdiplusStartup(&m_gdiplusToken,&StartupInput,NULL);} 



     上面代码的作用是初始化GDI+资源。


  在应用程序类的InitInstance加上下面代码:


  1. int C***App::ExitInstance()  
  2. {  
  3.     // TODO: 在此添加专用代码和/或调用基类  
  4.       
  5.     Gdiplus::GdiplusShutdown(m_gdiplusToken);  
  6.     return __super::ExitInstance();  
  7. }  
int C***App::ExitInstance(){ // TODO: 在此添加专用代码和/或调用基类     Gdiplus::GdiplusShutdown(m_gdiplusToken); return __super::ExitInstance();} 



     上面代码的作用是销毁GDI+资源。


     VC 6.0中使用GDI+库,请参考这篇文章:在VC6.0中使用GDI+的两种办法


         现在测试一下我们初始化GDI+环境是否成功。我们使用GDI+的类接口在视图客户区绘制一个字符串,具体代码如下:


  1. CDC *pDC = pView->GetDC();  
  2. Gdiplus::Graphics graphics(pDC->m_hDC);  
  3. Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255));  
  4. Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255));  
  5. Gdiplus::FontFamily fontfm(L"宋体");  
  6. Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel);  
  7. CRect rt;  
  8. pView->GetClientRect(&rt);  
  9. Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);  
  10.    graphics.DrawString(L"GDI+程序示意",-1,&font,pointF,&brush);  
  11.    graphics.ReleaseHDC(pDC->m_hDC);  
  12.    pView->ReleaseDC(pDC);  
 CDC *pDC = pView->GetDC(); Gdiplus::Graphics graphics(pDC->m_hDC); Gdiplus::Pen pen(Gdiplus::Color(255,0,0,255)); Gdiplus::SolidBrush brush(Gdiplus::Color(255,0,0,255)); Gdiplus::FontFamily fontfm(L"宋体"); Gdiplus::Font font(&fontfm,24,Gdiplus::FontStyleRegular,Gdiplus::UnitPixel); CRect rt; pView->GetClientRect(&rt); Gdiplus::PointF pointF(rt.Width()/2,rt.Height()/2);    graphics.DrawString(L"GDI+程序示意",-1,&font,pointF,&brush);    graphics.ReleaseHDC(pDC->m_hDC);    pView->ReleaseDC(pDC); 



效果图如下:


gdiplus demo




使用GDI+一些注意事项:


1.在DLL中使用GDI+库,只需要包含GdiPlus.h和GdiPlus.lib,初始化GDI+环境的工作只需要在主调用程序做,否则在DLL初始化代码中初始化GDI+环境容易发生DLL重入的错误(以前我犯过这样的错误)。


2.GDI+接口参数使用的是unicode字符集,因为调用任何GDI+类接口时其字符串参数都必须确保是unicode字符。在多字节字符集环境下开发常量字符串可以通过L宏转换,变量多字节字符转unicode字符可以使用Windows API函数MultiByteToWideChar或ATL的A2W宏。


3. GDI+的对象和GDI句柄一样,同样会占用资源,一次使用过多的GDI+的对象甚至会发生程序崩溃的现象。因此必须随时将不必要的GDI+的对象占用的资源释放掉,如上例的:graphics.ReleaseHDC(pDC->m_hDC)。


























           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值