hur.cn - 华软网

 热门搜索

新手问题:OnPaint函数的双缓冲问题

  作者:未知    来源:网络    更新时间:2011/10/1
小弟想用Cximage类加载png图片做双缓冲遇到些麻烦,读入图片没有问题,显示在屏幕上也没有问题,但是一做成双缓冲就有问题了。想法:小弟的想法是用CxImage a.load(...)读入图片-->OnPaint函数里用a.draw()画到-->HDC mem_hDC上-->BitBlt函数画到m_hDC上。OnPaint代码如下:
                
                HBITMAP hbmpPaint, oldBmp;
hbmpPaint = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
oldBmp = (HBITMAP)SelectObject(mem_hDC, hbmpPaint);

mem_hDC = CreateCompatibleDC(mem_hDC);
a.Draw(mem_hDC,0,0,480,720,0);
BitBlt(m_hDC, 0, 0, 480, 720, mem_hDC, 0, 0, SRCCOPY);
---华软 网友回答---
我以前看过一篇GDI+实现双缓冲的文章,同样是在OnPaint函数中实现的,你可以找来参考下。
---华软网友回复---
mem_hDC = CreateCompatibleDC(mem_hDC);
??
---华软网友回复---
引用 2 楼 schlafenhamster 的回复:
mem_hDC = CreateCompatibleDC(mem_hDC);
??

小弟实在搞不懂双缓冲啊。。那句注释掉了之后还是一样的效果,没有改变。。。请问各位高手告诉我该怎么做啊?我想用cximage自己带的draw函数画图函数第一个参数为HDC意思是:画在指定的HDC上,请问各位高手有没有什么办法实现啊?
---华软网友回复---
BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC
{
// TODO: Add your message handler code here and/or call default
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
//
CreateCompatibleDC '产生兼容DC',和谁兼容?和()内的pDC兼容。
所以:
mem_hDC = CreateCompatibleDC(mem_hDC);//产生和自己兼容的DC ??
是错的,你必须找到源dc。
又如:
HBITMAP CopyScreenToBitmap(CRect &Rect,HWND hwnd) 
{  
HDC      hScrDC, hMemDC;      
HBITMAP  hOldBitmap,hBitmap;  
int      xScrn, yScrn;        
// to screen coordinates. 
MapWindowPoints(hwnd,NULL,(POINT *)&Rect,2);
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);  hMemDC = CreateCompatibleDC(hScrDC); 


---华软网友回复---
谢谢楼上这位大哥的提醒实在太感谢你了,现在小弟把问题具体一点,小弟事先定义了两个全局的HDC:
m_hDC和hdcPaint;现在小弟想用cximage自带的draw函数,把图片画到hdcPaint里面,再用
BitBlt(m_hDC, 0, 0, 480, 720, mem_hDC, 0, 0, SRCCOPY);函数将图片显示到屏幕上,请问是否可行?
---华软网友回复---
一般绘图的API都会给你一个pDC,没有必要定义两个全局的HDC:m_hDC和hdcPaint,而且这2个dc的初始化也是问题。
---华软网友回复---
用cximage自带的draw函数,把图片画到hdcPaint里面,这个hdcPaint应该是一个mem_dc。
---华软网友回复---
引用 7 楼 schlafenhamster 的回复:
用cximage自带的draw函数,把图片画到hdcPaint里面,这个hdcPaint应该是一个mem_dc。

请问这个hdcPaint该如何初始化呢?定义在哪里呢?现在大脑快奔溃了都搞了一天多了。。。。
---华软网友回复---
CDC hdcPaint;
hdcPaint.CreateCompatibleDC(pDC);//DeleteDC needed
//pDC 函数入口参数
---华软网友回复---
问题解决了。。谢谢你们!
OnPiant正确代码如下:
/*创建缓存DC和兼容位图*/
HDC hdcPaint = CreateCompatibleDC(m_hDC);
HBITMAP  hbmpPaint = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
SelectObject(hdcPaint, hbmpPaint);
        a.Draw();
        BitBlt(m_hDC, 0, 0, 480, 720, hdcPaint, 0, 0, SRCCOPY);//双缓冲机制

     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。