使用双缓存显示位图,出现很怪的问题

south2000 2006-03-09 08:42:35
基于对话框的程序。
本意:让图像上面的某些点不停闪烁,就像交通灯那样的闪烁。
思路:把磁盘中的图像加载到两个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,图像就显示不出来。
怎么回事啊?

谢谢!
...全文
104 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2006-03-09
  • 打赏
  • 举报
回复
两个DC用两个位图对象,不要同时选入同一个位图。
清歌谁与和 2006-03-09
  • 打赏
  • 举报
回复
HBITMAP h;
PIC pic;
CBitmap bm;
BITMAP bsize;

bm.m_hObject = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

pic.pdc1 = new CDC;
pic.pdc1->CreateCompatibleDC(NULL);
pic.pbmOld1 = pic.pdc1->SelectObject(&bm);

bm.m_hObject = (HBITMAP)LoadImage(AfxGetInstanceHandle(),".\\1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
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.pdc2, 0, 0, pic.iWidth, pic.iHeight, SRCCOPY);
ReleaseDC(p);



这样就可以了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧