怎样将内存中的图保存为CBitmap对象?

JERAYLEE 2013-02-17 12:42:38
MFC编程。如题。我用CPen在面板上通过一个循环画了一副五颜六色的背景,之後我想让鼠标在背景上移动时会有以鼠标为零点的坐标线。我每移动下鼠标这幅背景就得重画,然后画坐标线。然而绘画背景的那个循环太庞大,占用了大量CPU。我想只通过循环绘一次背景,然后拷贝保存,当鼠标移动时,只绘制背景的拷贝,请问我该怎样实现?我想在第一次绘图时保存CDC对象,或者CBitmap对象,可是没成功,不知道有什麽方法,或者函数,最好能举个例子,谢谢
...全文
237 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dubiousway 2013-02-17
画图一般是双缓冲绘图 创建一个memdc,把要画的背景先画到这上面,然后每次更新,把memdc复制到屏幕hdc (这个方法你搜一搜,代码很多) ---------- 不过你的问题,应该不是这么解决。 有一种位操作叫异或运算;同样绘图也有一种方式叫异或绘制 用 SetROP2(R2_XORPEN), 你绘制完坐标线后,当更新鼠标位置,重新绘制新的坐标线时,你要用相同的坐标线颜色,在原来的位置先重新绘制一边,这样两次异或操作的结果就是又恢复了已开始的底案颜色; 然后再在新位置画新的坐标线
  • 打赏
  • 举报
回复
hdg3707 2013-02-17
象你这种情况可以采用线程来画背景,同时进行局部更新背景,也就是你知道鼠标移动坐标点及坐标线的位置,那么,你只需要更新这部分范围就可以了. 你想采用的方法也可以,这个你可以查一下屏幕截图的代码,代码也不多,用到4楼提到的函数了,只不过4楼没给全
  • 打赏
  • 举报
回复
JERAYLEE 2013-02-17
引用 4 楼 SunShineBoys1234567 的回复:
创建内存双缓冲DC, 例如, CPaintDC dc(this); CDC* pDC; CBitmap bitmap; pDC->CreateCompatibleDC(&dc); // 创建一个内存兼容的dc bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());……
你这是干什么?你回答跟我问题不相关啊,我可不会给你分的。
  • 打赏
  • 举报
回复
创建内存双缓冲DC, 例如, CPaintDC dc(this); CDC* pDC; CBitmap bitmap; pDC->CreateCompatibleDC(&dc); // 创建一个内存兼容的dc bitmap.CreateCompatibleBitmap(&dc, m_rect.Width(), m_rect.Height());// pDC->SelectObject(bitmap); // 位图选入内存dc中
  • 打赏
  • 举报
回复
JERAYLEE 2013-02-17
引用 2 楼 XIAIBIANCHENG 的回复:
创建一个和背景尺寸大小相同的CBitmap 把你的背景画在这个CBitmap 当你需要重绘背景时 就把这张位图贴上去
一楼说的那种异或操作是一种方法,您说的这种方法该怎样画到CBitmap上呢?在哪里画呢?双缓存绘制的时候将内存画进CBitmap内吗?怎么画,有函数么?还是得自己写,逻辑是什么呢?
  • 打赏
  • 举报
回复
万航 2013-02-17
创建一个和背景尺寸大小相同的CBitmap 把你的背景画在这个CBitmap 当你需要重绘背景时 就把这张位图贴上去
  • 打赏
  • 举报
回复
傻X 2013-02-17
引用 5 楼 jeraylee 的回复:
引用 4 楼 SunShineBoys1234567 的回复:创建内存双缓冲DC, 例如, CPaintDC dc(this); CDC* pDC; CBitmap bitmap; pDC->CreateCompatibleDC(&dc); // 创建一个内存兼容的dc bitmap.CreateCompatibleBitmap(&am……
那位仁兄的意思是,你原来绘制好的图先保存在内存CDC之中。然后以这个内存CDC为原型,在OnMouseMove中绘制坐标线在屏幕DC显示。 因为BitBlt和StretchBlt都有参数接口可以CDC为原型。
  • 打赏
  • 举报
回复
JERAYLEE 2013-02-17
引用 1 楼 dubiousway 的回复:
画图一般是双缓冲绘图 创建一个memdc,把要画的背景先画到这上面,然后每次更新,把memdc复制到屏幕hdc (这个方法你搜一搜,代码很多) ---------- 不过你的问题,应该不是这么解决。 有一种位操作叫异或运算;同样绘图也有一种方式叫异或绘制 用 SetROP2(R2_XORPEN), 你绘制完坐标线后,当更新鼠标位置,重新绘制新的坐标……
异或画图,坐标线不是原来颜色了。我想在异或还原之前的图后,丢掉异或该怎么操作?怎样丢掉,我这样,画笔颜色不变回来啊 onpaint() { 选择画笔;(画笔已初始化为红色) dc.异或; 用之前坐标还原背景; 当前坐标画坐标线; 之前坐标=当前坐标; }
  • 打赏
  • 举报
回复
相关推荐
发帖
界面
加入

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2013-02-17 12:42
社区公告
暂无公告