用VC6做一个简单的画图软件. 功能是在一个网状图上画图. 网状的每个网孔表示画图的每一个像素.
该网状大小大概为1000*1000. 现在遇到问题是我鼠标在上面画一个填充的矩形并且鼠标滑动时候矩形大小也会跟着变化.
我在OnMouseMove中不停地重画内存并在OnDraw中copy到DC显示. 现发现鼠标滑动变化填充矩形响应速度很慢.
鼠标滑动到其他地方去了, 该矩形要等一下才能变化到鼠标所指示的大小.
调试发现主要问题是画网状线消耗了资源:
for(i=0; i <= 1000; i+)
{
         MyConsole.m_pMemDC->MoveTo(..);
MyConsole.m_pMemDC->LineTo(..);
}
for(i=0; i <= 1000; i++)
{
MyConsole.m_pMemDC->MoveTo(...);
MyConsole.m_pMemDC->LineTo(...);
}
请问有什么办法能减少画网状态图消耗的资源?

解决方案 »

  1.   

    考虑网状图只画一次,画一次后保持CDC的状态,在此基础上再画矩形
      

  2.   

    对,就按照楼上的做,保存到CBitmap中,然后每次BLTBLT
      

  3.   

    谢谢了. 这么样是否需要两个CBitmap. 一个是保存网状等background(这个网状可以放大缩小因此需要使用单独的一个CBitmap). 另外一个是保存画图的内容. 请问如何将一个CBitmap copy到另外一个CBitmap中去? 
      

  4.   


    不需要,在不销毁MemDc的情况下,每次都pDC->BitBlt(0,0,m_nWide,m_nHigh,&MemDc,0,0,SRCCOPY);然后画矩形
      

  5.   

    我现在已经将pDC->BitBlt(0,0,m_nWide,m_nHigh,&MemDc,0,0,SRCCOPY);放在OnDraw中.
    我准备想用两个memdc. 一个是保存网格. 一个是画变化的图形. 
      

  6.   

    1000*1000个矩形的绘制,GDI肯定吃不消。再怎么优化,只要GDI绘1000*1000次,速度都快不起来。要缓解这个问题,只有换思路:
    1、要么不要在MouseMove的时候动态绘制(比如在鼠标拖动的时候只画一个框,在鼠标松开的时候再绘制所有矩形)
    2、要么使用各种裁剪手段减去绘制次数(比如用一个大矩形来代替1000*1000个小矩形,或者使用脏矩形技术来裁切掉不必要的绘图部分)
    3、要么干脆弃用GDI,使用其它更高效的绘制手段来绘制这些动态效果(如D3D)考虑综合情况,建议使用1、2两种方式。
      

  7.   

    晕,最近怎么老看错LZ的话。上面那段当我没说吧。如果是1000+1000次网格线的绘制的话,那就简单很多,两个方法:
    1.预先在MemDC中绘制好网格,之后每次将其Blt出来。
    2.不要使用LineTo,自己获取lpBits然后操作位图像素数据来绘制网格。
      

  8.   

    还是不行. 效率好像没怎么提高. 我使用MyConsole.m_pLayoutDC保存网格线. 网格线DC很少被刷新,除非使用了ZoomIn/ZoomOut后更新网格DC. 另外使用MyConsole.m_pMemDC来根据BMP图片填充各格子(每个格子对应BMP的每个像素). 鼠标选中一点后滑动, 我希望可以像excel那样被划过的处于影印状态. 我在OnMouseMove中不段地调用一个函数
    void CBMPView::RefreshView()
    {
    ...
    MyConsole.m_pMemDC->BitBlt(0,0,size.cx,size.cy, MyConsole.m_pLayoutDC,0,0,SRCCOPY);
    ...根据BMP图片填充小格子.
    Invalidate();
    }void CBMPView::OnDraw(CDC* pDC)
    {
    CPoint Point_Temp;
    CSize size,sizeSb;
    Point_Temp = GetScrollPosition();
    GetTrueClientSize(size, sizeSb); pDC->BitBlt(Point_Temp.x,Point_Temp.y,size.cx,size.cy, MyConsole.m_pMemDC,Point_Temp.x,Point_Temp.y,SRCCOPY);
    }
    CBMPView为CScrollView的子类. 我在OnDraw中只刷新当前窗口部分.
    现在移动鼠标很久才会正确刷新到正确位置, 根本没有excel那样非常顺滑. 请问是否需要更改方法?
      

  9.   

    搞定了. 不是画图算法问题. 应该是在鼠标滑动时候不能频繁地OnDraw. 我现在用定时器来刷新OK效果非常好