当前位置:编程学习 > C/C++ >>

关于GDI+

转载请注明出处

作者:小马

 

一 介绍
其实本人对GDI+不能算是专家,只是在几个小项目中应用了一些而已, 算是入门了. 刚好最近有点时间, 把自己掌握的东东做个总结.

 

如果你以前用过GDI, 那么恭喜你,因为你转到GDI+易如反掌. 如果你没用过GDI,那么也恭喜你, 因为你可以直接学GDI+,不用经历学习GDI的那种痛苦. 因为GDI+相对于GDI,更加抽象,更加上层, 隐藏了更多底层的东西, 整体架构更加清晰明了.

 

GDI+通过c++ class的形式对外引出接口, 程序员直接调用这些接口来完成相应的功能. 共有40个相关的类, 50个枚举常量和6个结构体. 它的局限性是只能运行在windows XP和windows server2003的系统上.

 

简单说几个GDI+与GDI不同的地方.
1 GDI+很重要一个改进就是增了对多种图像格式的支持.它目前支持下面几中格式的图像:
BMP
Graphics Interchange Format (GIF)
JPEG
 Exif
 PNG
TIFF
ICON
WMF
EMF


2 DC(设备环境内容)的概念变得模糊,基本对程序员是透明了.
用GDI的人都知道, 不懂DC可不行, 这个DC保存着显示设备的属性和功能信息, 每当你想要drawing时, 你得先获取DC的句柄, 然后把这个句柄作为参数传给GDI的API, 另外还要考虑关于”选到设备(selectObjec),释放设备”等繁琐的操作.
GDI+对方面的处理简单明了很多,它有一个Graphics类,一个Graphics的对象就类似于DC的角色, 而且它跟pen,brush等的关系也变得独立, 不用再”选来选去”, 在GDI+里,像pen,brush这些东西都是独立的对象,用的时候只需把它们的实例作为参数传给Graphics的接口就可以了(在下面的示例中会看到).


3 增加了对渐变颜色效果的支持.
原来在GDI里做渐变效果, 那叫一复杂呀. 下面的示例中会具体说说GDI+里的渐变.


二 应用


前期准备

使用GDI+, 首先要包含相关的头文件, 只有一个,如下:
#include <gdiplus.h>
gdiplus.h这个文件vs2005的include目录下, 所以在vs2005下, 你可以直接以”<>”的形式包含.

还需要用到一个lib, 就是Gdiplus.lib, 你可以在源文件中通过
#pragma comment (lib,"Gdiplus.lib")
的形式链接进来, 也可以直接在”项目属性-linker-input里添加, 效果是一样的.


为了不使GDI+专用的相关类,常量,结构体与其它应用混淆,GDI+有自己的命名空间, 叫Gdiplus, 当你要用到GDI+的相关API时,就要用到下面的语句:
using namespace Gdiplus;


最后, GDI+有个应用开关, GdiplusStartup和GdiplusShutdown, 一个开,一个关, 使用GDI+任何功能前,先调用GdiplusStartup,程序结束时,调用GdiplusShutdown关闭. 比如在基于mfc的对话框应用中, 我一般这样做, 假设我的工程为MyGDIPlusTest, 首先在MyGDIPlusTest.cpp的InitInstance函数中打开GDI+,如下:
…..
CWinApp::InitInstance();
GdiplusStartup(&m_gdiPlusToken, &m_gdiPlusStartupInput, NULL);
…..
然后重载ExitInstance函数, 在这个函数里关闭GDI+
GdiplusShutdown(m_gdiPlusToken);//程序退出时关闭
return CWinApp::ExitInstance();

两个函数的参数,自己去查吧 ,不说了.

 

示例
1 先看一个msdn中的示例


view plaincopy to clipboardprint?#include <stdafx.h>  
#include <windows.h>  
#include <objidl.h>  
#include <gdiplus.h>  
using namespace Gdiplus; 
#pragma comment (lib,"Gdiplus.lib")  
 
VOID OnPaint(HDC hdc) 

   Graphics graphics(hdc); 
   Pen      pen(Color(255, 0, 0, 255)); 
   graphics.DrawLine(&pen, 0, 0, 200, 100); 

 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
 
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) 

   HWND                hWnd; 
   MSG                 msg; 
   WNDCLASS            wndClass; 
   GdiplusStartupInput gdiplusStartupInput; 
   ULONG_PTR           gdiplusToken; 
    
   // Initialize GDI+.  
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 
    
   wndClass.style          = CS_HREDRAW | CS_VREDRAW; 
   wndClass.lpfnWndProc    = WndProc; 
   wndClass.cbClsExtra     = 0; 
   wndClass.cbWndExtra     = 0; 
   wndClass.hInstance      = hInstance; 
   wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION); 
   wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW); 
   wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH); 
   wndClass.lpszMenuName   = NULL; 
   wndClass.lpszClassName  = TEXT("GettingStarted"); 
    
   RegisterClass(&wndClass); 
    
   hWnd = CreateWindow( 
      TEXT("GettingStarted"),   // window class name  
      TEXT("Getting Started"),  // window caption  
      WS_OVERLAPPEDWINDOW,      // window style  
      CW_USEDEFAULT,            // initial x position  
      CW_USEDEFAULT,            // initial y position  
      CW_USEDEFAULT,            // initial x size  
      CW_USEDEFAULT,            // initial y size  
      NULL,                     // parent window handle  
      NULL,                     // window menu handle  
      hInstance,                // program instance handle  
      NULL);                    // creation parameters  
    
   ShowWindow(hWnd, iCmdShow); 
   UpdateWindow(hWnd); 
    
   while(GetMessage(&msg, NULL, 0, 0)) 
   { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
   } 
    
   GdiplusShutdown(gdiplusToken); 
   return msg.wParam; 
}  // WinMain  
 
LRESULT C

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,