gdb如何使用,gdi api
在windows系列上编程,Gdi是一个非常重要的技术点,很多程序运行很多次后就出现异常。除了众所周知的内存泄漏,gdi资源泄漏也是一个非常直接的原因。今天和大家分享一些我编程的经验,欢迎各位专家补充。
1.创建的gdi对象必须用DeleteObject释放,释放顺序是先创建后释放,再创建再释放。
这里的Create是指以它开头的gdi函数,例如CreateDIBitmap、CreateFont等。最后调用DeleteObject来释放它们。
2.dc 2。Create应该由DeleteDC释放,而DC acquired应该由ReleaseDC释放。
3.确保DC所有的gdi对象都不是你自己在释放DC时创建的;确保gdi对象在释放时没有被任何dc选择使用。
如果我们想用gdi函数来绘制图片,正确的步骤应该如下:
A.创建一个内存兼容的dc(CreateCompatibleDC)
B.创建内存兼容位图(CreateCompatibleBitmap)
C.由关联创建的内存与dc和位图(SelectObject)兼容
D.画画
E.BitBlt到目标dc
F.从位图断开内存兼容dc(选择对象)
G.销毁内存兼容位图
H.销毁内存兼容dc
由于SelectObject在选择一个新的gdi对象时会返回一个原始的gdi对象(如果成功的话),所以需要保存步骤C中的返回值,并在步骤f中将其作为入口参数,还有,步骤G和步骤H的顺序实际上可以是任意的,因为此时它们之间没有关系,但是为了结构清晰起见,我建议遵循先创建后发布,后创建后发布的原则。
关于步骤f,可能会有争议,因为即使省略了这一步,似乎步骤g和h仍然可以返回一个成功的值。但实际上,它们可能不会被成功执行。至少boundschecker会报告一个错误。错误信息大致意思是dc释放的时候有一个非默认的gdi对象,gdi对象释放的时候说这个gdi对象还在被一个dc使用。因此,我建议保留步骤f .
4.关于在98下使用CreateCompatibleBitmap
根据msdn,创建的大小不能超过16m。实际情况是这样吗?不~!从我自己的测试结果(win98se-sc)来看,这个值在2044*2043到2044*2044之间。但是,后来这个值在另一个98系统上就不行了。后来干脆把上限给了2000*2000。幸运的是,目前为止没有问题,但我不能保证这个数字是正确的。还有一点即使另一个值为1,也无法创建。有兴趣的可以自己做个测试。如果您想确保这个函数在98时总是成功,您可以尝试下面的代码:
浮动因子=10.f
而(!位图。CreateCompatibleBitmap( dc,nWidth*factor,nHeight*factor))
{
因子-=0.01 f;
}
这至少保证了宽度和高度是成比例的:)
5.关于在打印机上使用BitBlt
有时,内存兼容dc已经映射,但使用BitBlt时会失败。此时,首先确认创建的内存兼容dc和位图是否是打印机的dc。如果确认无误,仍然无法执行BitBlt。那么80%可能是内存兼容位图太大。请按如下方式重试:
再创建一个内存兼容的dc2和一个更小的内存兼容的biimap2,大概是1000*1000。我是这样用的:)然后把dc的内容分成块(1000*1000),把每个块放在dc2上,然后从dc2打印dc。可能有人会有这样的疑问:为什么不直接把dc的内容分几次位呢?有什么区别?答案是肯定的,如果dc中的位图太大,即使你想将一个10*10的区域BitBlt到打印机,也会失败。
结束
出发地:http://blog..net/bobob/article/details/565188
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。