GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。

GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,Windows XP仍然支持以前版本的GDI,但是在开发新应用程序的时候,开发人员为了满足图形输出需要应该使用GDI+,因为GDI+对以前的Windows版本中GDI进行了优化,并添加了许多新的功能。

作为图形设备接口的GDI+使得应用程序开发人员在输出屏幕和打印机信息的时候无需考虑具体显示设备的细节,他们只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离.从而使开发人员编写设备无关的应用程序变得非常容易。

GdiPlus使用方法:

开发工具:VS2008

1.新建对话框应用程序

2.拷贝 GdiPlus_Includes文件夹、Lib文件、gdiplus.dll文件 到应用程序中

3.在StdAfx.h文件中添加如下代码

//GDI+
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
//#include "c:\gdi+\includes\gdiplus.h"   请修改为你的头文件路径
//using namespace Gdiplus;
//#pragma comment(lib, "c:\\gdi+\\lib\\gdiplus.lib") 请修改为你的.lib文件路径
#include "../GdiPlus_Includes\\gdiplus.h"
using namespace Gdiplus;
#pragma comment(lib, "../GdiPlus_Lib\\gdiplus.lib")

4.在C**App.cpp文件的InitInstance()函数中

在C**Dlg dlg之前,添加如下代码:
    GdiplusStartupInput gdiplusStartupInput;ULONG_PTR           gdiplusToken;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

在dlg后,return前,添加如下代码:

    //关闭gdiplus的环境GdiplusShutdown(gdiplusToken);
如:
BOOL CGdiPlusDemoApp::InitInstance()
{// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControlsEx()。否则,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 标准初始化// 如果未使用这些功能并希望减小// 最终可执行文件的大小,则应移除下列// 不需要的特定初始化例程// 更改用于存储设置的注册表项// TODO: 应适当修改该字符串,// 例如修改为公司或组织名SetRegistryKey(_T("应用程序向导生成的本地应用程序"));GdiplusStartupInput gdiplusStartupInput;ULONG_PTR           gdiplusToken;GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);CGdiPlusDemoDlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置处理何时用//  “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){// TODO: 在此放置处理何时用//  “取消”来关闭对话框的代码}//关闭gdiplus的环境GdiplusShutdown(gdiplusToken);// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,//  而不是启动应用程序的消息泵。return FALSE;
}

5.C**Dlg操作

OnInitDialog:设置对话框位置和大小,获取资源信息
OnPaint:画图
头文件
private:Image *m_pImageBackground;int m_nBackgroundWidth, m_nBackgroundHeight;Image *m_pImagePic;int m_nPicWidth, m_nPicHeight;private:void MyInitDialog();void InitUi();//设置界面初始化信息void GetImageSource();//获取图片信息void MyPaint();void DrawBackground(HDC hDC);//绘制背景void DrawPic(HDC hDC);//绘制图片//获取图片信息BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR, Image *&pImg);BOOL ImageFromIDResource(CString sFilePathName, Image *&pImg);

源文件

void CGdiPlusDemoDlg::MyInitDialog()
{InitUi();GetImageSource();
}void CGdiPlusDemoDlg::MyPaint()
{CPaintDC dc(this); CRect rcClient;GetClientRect(&rcClient);CDC dcMem;CBitmap bmpMem;dcMem.CreateCompatibleDC(&dc);if(bmpMem.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height())){CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);CWnd::DefWindowProc(WM_PAINT,(WPARAM)dcMem.m_hDC,0);DrawBackground(dcMem.m_hDC);DrawPic(dcMem.m_hDC);dc.BitBlt(0,0,rcClient.right,rcClient.bottom,&dcMem,0,0,SRCCOPY);dcMem.SelectObject(pOldBmp);bmpMem.DeleteObject();}dcMem.DeleteDC();
}void CGdiPlusDemoDlg::InitUi()
{//对话框背景图片宽和高const int nBkBmpWidth  = 800;const int nBkBmpHeight = 450;//获得电脑显示器的像素宽度和像素高度int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth; int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;int nWidth = 0;   int nHeight = 0;    if(ax <= 0){        ax =0; }else{      ax = ax/2; }if(ay <=0 ){       ay =0; }else{      ay = ay/2; }RECT clientRect;clientRect.left = ax;clientRect.top = ay;clientRect.right = clientRect.left + nBkBmpWidth;clientRect.bottom = clientRect.top + nBkBmpHeight;MoveWindow(&clientRect);
}void CGdiPlusDemoDlg::GetImageSource()
{ImageFromIDResource(IDB_PNG_BG,_T("PNG"),m_pImageBackground);m_nBackgroundWidth  = m_pImageBackground->GetWidth();m_nBackgroundHeight = m_pImageBackground->GetHeight();CString sPath = _T("res\\hd.png");ImageFromIDResource(sPath,m_pImagePic);//ImageFromIDResource(IDB_PNG_HD,_T("PNG"),m_pImagePic);m_nPicWidth  = m_pImagePic->GetWidth();m_nPicHeight = m_pImagePic->GetHeight();
}void CGdiPlusDemoDlg::DrawBackground(HDC hDC)
{RECT rct;GetWindowRect(&rct);POINT ptWinPos={rct.left,rct.top};Graphics graph(hDC);Point points[] = { Point(0, 0), Point(m_nBackgroundWidth, 0), Point(0, m_nBackgroundHeight),};graph.DrawImage(m_pImageBackground, points, 3);graph.ReleaseHDC(hDC);
}void CGdiPlusDemoDlg::DrawPic(HDC hDC)
{RECT rct;GetWindowRect(&rct);POINT ptWinPos={rct.left,rct.top};Graphics graph(hDC);int nHorOffset = 50;int nVerOffset = 50;Point points[] = { Point(nHorOffset, nVerOffset), Point(nHorOffset+m_nPicWidth, nVerOffset), Point(nHorOffset, nVerOffset+m_nPicHeight),};graph.DrawImage(m_pImagePic, points, 3);graph.ReleaseHDC(hDC);
}BOOL CGdiPlusDemoDlg::ImageFromIDResource(UINT nID, LPCTSTR sTR, Image *&pImg)
{HINSTANCE hInst = AfxGetResourceHandle();HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // typeif (!hRsrc)return FALSE;// load resource into memoryDWORD len = SizeofResource(hInst, hRsrc);BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);if (!lpRsrc)return FALSE;// Allocate global memory on which to create streamHGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);BYTE* pmem = (BYTE*)GlobalLock(m_hMem);memcpy(pmem,lpRsrc,len);IStream* pstm;CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);// load from streampImg=Gdiplus::Image::FromStream(pstm);// free/release stuffGlobalUnlock(m_hMem);pstm->Release();FreeResource(lpRsrc);return TRUE;
}BOOL CGdiPlusDemoDlg::ImageFromIDResource(CString sFilePathName, Image *&pImg)
{// load file into memoryDWORD len = 0;HANDLE hFile;DWORD  size1,readbyte;hFile=CreateFile(sFilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);if(INVALID_HANDLE_VALUE == hFile){return FALSE;}len=GetFileSize(hFile,&size1);if(0xFFFFFFFF == len){CloseHandle(hFile);return FALSE;}// Allocate global memory on which to create streamHGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);BYTE* pmem = (BYTE*)GlobalLock(m_hMem);ReadFile(hFile,pmem,len,&readbyte,NULL);IStream* pstm;CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);// load from streampImg=Gdiplus::Image::FromStream(pstm);// free/release stuffGlobalUnlock(m_hMem);pstm->Release();return TRUE;
}

工程

  
运行效果
源码下载

GdiPlus使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法

    这包括: //属性 IGPBitmap.Pixels; { 获取或设置指定像素的颜色 }//方法 IGPBitmap.SetResolution(); { 设置分辨率 } IGPBitmap.GetH ...

  4. 无法启动此程序因为计算机丢失gdiplus,处理系统提示无法启动此程序,因为计算机中丢失gdiplus.dll的方法...

    在使用计算机的时候经常会出现某某文件丢失的情况,有位用户在使用电脑的时候就有遇到系统提示:"无法启动此程序,因为计算机中丢失gdiplus.dll.尝试重新安装该程序以解决此问题." ...

  5. 计算机中丢失gdiplus.dll 解决方法 适用windows 2000.

    笔者遇到问题如下: 由于需要用到Windows2000运行某些软件,所以在虚拟机里安装了一个Windows2000,msdn 我告诉你 下载后安装ULtraedit32 版本V17 china 站长 ...

  6. 一种使用GDI+对图片尺寸和质量的压缩方法

    今天同事向我询问图片压缩的算法,我想起大概两三年前做过的一个项目.其中包含了尺寸和质量两种压缩算法,并且支持JPEG.bmp.PNG等格式.今天把这段逻辑贴出来,供大家参考.(转载请指明来源于brea ...

  7. GdiPlus[6]: 五种画刷总览

    为什么80%的码农都做不了架构师?>>>    GDI+ 有五种画刷: 实心画刷: IGPSolidBrush 阴影画刷: IGPHatchBrush 纹理画刷: IGPTextur ...

  8. GdiPlus[44]: IGPGraphics (三) 关于文本绘制续 - IGPStringFormat

    IGPStringFormat 的方法和属性: //方法: IGPStringFormat.GetTabStops(); { 获取制表位 } IGPStringFormat.SetTabStops() ...

  9. GdiPlus[59]: 图像(十一) IGPImageAttributes 之颜色矩阵(TGPColorMatrix)变换

    IGPMatrix 矩阵 是个接口, 要通过 TGPMatrix 实例化后使用, 其内置了很多方法和属性. TGPColorMatrix 只是一个结构体, 除了矩阵数据(5*5)外, 它只有一个方法: ...

  10. 看看我最关心的动态库中到底有多少函数 - gdiplus.dll

    获取方法: 运行: tdump.exe C:\windows\system32\gdiplus.dll c:\temp\gdiplus.txt GdipAddPathArc GdipAddPathAr ...

最新文章

  1. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)
  2. C#跨平台物联网通讯框架ServerSuperIO(SSIO)
  3. 注意一些坑,从app跳转到qq聊天界面。
  4. 20181220 Oracle程序包基本开发逻辑
  5. 数据库乱码,频繁中断
  6. [2005.04.28 13:36:04] 孤岛热浪的联想
  7. Nmap小技巧——探测大网络空间、局域网中的存活主机
  8. Python机器学习:基于西瓜数据集的KNN算法实现
  9. 跑跑卡丁车rush服务器维护,跑跑卡丁车rush+每日必做事情整理得丰富奖励
  10. 双机串行通讯实验c语言编程,51单片机编程:教你实现双机串行通信功能
  11. BOC保护的色氨酸卟啉化合物(TAPP-Trp-BOC)桃红色固体162.8mg供应-齐岳供应
  12. 如何将git上项目在本地跑起来
  13. Unity URP入门实战
  14. matlab cui,阻力汽车论文,关于基于Matlab-CUI的汽车动力性相关参考文献资料-免费论文范文...
  15. 计算机排名2018全国,2018全国90所计算机专业大学排名,分为ABC三个等级
  16. How to deactive Virus scan via view IWFNDCCONFIG
  17. 蒙氏计算机教育目的,蒙氏五大领域的内容及目的
  18. 【图像处理中的数学修炼(第1版)】总纲:详解图像背后的数学原理
  19. 打印数字图形(for循环排版)
  20. 合作升级!阿里宣布入股哔哩哔哩2400万股,占比8%

热门文章

  1. 软考初级程序员真题资料(2009年上半年——2019年上半年)
  2. 电子设计大赛简易自动入库小车设计
  3. 使用Echarts实现中国地图,官方china.js文件
  4. 最强大的数据恢复软件
  5. vc++6.0常用插件和界面库
  6. 批发表情包,掏出了python 3分钟爬取表情包素材,分享给你
  7. Visual Basic 2010中文版从入门到精通pdf
  8. java IO 测试题
  9. EdrawMax使用方法
  10. java基于SSM的宠物医院信息管理系统