本帖最后由 VisualEleven 于 2014-03-17 10:24:20 编辑

解决方案 »

  1.   

    内存DC用全局的
    OnPaint里只是BitBlt就可以了快的你屌毛都能随风竖起来
      

  2.   

    m_ps is a public member variable of type PAINTSTRUCT. It is the PAINTSTRUCT that is passed to and filled out by CWnd::BeginPaint. m_ps 有需要的重绘区, 不在重绘区的绘制都是白费劲,所以重绘量大时,一定要检测重绘区.
      

  3.   

    一般都是线程里面画好,OnPaint里面BitBlt出来
      

  4.   

    OnPaint里运算周期太长,把显示是速度拉下去了
      

  5.   

    双缓冲的本意就是后台绘图,在OnPaint只是贴图。而你的代码是在OnPaint中绘图到内存Dc加贴图,还不如直接在OnPaint中绘图到PaintDc呢(虽然都很慢)
      

  6.   

    取重画区,重画区以外的不重画
    CRect rcClip;
    dc.GetClipBox( rcClip );
    这是比较通用的方法,还要根据实际情况来处理。楼主的1w多点是不是可以先筛选,因为屏幕只有1k多点,窗口可能更小,先把重复或重画区以外的去掉,再画,数据量就小多了。第二,如果是一个移动的曲线,用scrollwindow移动图形,这个极高效,基本不用时间,硬件完成,移完以后的空白部分只有2 -3个像素列,画的就很快了。MFC的重画看似简单,实际有很多技巧,要实现高效、流畅、不闪,要处理很多细节,可能比算法代码用时长的多。看看word和photoshop,画图量很大,用户体验却非常好。另外,如果很偏重界面,可以考虑用DX,画图功能更多一些,效率方便可以少考虑一些。