我建立的工程是单文档视图结构,在DOC类中我定义了一个函数OnFileOpen,它实现了打开一个位图文件,在该函数中我用malloc函数在内存中开辟了一段存储空间存放位图图像数据,并返回一个指向这段存储区的BYTE * 指针。在View类中的OnPaint函数中用SetDIBitsToDevice实现显示打开的位图,OnPaint函数用Invalidate(false);语句结束,然后我又在View类中定义了一个改变图像象素值的函数,修改是根据那个BYTE *指针对那段存储空间中某些象素值进行修改,在该函数中没有用Invalidate和UpdateDate,但是只要该函数执行,刚才显示的图像马上发生变化。程序执行顺序是:打开位图图像并显示后点击菜单执行修改象素值函数,我并没有触发一个消息让视图区域重绘,我不明白为什么图形会发生变化?
希望高手们能给一些指教,多谢了!

解决方案 »

  1.   

    肯定调用了OnPaint。  不信在 OnPaint中设置一个断点
      

  2.   

    那你跟跟
    看从那里进OnPaint的?
      

  3.   

    OnPaint函数用Invalidate(false);不要调用。Invalidate()本身触发WM_PAINT消息,这不就形成循环了?
      

  4.   

    菜单弹出时遮盖了一部分客户区,当点击菜单完成时,客户区发生改变,MFC就自动调用OnPaint()了。
      

  5.   

    如果你定义的BYTE*直接指向了当前DC中的位图数据。那么你对位图的修改是直接会反应到主窗体中的,最好的做法是创建的位图不要选入窗体的DC中,这样你对位图的修改就不会在窗体中显示了,在需要时使用Bitblt或选入该位图就可以了。
      

  6.   

    Mackz(在相互) 和vcPlayer(我是一只小小鸟!) 说的情况都可能发生在你的程序里,甚至可能同时在上演!我奇怪你在OnPaint里调用Invalidate(false),难道你的程序没有因为Stack overflow而当掉吗?你可能让程序开着,等一段时间,它自己就crash了。在它没有crash之前,这个递归循环在不停的运转,也就是画面在不停的OnPaint...OnPaint...OnPaint...,这是造成修改内存立即有反映的最可能原因。你可以打开系统的任务管理器看看CPU时间是不是一直大量的被占用着。
      

  7.   

    AgedBOY兄说的没错,CPU占有率确实很高,我把OnPaint中的Invalidate();去掉后,运行程序,选择打开一个bmp文件,该对话框出现在视图客户区,但是图形只出现了一部分,而这一部分图形恰好就是该对话框在视图区域所占据的那一部分。然后我用鼠标拉了一下视图框的边界,图像就全部出现了,我想图形只出现一部分很可能是因为对话框的出现与消失所引起的那一部分出现刷新,别的视图区域没刷新,而OnPaint里用Invalidate();就一直刷新,现在我换了另一种方法,我把OnFileOpen改写到View里,然后在该函数里用Invalidate();结束,这样就可以触发OnPaint函数了,在修改象素值的函数里也调用一下Invalidate();这样原来的bug就没有了,也更好一些。非常感谢各位高手的教导,我现在终于明白了!