两段代码都做为目标HDC//其间有什么差别吗?
两段代码都做为目标HDC//之间有什么差别吗???
------解决方案--------------------
虽然绘图的目标都是GetWindowDC获得的HDC,但第一种做法是先将要绘制的内容画到一个内存位图上,不会直接显示,当在内存位图中画完后,再将这幅图覆盖到HDC上,实现的效果是显示不闪烁,因为对于HDC来说,只进行了一次图片显示操作。而如果用第二种,为了完成重画,就需要先擦干净显示区域,然后再重新画上新的内容,这些都是观察者可以看到的,这是两个过程,会导致显示上的闪烁效果,一般都要避免的。鉴于现在计算机内存都足够大,因此用内存位图来解决闪烁问题已经不存在障碍了。
------解决方案--------------------
一个是内存DC的句柄HDC
一个是CWindowDC的句柄HDC
CWindowDC区别于CPaintDC,CClientDC,可以绘制标题和边框。
由于CWindowDC是屏幕上绘制窗体整体边框,因此内存DC的目的在于在内存中绘制,用户就看不到了。从内存中一次性输出,速度和效率上比较快,用户肉眼察觉不出,从而达到不闪烁的效果。
主要是为了双缓存。把所有的事情都在内存中完成之后,一次性显出来。
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);
------解决方案--------------------
虽然绘图的目标都是GetWindowDC获得的HDC,但第一种做法是先将要绘制的内容画到一个内存位图上,不会直接显示,当在内存位图中画完后,再将这幅图覆盖到HDC上,实现的效果是显示不闪烁,因为对于HDC来说,只进行了一次图片显示操作。而如果用第二种,为了完成重画,就需要先擦干净显示区域,然后再重新画上新的内容,这些都是观察者可以看到的,这是两个过程,会导致显示上的闪烁效果,一般都要避免的。鉴于现在计算机内存都足够大,因此用内存位图来解决闪烁问题已经不存在障碍了。
------解决方案--------------------
一个是内存DC的句柄HDC
一个是CWindowDC的句柄HDC
CWindowDC区别于CPaintDC,CClientDC,可以绘制标题和边框。
由于CWindowDC是屏幕上绘制窗体整体边框,因此内存DC的目的在于在内存中绘制,用户就看不到了。从内存中一次性输出,速度和效率上比较快,用户肉眼察觉不出,从而达到不闪烁的效果。
主要是为了双缓存。把所有的事情都在内存中完成之后,一次性显出来。