DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2013年11月18日

摘要: 前一段在一个仿QQ的IM通讯工具中加入屏幕截图以及截图编辑功能,但是测试中发现当连续进行几十次截图后,系统会出现白屏,开始以为和win7经常闪白有关,屏幕截图截取到闪白的瞬间导致白屏,后来发现是GDI内存不足,申请不到GDI内存贴图失败所致。于是找了GDI泄露的工具,对程序进行GDI内存检测,下面就介绍两款GDI泄露检测工具的用法以及GDI编程的一些注意事项。第一款:GDIndicator 支持win7+xp 下载地址1、启动待检测的程序和GDIndicator,启动顺序没有要求,之后F5刷新,就能看到系统中所有进程,和使用的资源数找到想要查看的进程,这里我们的程序是 TPCommonCont 阅读全文
posted @ 2013-11-18 21:04 DoubleLi 阅读(4967) 评论(0) 推荐(0)

摘要: 对开发中常见的内存泄露,GDI泄露进行检测一、GDI泄露检测方法:在软件测试阶段,可以通过procexp.exe 工具,或是通过任务管理器中选择GDI对象来查看软件GDI的对象是使用情况。注意点:Create出来的GDI对象,都要用DeleteObject来释放;Create出来的DC,都要用DeleteDC来释放,GetDC得出的DC,要用ReleaseDC来释放。以下是一些常用到的函数:1、 检查GetWindowDC(), 后面是否有ReleaseDC();2、 检测GetDC();后面是否有ReleaseDC();3、 检测画刷CBrush:CreateSolidBrush()-》 D 阅读全文
posted @ 2013-11-18 21:00 DoubleLi 阅读(2204) 评论(0) 推荐(0)

摘要: 用.Net写的地图编辑器,最近在一个长时间使用的策划手里频繁挂掉。定位到原因应该是GDI泄露。但在几千行代码里手工寻找泄漏点实在是有些困难,直到在网上找到了这个检测GDI泄露的工具GDILeaks。它的强大之处,在于可以将程序里当前占用的gdi位图、dc用图形格式显示出来,这样,泄露点基本上就直接展示在你眼前了。另外,关于泄露为什么会发生,我还有些疑问。经检查,泄漏点是这样的C#代码void doSomeThing(){Bitmap tmpBmp = new Bitmap(100,100);returntransformBmp(tmpBmp); //这里对tmpBmp放大后存到一张新位图上返回 阅读全文
posted @ 2013-11-18 20:58 DoubleLi 阅读(862) 评论(0) 推荐(0)

摘要: 查GDI对象泄露的利器:GDIView可以很详细的查到进程的GDI对象的总个数,详细的GDI对象的个数,以及其增减数量。其GDI对象类型也可以很详细的得知,以及其内存地址,句柄。实在是好使!下载地址:http://www.nirsoft.net/utils/gdi_handles.html中文版32x下载地址:http://www.hanzify.org/software/12680.html 阅读全文
posted @ 2013-11-18 20:44 DoubleLi 阅读(1064) 评论(0) 推荐(0)

摘要: 清除屏幕闪烁(转自网上)由于作图过于复杂和频繁,所以时常出现闪烁的情况,一些防止闪烁的方法,如下:(1)将Invalidate()替换为InvalidateRect()。Invalidate()会导致整个窗口的图象重画,需要的时间比较长,而InvalidateRect()仅仅重画Rect区域内的内容,所以所需时间会少一些。不要为一小块区域的重画就调用Invalidate(),不愿意自己去计算需要重画的Rect,事实上,如果你确实需要改善闪烁的情况,计算一个Rect所用的时间比起重画那些不需要重画的内容所需要的时间要少得多。(2)禁止系统擦除你的窗口。系统在需要重画窗口的时候会帮你用指定的背景色 阅读全文
posted @ 2013-11-18 17:21 DoubleLi 阅读(6214) 评论(0) 推荐(1)

摘要: 窗口是屏幕上的一个矩形区域。窗口分为3种:重叠窗口、弹出窗口和子窗口。每个窗口都有由系统绘制的“非客户区”和应用程序绘制的“客户区”。在MFC中,CWnd类为各种窗口提供了基类。1通过HWND获得CWnd指针通过HWND获得Cwnd指针可以调用Cwnd::FromHandle函数。12345678voidCDemoDlg::OnButton1() {HWNDhWnd = GetSafeHwnd(); //获得当前窗口的句柄CWnd* pWnd = CWnd::FromHandle(hWnd); //通过HWND获得CWnd指针CString strText = _T("") 阅读全文
posted @ 2013-11-18 12:49 DoubleLi 阅读(517) 评论(0) 推荐(0)