本帖最后由 yeman999 于 2011-07-11 19:07:15 编辑

解决方案 »

  1.   

    看起来是对话框处理了wm_erasebkgnd。
      

  2.   

    如何解决呢?重写wm_erasebkgnd对应的虚函数?里面应该做什么操作呢?
      

  3.   

    照lz说法应该没处理wm_erasebkgnd,既然没处理发生这个透明现象就奇怪了,
    有一点要说的就是,OnPaint里调用UpdateWindow()或Invalidate()之类的难道不会造成循环调用?
    UpdateWindow()或Invalidate()可都会引起WM_PAINT呀,lz你想想?
      

  4.   

    代码补全。
    可能原因在于DrawToHDC( hDC, &rect );这个HDC是什么?另外双缓冲DC需要画布。
      

  5.   


    void CmediaCutterDlg::ShowImage( IplImage* img, UINT ID )
    { CDC* pDC = GetDlgItem( ID ) ->GetDC();

    HDC hDC = pDC ->GetSafeHdc(); CRect rect;
    GetDlgItem(ID) ->GetClientRect( &rect );

    int rw = rect.right - rect.left;
    int rh = rect.bottom - rect.top;

    int iw = img->width;
    int ih = img->height;
    // 使图片的显示位置正好在控件的正中
    int tx = (int)(rw - iw)/2;
    int ty = (int)(rh - ih)/2;
    SetRect( rect, tx, ty, tx+iw, ty+ih );

    ::CvvImage cimg;
    cimg.CopyOf( img );

    cimg.DrawToHDC( hDC, &rect ); ReleaseDC( pDC );
    }
      

  6.   

    你把onpaint内showImage的调用注释掉确定是不是它影响的,函数本身没看出啥问题,
      

  7.   

    在OnPaint里应该用CPaintDC
    这里
        {
            
            CDialog::UpdateWindow();//1不Update的话有前景覆盖图片后无法显示        ShowImage( TheImage, IDC_ShowImg );//2
            //Invalidate();
            CDialog::OnPaint();
        
    去掉CDialog::OnPaint();
    用CPaintDC实现ShowImage的功能
    整个客户区用一个背景色盖一下