我创建一个单文档程序,在菜单的“打开”选项,则产生文件对话框,选择图片文件,点击文件对话框的打开按钮,则在窗口上显示图片。
我的程序已经能显示图片,但改变窗口大小,比如最大化,则图片消失。还请各位高手指点指点,不胜感激。
我的ONFileOpen事件 是在C***Doc 中响应。
显示图片在 OnDraw()中void CCBitmapShowDoc::OnFileOpen()
{
// TODO: 在此添加命令处理程序代码
CFileDialog fileDlg(true);
int nRespond=fileDlg.DoModal();
if(IDOK==nRespond)
{
    m_filePath = fileDlg.GetPathName();
    ASSERT(m_filePath);
    m_image.Load(m_filePath);  //m_image是C***Doc 中定义的变量

}
UpdateAllViews(NULL);
}void CCBitmapShowView::OnDraw(CDC* pDC)
{
CCBitmapShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
 // TODO: 在此处为本机数据添加绘制代码
CImage * pImage = new CImage;
pImage = &(pDoc->m_image);  //m_image为C***Doc类定义的变量
        filename = pDoc->m_filePath; //m_filePath 为C***Doc类定义的变量

//将其他格式的图片读入,并显示
if(filename!=_T(""))
{

HBITMAP hbitmap=pImage->Detach();
CBitmap* pBitmap=CBitmap::FromHandle(hbitmap); BITMAP bm;
pBitmap->GetBitmap(&bm); CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap* pOldImage=ImageDC.SelectObject(pBitmap);
//pDC->BitBlt(
pDC->StretchBlt(100,50,bm.bmWidth,bm.bmHeight,&ImageDC,0,0,bm.bmWidth ,bm.bmHeight,SRCCOPY);
//dc.StretchBlt(100,100,rect2.Width(),rect2.Height(),&ImageDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
ImageDC.SelectObject(pOldImage);
}}

解决方案 »

  1.   

    1.使用打印信息调试一下,是否每次都有调用StretchBlt绘制
    2检测参数是否有问题,尤其是绘制的大小和图片大小等参数
      

  2.   

    1. CImage * pImage = new CImage;
    pImage = &(pDoc->m_image); //m_image为C***Doc类定义的变量-----------
    这里使得, 每次pImage都指向的是Doc里的Image对象, 而不是新创建的2. HBITMAP hbitmap=pImage->Detach();
    --------
    这里使得Doc里的Image对象的图片失效, 所以每次只能绘制一次.
    这里你可以直接使用Graphics的DrawImage方法, 不必新建Image对象, 也不用Detach出现问题了.
      

  3.   

    你窗口图片消失,是因为窗口大小改变时,发生重绘了,可以试着在OnPaint函数中添加对图片的加载显示
      

  4.   

    if(filename!=_T(""))
    {HBITMAP hbitmap=pImage->Detach();
    CBitmap* pBitmap=CBitmap::FromHandle(hbitmap);BITMAP bm;
    pBitmap->GetBitmap(&bm);
    ==========
    这部分代码不要放在OnDraw中,这个放在ONFileOpen之中更合理一点。
      

  5.   

    3楼,你好。
    你说的第一条有道理,我已经改成:*pImage = pDoc->m_image; 就最终结果而言其实没影响。
    第二条,我将  HBITMAP hbitmap=pImage->Detach(); 改成:
            HBITMAP hbitmap=pImage->operator HBITMAP();
      这里不会 使得Doc里的Image对象的图片失效 吧, 但问题还是老样子。
    我想应该不是这里出错吧,因为每次重绘都调用OnDraw(),每次都将重新:
               CImage * pImage = new CImage;
      *pImage = pDoc->m_image;