刚想到一个方法,先在内存中创建两个 Memory DC,这是一个存在内存里的 dc ,它除了不像form picturebox能将图形、文字显示出来之外,其他的几乎都相同.
一个存储背景,一个用来绘制。 绘制过程是:1、用 BitBlt 拷贝背景 dc 到绘制 dc  '相当于 .cls
2、在绘制 dc 上绘制图形
3、用 BitBlt 拷贝绘制 dc 到图片框   '相当于 .Refresh 这样就完成了整个过程,既不用 .cls 也不用 .Refresh 全部用BitBlt 代替了
还要在 Paint 事件中重绘,不过在 dc 上绘制好象比在 picturebox 上慢好多,不知道怎回事?

解决方案 »

  1.   

    cls与refresh全能引起闪烁,现介绍一种在286上用到的方法,如果线段绘制后不需计算,则用背景色重绘一条,盖住前景线段,在空闲时,统一清除。
    或者用一个单独位面作存储区,现绘制到存储位面上,大约22各指令周期后拷入前景位面,就会与人眼同步
      

  2.   

    经过测试 创建 Memory DC方法绘图至少比普通方式快 30%-50% ,且更具有灵活性, 下面是创建 Memory DC 的部分代码。Kivic(Kivic) 说的是绘图中的擦除法,如果配合局部操作在一般绘图中也许速度最快,但是绘制含有位图等多层复杂图形的话则很难适用。我能找到的资料和代码无论中间处理过程是怎样,最后都是用BitBlt 将图形拷贝到窗口,因为我的中间绘图过程速度足够,现在就是想怎样用最快的速度将画好的位图贴到窗口,但是最后拷贝这一步恐怕是找不到速度更快的新招了,除非是直接针对显示卡或者专用驱动之类,想来就复杂程度得不偿失了。        '创建 Memory DC
            sDC = CreateCompatibleDC(GetDC(0))
            sBitmap = CreateCompatibleBitmap(GetDC(0), DCInfo.bmWidth, DCInfo.bmHeight)
            sPrv = SelectObject(sDC, sBitmap)
            SetBkMode sDC, TRANSPARENT现在问题是内存中创建的 dc 尺寸是否能够改变呢?如果不能每次改变窗口大小的时候就要重新创建啦。那位熟悉朋友指点一二
      

  3.   

    嘿嘿 仔细考虑了流程并做了测试,发现擦除方式就是快,关键部分是整块擦除不能用填充擦除,要用Rectangle 覆盖啦。