大家好:       我用菜单形式打开的一幅bmp图像,经过处理后如果窗口移动了,图像会丢失。我是用StretchDIBits来显示图像的,怎样在ondraw中保持它?谢谢!

解决方案 »

  1.   

    如果是在OnDraw中写的显示位图的代码,你就不应该会有窗口重绘图像不见得问题啊
      

  2.   

    用菜单形式打开的一幅bmp图像后,Invalidate在 OnDraw  或者 OnPaint 中写绘制代码(通过判断是否有可用的图片对象数据)
      

  3.   

        我没有在ondraw中编写打开图像的代码。
        我是创建了一个菜单“打开一幅图像”,放在View类中,然后用StretchDIBits函数来显示。这幅图像经过我编写的阈值处理、滤波处理等菜单命令后,我仍然用这个函数来显示它的结果。但是一旦我的窗口移动了,原来处理的结果就没有了,变成了白屏。
         我知道这时发生了窗口重绘消息,但是就是不知到在哪里写程序保持它?是在ondraw中吗?怎么写?
         谢谢!!!
        
      

  4.   

    绘图和打开文件是两码事
    打开文件在哪都行
    绘图操作应该组织在OnPaint或OnDraw里
    至于怎么写
    没什么特别的啊
      

  5.   

    把你绘图的代码放到OnDraw函数中去做
      

  6.   

    你把处理的结果都放到MEMDC里面,然后再OnPaint或OnDraw里直接把MEMDC复制到显示DC里面就可以了,你处理好像要显示的时候就INVALIDATERECT就可以了,只要MEMDC里的数据一直在,重绘的时候就会画出来。
      

  7.   

    原来的代码搬到OnDraw()中就可以了,窗口重绘的时候会自动调用OnDraw()函数
      

  8.   

    我在打开菜单中是用下面的程序段显示图像处理的结果(是一幅机器人焊接时采集的焊缝图像),然后我把显示图像的代码放在了onDraw函数中:  
    void CMyView::OnDraw(CDC* pDC)
    {
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data heredib是建立的有关图像信息的类,放在了view类中 
    下面是我加的代码:
    int wide,height;
    wide=dib.GetWidth();//获得焊缝图像的宽度。
    height=dib.GetHeight();//获得焊缝图像的高度
    if(dib.GetRGB())
     {
       ::StretchDIBits(pDC->GetSafeHdc(),0,0,wide,height,0,0,wide,height,dib.GetData (),dib.GetInfo(),DIB_RGB_COLORS,SRCCOPY);
     }
    }
    编译的结果没有错,但是逐步调试显示:Unhandled exception in 图像处理.exe:代码:Access violation,说是GetWidth()函数处有问题。这我真的找不到原因了!!!
      

  9.   


    因为StretchDIBits存在不断"吃"内存的可能,建议将StretchDIBits改成StretchBlt要好很多,也方便.
      

  10.   

    应该有这样的一行伪代码
    if(dib.IsValid())
    {
      ...
      DrawthisDib();
    }没有初始化的dib会出问题