GDI对象选入多个设备环境导致显示出错的问题

最近才开始写图形化的程序。

不禁感慨道虽然也有很多不足,Windows作为一个操作系统是多么的强大!当然,这也导致写程序很麻烦,尤其是关系到unicode编码的时候。

今天遇到的问题是关于GDI对象的,代码如下:

 1 void Cls_OnPaint(HWND hDlg)
 2 {
 3     PAINTSTRUCT ps;
 4     HDC hDc, memDc;
 5     HBITMAP hOldBitmap;
 6 
 7     hDc = BeginPaint(hDlg, &ps);
 8 
 9     SetStretchBltMode(hDc, COLORONCOLOR);
10     memDc = CreateCompatibleDC(hDc);
11     //hOldBitmap = SelectBitmap(memDc, g_hBitmap);
12     StretchBlt(hDc, 200, 6, 640, 480, memDc, 0, 0, g_Camera.iStreamWidth, g_Camera.iStreamHeight, SRCCOPY);
13     SelectBitmap(memDc, hOldBitmap);
14     //DeleteDC(memDc);
15 
16     EndPaint(hDlg, &ps);
17 }

可以看到最初我并没有将内存设备环境删除,也没有将位图与内存设备环境的联系断开。

源程序运行时界面保持静止,没有按照我的想法会显示动态的视频。

经过对比,首先想到的是内存设备环境没有删除,这导致GDI对象的泄漏,因为每次会新建一个。

将内存设备环境删除后程序运行正确,但考虑每次我都将位图选入内存设备环境后再绘图,理论上应该可以显示动态视频,于是想到问题的根本不在此。

经测试后发现,将位图与内存设备环境断开后(即重新选入旧的位图),即使内存设备环境泄漏也可以正确显示。因此主要的问题出在:GDI对象选入了多个设备环境!

posted on 2013-06-15 16:46  风也轻云也淡  阅读(315)  评论(0编辑  收藏  举报