对内存DC做长时间的操作程序就会出错
在程序里,CPlottingBoard的功能是创建一个无边框的窗口供控制台程序绘图用。窗口的创建是非阻塞的,所以我开了一个线程。窗口的绘图统统先在内存DC - m_hMemDc里完成,然后在WM_PAINT消息里BitBlt进窗口DC里。该窗口是可以拖动的。
现在问题来了,我在主函数里写了个循环,演示的是一个红色小方块在蓝色背景下一行行地移动,当方块移动到一定阶段后桌面的左上角就开始乱了,我找了半天也发现不了问题,所以只能上来请教高手了。
代码贴在下面
[解决办法]
::FillRect(m_hMemDc, &rect, CreateSolidBrush(color)); => CreateSolidBrush(color)创建的HBRUSH句柄没有释放。
[解决办法]
GDI资源泄露,当到10000时软件就会崩溃的。
此句
::FillRect(m_hMemDc, &rect, CreateSolidBrush(color));
改为
HBRUSH hr = CreateSolidBrush(color);
::FillRect(m_hMemDc, &rect,hr);
DeleteObject( hr );
[解决办法]
GDI使用规制:
1.Create出来的gdi对象,一定要用DeleteObject来释放,释放顺序是先Create的后释放,后Create的先释放.这里的Create指的是以它为开头的gdi函数,比如,CreateDIBitmap,CreateFont等等,最后都要调用DeleteObject来释放;
2.Create出来的dc要用DeleteDC来释放,Get到的要用ReleaseDC释放;
3.确保释放DC的时候DC中的各gdi对象都不是你自己创建的;确保每个gdi对象在释放的时候不被任何dc选中使用。