DC释放的问题


以前编写GDI程序的时候没有怎么注意这一块,DC随便使用,也没有什么大问题,现在发现这样做问题很大,首先就是内存泄露
一个DC就相当于一个画家,但是他没有画笔、颜料、画布就不能作画,在GDI就类似于pen、brush、bitmap等等,一个DC的创建要涉及到画画的各个方面,因而它是一块很大的内存消耗,DC的bitmap,也就是我们把画画在什么地方可以使显卡的显存,页可以是内存,就看你当时是如何创建,怎么把自己的东西给画家,现在你要换一把刷子,通过Select对象把自己的刷子给画家,这里一定要保存原来的刷子,因为如果你不保存原来的东东,默认的是不会替你释放的,DC这种东东,不想new 和 delet,通过new 和 delete得到的内存块泄露了,在程序结束的时候一般会释放掉,但是这个DC,一旦创建就不会释放,除非你调用释放函数,因而要谨慎使用。

有人可能在编写GDI程序的时候使用的图片比较多,想一次性读完保存起来,后面使用的时候就直接往物理DC上面帖,这里要注意两个问题,首先我们为了速度快,可以把bitmap保存起来,注意这里不是保存的是DC,什么时候贴图,就创建一个临时dc,帖完之后立刻释放,注意这里存储的是Bitmap,而不是DC,节省很大的空间,其次,当一个内存中bitmap选给一个DC的时候,其他的DC就不能选相同的图片,“两个画家抢一块画布”;注意的第二个地方就是一个释放的问题,很多人都喜欢用get Rlease,这样做没有错,但是注意这里只是针对物理DC,这个RleaseDC并没有真正的释放,只是类似于一个计数器减一,因为这个DC是显卡的DC,想释放掉也不可能,对于内存DC,就不要用ReleaseDC,并没有完成的释放掉内存,最好使用DeleteDC,这里在Delete最好先释放掉图片,当内存一副bitmap在DC的时候释放是不成功,要释放的时候就把old的bitmap选回来再释放。

这里,一般来说我们都不直接操作物理DC,对于一个窗口我们先建一个缓存DC,所有的操作都是针对这个缓存DC的,操作完成之后,一次性的拷贝到物理DC上面。

另外,如果想要做透明效果,注意这个问题,一般来说我们创建Bitmap的时候创建的是24位,对于PNG图片,本身就由32位(包含Aphla位),但是普通的bitble都是24位的拷贝,我们可以创建32位的bitmap,我们可以重新写bitblt,让他可以直接帖透明地图。


DeleteDC(PDC)与ReleaseDC(PDC)有何不同?
create- >delete
get- >release
注意对应关系

自己的一点学习体会

你可能感兴趣的:(delete,存储)