我在对话框的一个区域rc做画图板,需要既可以在onmousemove里面绘制,也可以加载外部位图。现在都可以正常显示了,但是一旦被其他窗口遮盖或者最小化就没了。怎样用memdc(最好是vc2008自带的CMemDC)来实现无论是手绘还是加载外部图片都不会在窗口重绘的时候消失呢?

解决方案 »

  1.   

    你绘图的代码如果不在OnPaint中的话,会出现你所说的问题
      

  2.   

    这和内存DC没有关系。内存DC只是用来画图,并不能解决什么时候去画。你需要在OnPaint中调用你的绘图代码。
      

  3.   

    请教如何把OnPaint与OnMouseMove还有图片联系起来呢?图形并没有固定的绘制过程啊。
      

  4.   

    你可以申请一块内存,大小与你在对话框中的的绘图区一致。
    然后在OnPaint()中的代码是将这个块内存的图片显示出来。
    你用鼠标或Load图片只要将绘的和Load的图到那块内存去。
      

  5.   

    写一个专门的绘图的函数,函数带一些参数,通过这些参数来绘制不同的特征。然后在OnMousemove里根据当前不同的状态设置这些特征参数的值,设置好后就用Invalidate()刷新窗口。
    而那个绘图函数就放在OnPaint里被调用。
    还有,你看不见与内存绘制没有任何关系!内存绘制是效率与闪烁的问题,我想你在这里可以不需要!
      

  6.   

    一般的解法方法就如楼上所说,在OnPaint中画图,在OnMouseMove中记录鼠标位置,用Invalidate来更新,触发OnPaint
      

  7.   

    补充一下,每次用鼠标或Load图片后用Invalidate()来触发WM_PAINT消息
      

  8.   

    你把OnMouseMove中绘制的内容记录下来,然后在OnPaint中绘制它
      

  9.   

    这个做法可以不一定行,在OnMouseMove中可能会用到当前鼠标的位置,不好记录,所以还是用一个类变量或是全局变量记录鼠标位置,在OnPaint中作图。
      

  10.   

    我发现OnMouseMove里面鼠标的坐标并不是连续的,这个以前也发现过,比如很快地拖动鼠标会发现画出的线不是连续的。后来我是通过LineTo连接起点和终点来解决移动过快时不连续的问题的。估计画图板也是这样做的。
    说了半天就是OnMouseMove里面鼠标的坐标并不是连续的,我没能想到记录的办法
      

  11.   

    另外,假如是载入图片,那数据应该相当大,不同于OnMouseMove,又该怎么办呢?我看网上有人说用内存DC或者向量,不知道是不是?欢迎讨论,分不是问题
      

  12.   

    OnMouseMove不连续是很正常的,记录这些点也不难啊,用一个动态数组不就行了。
    载入图片肯定是用到内存DC,然后贴图就是了,比上面这个还简单一点。
      

  13.   

    载入图片,数据很大?这与画图有什么关系,数据大你存起来就行了!总不会大得超过你内存吧!
    首先你要明白,任何显示在界面上的东西,其背后都需要数据来支持的,点,线,面,图片,这些都存在相应数据结构中,而窗口显示是通过DC从这些数据结构中取出数据并依据相应的关系画在窗口的界面上(也称作窗口DC),OnPaint函数是用来重画的,也就是当前窗口被其它窗口覆盖时,你窗口上的东西将会被擦除,但此时被擦除窗口的WM_PAINT消息将会被触发,也就是OnPaint函数会被调用,而此时你又在OnPaint的函数中,通过提取存在程序中的数据进行重绘,被擦除的内容才能被重新显示出来!这就是图象显示的整个原理!不要以为图象被一次画到窗口上就永远存在了!