首先应明确一个概念 句柄, 关于句柄的详细介绍请见这里
对于句柄的使用小结:借来的要归还,创建的要释放,选出的要选入【尤其是针对GDI的一些句柄而言,如HPEN,HBRUSH等】
1. 使用GetDC() 获取的设备上下文指针在不使用的时候必须调用ReleaseDC()进行释放
例如:
1 CDC *pDC = GetDlgItem(IDC_TEST)->GetDC(); 2 3 /*...............*/ 4 5 GetDlgItem(IDC_TEST)->ReleaseDC(pDC);
2. 在创建了DC或其他GDI资源后,如果不再使用则需要将所创建的资源进行释放
例如:
1 CDC dcMem; 2 3 dcMem.CreateCompatibleDC(NULL); 4 5 /*..............*/ 6 7 dcMem.DeleteDC();
3. 在将创建的GDI绘图对象选入了设备上下文后,如果使用完毕则需要将之前选出的旧有的GDI绘图对象选入,然后在删除所创建的GDI对象
例如:
1 CBitmap bmp; 2 3 bmp.CreateCompatibleBitmap(pDC, nWidht, nHeight); 4 5 CBitmap *pBmpOld = memDC.SelectObject(&bmp); 6 7 /*..................................*/ 8 9 memDC.SelectObject(pBmpOld); 10 11 bmp.DeleteObject();
说明:一定要注意SelectObject的操作通常要成对出现,否则可能会导致GDI资源泄露。例如上面的例子,如果在最后我们没有执行语句
memDC.SelectObject(pBmpOld);只是调用了bmp.DeleteObject(),此时对于bmp资源的释放是失败的,即无法将之前所创建的位图图像删除。
Attach 的需要Detach
例如:
1 CImage img; 2 3 if (SUCCEEDED(img.Load(strFileName))) 4 5 { 6 7 HBITMAP hBitmap = img.Detach(); 8 9 /*......................*/ 10 11 img.Attach(hBitmap); 12 13 } 14 15 img.Destroy();
1 bitmap = CreateCompatibleBitmap(...); 2 HBITMAP oldbitmap = SelectObject(hdc, bitmap); 3 ... 4 SelectObject(hdc, oldbitmap); 5 DeleteObject(&bitmap)