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对象选入了多个设备环境!