怎么样在内存绘图?(有点难度)

OnceILoveLinda 2004-01-15 07:29:51
下面的代码在OnDraw时间里,OnTimer控制m_nPostion变量。
结果是一个时刻只能有一条直线,OnTimer每Invalidate一次。原来的直线没了。
怎么在内存绘图,OnTimer显示,保证原来的图像还有呢?
void CDynViewView::OnDraw(CDC* pDC)
{
CDynViewDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen *oldpen;
oldpen=pDC->SelectObject(&pen);
pDC->MoveTo(m_nPositon,100);
pDC->LineTo(m_nPositon,100-m_nPositon);
pDC->SelectObject(oldpen);
// TODO: add draw code for native data here
}
...全文
84 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lambochan 2004-01-15
  • 打赏
  • 举报
回复
这样处理:把CDC dcMem和CBitmap bmp,*pOldBitmap放入类中,然后将它初始化..
void CxxxView::ChuShiHua()
{
CDC *pDC = GetDC();
dcMem.CreateCompatibleDC(pDC);
CRect rc;
GetClientRect(&rc);

bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
pOldBitmap = dcMem.SelectObject(&bmp);
CBrush brush(RGB(xx,xx,xx));//颜色自己喜欢
dcMem.FillRect(&rc,&brush); //刷..
ReleaseDC(pDC);

}
然后可以在OnDraw或OnPaint里用dcMem绘图了..
最后记得析构
dcMem.SelectObject(pOldBitmap);
dcMem.DeleteDC();
bmp.DeleteObject();
OnceILoveLinda 2004-01-15
  • 打赏
  • 举报
回复
谢谢
lambochan 2004-01-15
  • 打赏
  • 举报
回复
内存DC里的位图为默认的1x1单色位图,能画什么?keke
所以要创建兼容位图并选入内存DC..
wyssoft 2004-01-15
  • 打赏
  • 举报
回复
为什么要用到:
bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
dcMem.SelectObject(bmp);
lambochan 2004-01-15
  • 打赏
  • 举报
回复
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmp;
CRect rc;
GetWindowRect(&rc);

bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
dcMem.SelectObject(bmp);
; CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen *oldpen;
oldpen=dcMem.SelectObject(&pen);
dcMem.MoveTo(m_nPositon,100);
dcMem.LineTo(m_nPositon,100-m_nPositon);
dcMem.SelectObject(oldpen);
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);
======================================================================
默认是黑色的,插入句:
CBrush brush(RGB(xx,xx,xx));//颜色自己喜欢
dcMem.FillRect(&rc,&brush);
OnceILoveLinda 2004-01-15
  • 打赏
  • 举报
回复
解决不了啊
OnceILoveLinda 2004-01-15
  • 打赏
  • 举报
回复
我是想用一个内存,直接在OnTimer事件改变
变量的值,同时绘制内存块。再在OnDraw里面把
内存copy一份出来,应该不用自定义的数据结构才是啊
OnceILoveLinda 2004-01-15
  • 打赏
  • 举报
回复
这样好象还是不行的,我也式过,背景会变成
全黑的。而且中间只有一条直线移动。
fzd999 2004-01-15
  • 打赏
  • 举报
回复
这不是内存绘图,呵呵~

OnDraw会重画整个界面,所以你应当建立一个数据结构来储存你画的图,否则上次画的图保留不到下次的。
COOL099 2004-01-15
  • 打赏
  • 举报
回复
dcMem設成全局或靜態的.
COOL099 2004-01-15
  • 打赏
  • 举报
回复
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);
CBitmap bmp;
CRect rc;
GetWindowRect(&rc);

bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());
dcMem.SelectObject(bmp);
; CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
CPen *oldpen;
oldpen=dcMem->SelectObject(&pen);
dcMem->MoveTo(m_nPositon,100);
dcMem->LineTo(m_nPositon,100-m_nPositon);
dcMem->SelectObject(oldpen);
pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

16,472

社区成员

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

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

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