使用双缓存显示位图,出现很怪的问题
基于对话框的程序。
本意:让图像上面的某些点不停闪烁,就像交通灯那样的闪烁。
思路:把磁盘中的图像加载到两个memory DC中,一个装载原始图像,称为dc1;另一个装载原始图像后再画一些点,称为dc2;在定时器作用下,这两个memory DC轮流画到对话框中去。
把一个memory DC画到对话框中去,我已经实现了,是正确的;
但是,很快发现一个很怪的问题:在仅仅画一个memory DC到对话框(并不是让两个memory DC轮流画)的时候,如果画dc1,一切正确;如果画dc2,图像显示不出来。
点击按钮,上载磁盘图像,让其显示在一个PICTURE控件上,IDC_PIC;
下面,给出主要代码:
定义结构
struct PIC
{
CDC *pdc1;
CDC *pdc2;
CBitmap *pbmOld1;
CBitmap *pbmOld2;
int iWidth;
int iHeight;
};
OnButton1():
HBITMAP h;
PIC pic;
CBitmap bm;
BITMAP bsize;
h = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
bm.Attach(h);
pic.pdc1 = new CDC;
pic.pdc1->CreateCompatibleDC(NULL);
pic.pbmOld1 = pic.pdc1->SelectObject(&bm);
pic.pdc2 = new CDC;
pic.pdc2->CreateCompatibleDC(NULL);
pic.pbmOld2 = pic.pdc2->SelectObject(&bm);
bm.GetObject(sizeof(BITMAP), &bsize);
pic.iWidth = bsize.bmWidth;
pic.iHeight = bsize.bmHeight;
bm.Detach();
CDC *p = GetDlgItem(IDC_PIC)->GetDC();
p->StretchBlt(0, 0, pic.iWidth, pic.iHeight, pic.pdc1, 0, 0, pic.iWidth, pic.iHeight, SRCCOPY);
ReleaseDC(p);
////////////////////////////////////////
运行结果一切正常。
如果把p->StretchBlt中的参数pic.pdc1改为pic.pdc2,图像就显示不出来。
怎么回事啊?
谢谢!