浅谈GDI编程正确方法

转载 2015年11月18日 21:47:36

本文不打算告诉大家什么叫GDI,各种GDI函数的作用是什么,有关详细的GDI知识可以去以下网站查看。http://www.panshy.com/articles/dev-66_3.html在这里只是让大家知道如何正确使用GDI,并且查找GDI资源占用问题,也就是类似C++中new完后不delete一样,会把系统资源消耗光,GDI资源也是有限的,消耗太多窗体会卡,还会伴有黑色的现象或者是别的窗体贴在本窗体上等效果。

原文地址:http://c.panshy.com/thread-4-1-1.html


首先让大家来看看一般GDI都有哪些函数,这里只列出贴图和双缓冲用得到的函数:

GetWindowDC 获取整个窗体的DC,包含标题栏这种非客区
GetDC获取窗体的客户区的DC,就是窗体能放控件的地方
CreateCompatibleDC 创建兼容DC
SelectObject选入某一GDI对象到DC中,返回DC中原有的对象
DeleteObject删除对象
ReleaseDC释放DC
DeleteDC删除DC
。。。。
以上函数CreateCompatibleDC与DeleteDC 一对、GetWindowDC - GetDC与ReleaseDC一对、SelectObject与DeleteObject一对
现在介绍以上函数正确使用方法,实例是将内存中的图片贴到窗体上,这里只列出伪代码
LONG lTemp;   
PAINTSTRUCT pai = {};   
BITMAPINFOHEADER BmihSuccess;   
BLENDFUNCTION Blend;   
LONG x = 0;   
RECT r;   
  
Blend.BlendOp = 0;   
Blend.BlendFlags = 0;   
Blend.AlphaFormat = AC_SRC_ALPHA;   
Blend.SourceConstantAlpha = 255;   
  
::BeginPaint(m_hWnd, &pai);   
  
DWORD dwExStyle = ::GetWindowLong(m_hWnd, GWL_EXSTYLE);   
if ((dwExStyle & 0x80000) != 0x80000)   
{   
    ::SetWindowLong(m_hWnd, GWL_EXSTYLE, dwExStyle ^ 0x80000);   
}   
  
CRect rcWindow;   
::GetWindowRect(m_hWnd, &rcWindow);   
  //以上代表不用管,看不懂不要紧

HDC hdcTemp = ::GetWindowDC(m_hWnd);   //创建窗体DC,包含标题栏,菜单栏
HDC hdcMemory = ::CreateCompatibleDC(hdcTemp);   //内存DC,兼容窗体的DC
  
ZeroMemory(&BmihSuccess, sizeof(BITMAPINFO));   
  
BmihSuccess.biSize = sizeof (BITMAPINFOHEADER) ;   
BmihSuccess.biWidth = rcWindow.Width() ;   
BmihSuccess.biHeight = rcWindow.Height();   
BmihSuccess.biPlanes = 1 ;   
BmihSuccess.biBitCount = 32;   
BmihSuccess.biCompression = BI_RGB ;   
BmihSuccess.biSizeImage = 0 ;   
BmihSuccess.biXPelsPerMeter = 0 ;   
BmihSuccess.biYPelsPerMeter = 0 ;   
BmihSuccess.biClrUsed = 0 ;   
BmihSuccess.biClrImportant = 0 ;   
  
HBITMAP hBitMap = ::CreateDIBSection(hdcTemp,   
        (BITMAPINFO *)&BmihSuccess, 0, NULL, NULL, 0) ;  //创建一个GDI对象
HGDIOBJ oldObj = ::SelectObject(hdcMemory, hBitMap);   //将GDI对象选入DC
  ////////////////////////////////////////////////////////////////////////////////////
Gdiplus::Graphics gph(hdcMemory);   
  
    Gdiplus::Bitmap *m_pImgLeft;   
_pImgLeft = new Bitmap(_T("c:\\Login_msg_left1.png"));   
if(m_pImgLeft != NULL)   
    {   
        gph.DrawImage(m_pImgLeft, 0, 0,   
            m_pImgLeft->GetWidth(), m_pImgLeft->GetHeight());   
    }   
  
:UpdateLayeredWindow(m_hWnd, hdcTemp,   
    &CPoint(rcWindow.left, rcWindow.top),   
    &CSize(rcWindow.Width(), rcWindow.Height()),   
    hdcMemory, &CPoint(0, 0), 0, &Blend, ULW_ALPHA);   
  /////////以上圈起来的代码不用管//////////////////////////////////////////
以下是重点,是释放GDI资源的重点,顺序是选回旧的GDI对象,删除创建的GDI对象,删除DC
::SelectObject(hdcMemory, oldObj);   
::DeleteObject(hBitMap);   
::ReleaseDC(m_hWnd, hdcTemp);   
::DeleteDC(hdcMemory);   
::EndPaint(m_hWnd, &pai);

好了上面说了如何正确使用GDI的方法了,其实就是释放GDI资源顺序,那么如何查看GDI占用情况呢,现在和大家说一下
打开任务栏管理器,选中进程那一个选项卡,点菜单中的查看-》选择列 子菜单,找到GDI对象

确定后在进程列表就能看到

如果是窗体使用GDI,只要把窗体不断放大缩小,就能查看到GDI的使用情况,如果没有正确释放会,你会发现GDI对象数值一直在涨。
好了,今天就说到这呢,有不懂的,可以回复问我。

Windows界面编程之GDI一(入门篇)

GDI学习一(入门篇) 1、设备环境DC的概念              设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。他是一个关于如何绘制图形的方法的集合。它...
  • GyaoG
  • GyaoG
  • 2015年11月30日 00:44
  • 1585

windows基础编程----第四篇(调用GDI绘制出相关图形)

这一篇我们来画图吧~相信大家对图像的绘制也是会感兴趣点。
  • qq_30501909
  • qq_30501909
  • 2016年03月06日 20:53
  • 1265

win32GDI函数编程实现推箱子小游戏

利用GDI绘图函数实现推箱子小游戏,代码源于上一篇博客 C语言控制台推箱子。           实现方法很简单,把字符用绘图函数绘出的图形替换即可。           从字符控制台到win32界面...
  • qq_38329891
  • qq_38329891
  • 2017年06月10日 00:19
  • 288

游戏编程入门(3):绘制基本 GDI 图形

接上文 游戏编程入门(2):创建游戏引擎和使用该引擎制作小游戏 本篇内容包括: 使用Windows图形设备接口绘制图形的基础知识 设备环境是什么以及它为什么对GDI图形如此重要 如何在Windows...
  • Jurbo
  • Jurbo
  • 2017年06月26日 14:44
  • 1375

GDI+ 和 GDI的对比

一、GDI   GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离,使Win...
  • chenlycly
  • chenlycly
  • 2014年04月20日 11:57
  • 1688

Hadoop MR编程中main()函数参数注入

下面介绍MapReduce的主要的六个类,只有了解了这六个类的作用,才能在编写程序中知道哪个类是要自己实现,哪些类可以调用默认的类,才能真正的做到游刃有余,关于需要自己编写的类(用户制定类)可以参考:...
  • BBSETS
  • BBSETS
  • 2014年07月01日 11:10
  • 962

一个非常正确且强大的编程学习方法

一旦你发现一个学习工具,它采用自上而下的方法,那么什么是最好的学习方法?我对这有一个具有争议性的观点:我认为尽可能快地记住基础知识对初学者而言是绝对有必要的。当成为更高级的学习者,记忆很快成为一个被丢...
  • wuchengzeng
  • wuchengzeng
  • 2015年08月25日 13:46
  • 3279

VC无闪烁刷屏技术的实现---VC中用GDI函数实规高速平滑动画

摘要:许多游戏软件的开发中,实现高速平滑的动画需要许多比较深的技术,如:OpenGL、DirectX,并且可能还要开发人员有深厚的数学功底。但是,我们在开发一些小游戏,或为应用程序的界面实现一些动画效...
  • phenixyf
  • phenixyf
  • 2016年01月22日 15:17
  • 1194

浅谈性能优化

性能优化的重要性         性能是网站的一个重要指标,除非没得选择(必须到12306上买票,现在好像有所改变【此处并非是技术问题,解决方案改变业务进行分流,即不同时间放票】),否则用户无法忍受一...
  • zuoshoucuoai
  • zuoshoucuoai
  • 2017年06月13日 13:35
  • 154

用gdi 实现屏幕截图功能

最近在工作中要实现一个截图的gon
  • u010442009
  • u010442009
  • 2014年09月18日 10:47
  • 1944
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈GDI编程正确方法
举报原因:
原因补充:

(最多只允许输入30个字)