两段代码都做为目标HDC//之间有什么差别吗???

时间:2021-08-15 11:20:02

HDC hDC = NULL;
hDC = GetWindowDC( hWnd);
HDC hMemDC = CreateCompatibleDC( hDC );
HBITMAP hMemBitmap = CreateCompatibleBitmap( hDC,nWidth,nHeight );
HBITMAP hOldBitmap = (HBITMAP)SelectObject( hMemDC,hMemBitmap );

HDC hDC = NULL;
hDC = GetWindowDC( hWnd);

5 个解决方案

#1


一个是兼容DC 一个是屏幕DC,兼容DC一般叫做内存DC,在屏幕上看不到的,画的时候都是画在内存
而GetWindowDC 得到的DC是跟一个真实窗口相关联的,在上面画东西立即就显示出来了

#2


太阳哥 我这俩全是GetWindowDC。 主要是不明白第一个

HDC hMemDC = CreateCompatibleDC( hDC ); 
HBITMAP hMemBitmap = CreateCompatibleBitmap( hDC,nWidth,nHeight ); 
//这俩句有什么意义吗?
引用 1 楼 hurryboylqs 的回复:
一个是兼容DC 一个是屏幕DC,兼容DC一般叫做内存DC,在屏幕上看不到的,画的时候都是画在内存
而GetWindowDC 得到的DC是跟一个真实窗口相关联的,在上面画东西立即就显示出来了

#3


hDC等于是你能看到的DC,如果在上面操作,你就会立即看到,典型的问题是会闪烁,因为你在画之前需要刷新背景,而CreateCompatibleDC( hDC )就是为了避免这种情况,可以先在内存DC上画好所有的东西,然后通过BitBlt一次性更新可见DC,就不会闪烁

#4


虽然绘图的目标都是GetWindowDC获得的HDC,但第一种做法是先将要绘制的内容画到一个内存位图上,不会直接显示,当在内存位图中画完后,再将这幅图覆盖到HDC上,实现的效果是显示不闪烁,因为对于HDC来说,只进行了一次图片显示操作。而如果用第二种,为了完成重画,就需要先擦干净显示区域,然后再重新画上新的内容,这些都是观察者可以看到的,这是两个过程,会导致显示上的闪烁效果,一般都要避免的。鉴于现在计算机内存都足够大,因此用内存位图来解决闪烁问题已经不存在障碍了。

#5


一个是内存DC的句柄HDC
一个是CWindowDC的句柄HDC

CWindowDC区别于CPaintDC,CClientDC,可以绘制标题和边框。
由于CWindowDC是屏幕上绘制窗体整体边框,因此内存DC的目的在于在内存中绘制,用户就看不到了。从内存中一次性输出,速度和效率上比较快,用户肉眼察觉不出,从而达到不闪烁的效果。

主要是为了双缓存。把所有的事情都在内存中完成之后,一次性显出来。

#1


一个是兼容DC 一个是屏幕DC,兼容DC一般叫做内存DC,在屏幕上看不到的,画的时候都是画在内存
而GetWindowDC 得到的DC是跟一个真实窗口相关联的,在上面画东西立即就显示出来了

#2


太阳哥 我这俩全是GetWindowDC。 主要是不明白第一个

HDC hMemDC = CreateCompatibleDC( hDC ); 
HBITMAP hMemBitmap = CreateCompatibleBitmap( hDC,nWidth,nHeight ); 
//这俩句有什么意义吗?
引用 1 楼 hurryboylqs 的回复:
一个是兼容DC 一个是屏幕DC,兼容DC一般叫做内存DC,在屏幕上看不到的,画的时候都是画在内存
而GetWindowDC 得到的DC是跟一个真实窗口相关联的,在上面画东西立即就显示出来了

#3


hDC等于是你能看到的DC,如果在上面操作,你就会立即看到,典型的问题是会闪烁,因为你在画之前需要刷新背景,而CreateCompatibleDC( hDC )就是为了避免这种情况,可以先在内存DC上画好所有的东西,然后通过BitBlt一次性更新可见DC,就不会闪烁

#4


虽然绘图的目标都是GetWindowDC获得的HDC,但第一种做法是先将要绘制的内容画到一个内存位图上,不会直接显示,当在内存位图中画完后,再将这幅图覆盖到HDC上,实现的效果是显示不闪烁,因为对于HDC来说,只进行了一次图片显示操作。而如果用第二种,为了完成重画,就需要先擦干净显示区域,然后再重新画上新的内容,这些都是观察者可以看到的,这是两个过程,会导致显示上的闪烁效果,一般都要避免的。鉴于现在计算机内存都足够大,因此用内存位图来解决闪烁问题已经不存在障碍了。

#5


一个是内存DC的句柄HDC
一个是CWindowDC的句柄HDC

CWindowDC区别于CPaintDC,CClientDC,可以绘制标题和边框。
由于CWindowDC是屏幕上绘制窗体整体边框,因此内存DC的目的在于在内存中绘制,用户就看不到了。从内存中一次性输出,速度和效率上比较快,用户肉眼察觉不出,从而达到不闪烁的效果。

主要是为了双缓存。把所有的事情都在内存中完成之后,一次性显出来。