MFC 双缓冲在背景上画图

shenjiu04 2015-08-04 03:29:01
现在MFC单文档上要添加一个背景图片一样的背景,之后要在背景上画图

画图因为闪烁需要用到双缓冲,

请问各位大大如何在背景上面双缓冲画图
...全文
246 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2015-08-05
  • 打赏
  • 举报
回复
引用 17 楼 shenjiu04 的回复:
[quote=引用 12 楼 pcradio 的回复:] [quote=引用 11 楼 shenjiu04 的回复:] [quote=引用 10 楼 pcradio 的回复:] bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了[/quote] 我就是在找原因,为啥你画不出来[/quote] 已经弄明白了 bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()) 这里用PDC 多谢大大回复了,结贴了[/quote] 不是一直用的pDC么
shenjiu04 2015-08-05
  • 打赏
  • 举报
回复
引用 12 楼 pcradio 的回复:
[quote=引用 11 楼 shenjiu04 的回复:] [quote=引用 10 楼 pcradio 的回复:] bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了[/quote] 我就是在找原因,为啥你画不出来[/quote] 已经弄明白了 bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height()) 这里用PDC 多谢大大回复了,结贴了
schlafenhamster 2015-08-05
  • 打赏
  • 举报
回复
"不过背景用得位图的也是新建个位图然后往上面粘" 改 memDC.FillSolidRect(rcClient, RGB(255, 255, 255)); 为 绘背景
阿源是少年 2015-08-05
  • 打赏
  • 举报
回复
pDC->BitBlt(0,0,clu2,row2,&MemDC,0,0,SRCCOPY);这句话不起作用么?
shenjiu04 2015-08-05
  • 打赏
  • 举报
回复
引用 12 楼 pcradio 的回复:
[quote=引用 11 楼 shenjiu04 的回复:] [quote=引用 10 楼 pcradio 的回复:] bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了[/quote] 我就是在找原因,为啥你画不出来[/quote] 代码那一块的位图画出来了,但是在上面双缓冲画图弄不出来
shenjiu04 2015-08-05
  • 打赏
  • 举报
回复
引用 11 楼 shenjiu04 的回复:
[quote=引用 10 楼 pcradio 的回复:] bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了[/quote] 能不能双缓冲背景那一块用已经画好的这个位图
阿源是少年 2015-08-05
  • 打赏
  • 举报
回复
引用 11 楼 shenjiu04 的回复:
[quote=引用 10 楼 pcradio 的回复:] bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了[/quote] 我就是在找原因,为啥你画不出来
shenjiu04 2015-08-05
  • 打赏
  • 举报
回复
引用 10 楼 pcradio 的回复:
bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
我是想在这部分上面画双缓冲的图像,不用双缓冲闪烁太厉害了
阿源是少年 2015-08-05
  • 打赏
  • 举报
回复
bm.bmWidth bm.bmHeight值对不对? 这两句去掉,析构函数会自己调用的: Bitmap.DeleteObject(); MemDC.DeleteDC();
shenjiu04 2015-08-05
  • 打赏
  • 举报
回复
引用 8 楼 pcradio 的回复:
你不用双缓冲时,你自己通过SetBitmapBits填充的位图能显示吗?
能的
阿源是少年 2015-08-04
  • 打赏
  • 举报
回复
你不用双缓冲时,你自己通过SetBitmapBits填充的位图能显示吗?
shenjiu04 2015-08-04
  • 打赏
  • 举报
回复
引用 6 楼 pcradio 的回复:
背景画的什么东西,你贴代码
//图像的扫描方式是按从左到右、从下到上的顺序 int * bits = new int [row*clu];//初始化 for( i = row-1; i >= 0; i--) { for( j = 0; j <clu; j++) bits[i*clu+j] =RGB((int)data[i][j],(int)data[i][j],(int)data[i][j]); //位图颜色为RGBQUAD结构,颜色按B,G,R顺序 现在是灰度 } //pDC = GetDC(); CDC MemDC; // 设备DC指针 内存DC BITMAP bm; CBitmap Bitmap; CRect IndexBmpRect(0, 0, clu, row); // 索引BMP的大小 Bitmap.CreateCompatibleBitmap(pDC, IndexBmpRect.Width(), IndexBmpRect.Height()); // 创建一个与当前窗体兼容的CBitmap对象 Bitmap.SetBitmapBits(row*clu*4,bits); MemDC.CreateCompatibleDC(pDC); // 创建与当前设备DC相兼容的内存DC //bm.bmBits=bits; Bitmap.GetObject(sizeof(BITMAP), &bm); CBitmap *pOldBitmap = MemDC.SelectObject(&Bitmap); // 将位图选取到内存DC中 pDC->SetStretchBltMode(HALFTONE); //对图像缩放 pDC->StretchBlt(0,0,clu2,row2 ,&MemDC,0,0, //前面是目标矩形,后边是原CBitmap矩形 功能是将后面的CBitmap在前面的矩形中显示 bm.bmWidth, bm.bmHeight,SRCCOPY);//通过对CBitmap矩形的修改,可以选定显示哪一部分 //pDC->BitBlt(0,0,clu2,row2,&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBitmap); // 恢复先前的位图 分离出已选入的GDI对象(这里是位图) // 绘图完成后的清理 Bitmap.DeleteObject(); MemDC.DeleteDC(); ReleaseDC(pDC); delete []bits;
阿源是少年 2015-08-04
  • 打赏
  • 举报
回复
背景画的什么东西,你贴代码
shenjiu04 2015-08-04
  • 打赏
  • 举报
回复
引用 4 楼 pcradio 的回复:
你是说你以前没用双缓冲时背景有画东西的,然后双缓冲就把它覆盖了? 这个是必然的,你必须把你以前画在pDC上的东西全部重新画到memDC的位图上才行
对的,但是背景放在memDC上画显示不正确
阿源是少年 2015-08-04
  • 打赏
  • 举报
回复
你是说你以前没用双缓冲时背景有画东西的,然后双缓冲就把它覆盖了? 这个是必然的,你必须把你以前画在pDC上的东西全部重新画到memDC的位图上才行
阿源是少年 2015-08-04
  • 打赏
  • 举报
回复
啥意思啊,我没看明白,你直接用memDC绘图没有问题的
shenjiu04 2015-08-04
  • 打赏
  • 举报
回复
引用 1 楼 pcradio 的回复:
如果你的文档不涉及滚动,双缓冲方法和Dialog是一样的,3步走: 1.重写OnEraseBackground函数,禁止背景重画 BOOL OnEraseBanckground(){return FALSE;} 2.在OnDraw绘图前先创建离屏位图,对离屏位图清屏,然后画到View客户区 3.之后在离屏位图上绘制你自己的东西 代码如下: void OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); // 创建离屏位图 CBitmap offscreen; offscreen.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&offscreen); // 清屏,清屏色为白色 memDC.FillSolidRect(rcClient, RGB(255, 255, 255)); /// 开始你的绘图代码,绘制的DC为离屏位图DC ////////////////////////// memDC.Rectangle... memDC.MoveTO... memDC.LineTo... /// 结束绘制 ////////////////////////////////////////////////////////////////////////////////////////// pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY); } 记得拦截消息 BEGIN_MESSAGE_MAP() ON_WM_ERASEBACKGROUND() END_MESSAGE_MAP)()
谢谢大大回复,双缓冲我弄出来了,不过背景用得位图的也是新建个位图然后往上面粘,再用双缓冲画图的话就把背景的去掉了,现在想要怎么样才能把作为背景的位图当做双缓冲的画图背景
阿源是少年 2015-08-04
  • 打赏
  • 举报
回复
如果你的文档不涉及滚动,双缓冲方法和Dialog是一样的,3步走: 1.重写OnEraseBackground函数,禁止背景重画 BOOL OnEraseBanckground(){return FALSE;} 2.在OnDraw绘图前先创建离屏位图,对离屏位图清屏,然后画到View客户区 3.之后在离屏位图上绘制你自己的东西 代码如下: void OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); // 创建离屏位图 CBitmap offscreen; offscreen.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height()); CDC memDC; memDC.CreateCompatibleDC(pDC); memDC.SelectObject(&offscreen); // 清屏,清屏色为白色 memDC.FillSolidRect(rcClient, RGB(255, 255, 255)); /// 开始你的绘图代码,绘制的DC为离屏位图DC ////////////////////////// memDC.Rectangle... memDC.MoveTO... memDC.LineTo... /// 结束绘制 ////////////////////////////////////////////////////////////////////////////////////////// pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, SRCCOPY); } 记得拦截消息 BEGIN_MESSAGE_MAP() ON_WM_ERASEBACKGROUND() END_MESSAGE_MAP)()

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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