如何使用双缓冲在对话框中显示图片

waitlife 2006-06-23 04:27:14
完整代码如下,其中 IDC_EMPPHOTO 为标准图像控件:

  static TCHAR BASED_CODE szFilter[] = _T("JPG Files (*.jpg)|*.jpg|All Files (*.*)|*.*||");
  CFileDialog dlg(TRUE, _T("JPG"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
  if (dlg.DoModal() == IDOK)
    {
      strPhotoPathName = dlg.GetPathName();
      if (strPhotoPathName != _T(""))
      {
        CWnd *pWnd = GetDlgItem(IDC_EMPPHOTO);
        CRect rect;
        pWnd->GetClientRect(&rect);
        CDC *pDC = pWnd->GetDC();

        IStream *pStm;
        CFileStatus fstatus;
        CFile file;
        LONG cb;
        IPicture *pPic;

        if (file.Open(strPhotoPathName,CFile::modeRead)&&file.GetStatus(strPhotoPathName,fstatus)&& ((cb = fstatus.m_size) != -1))
        {
          HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
          LPVOID pvData = NULL;
          if (hGlobal != NULL)
          {
            if ((pvData = GlobalLock(hGlobal)) != NULL)
            {
              file.Read(pvData, cb);
              GlobalUnlock(hGlobal);
              CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
            }
          }
        }
        if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&pPic)))
        {
          OLE_XSIZE_HIMETRIC hmWidth;
          OLE_YSIZE_HIMETRIC hmHeight;
          pPic->get_Width(&hmWidth);
          pPic->get_Height(&hmHeight);
          if(FAILED(pPic->Render(*pDC,0,0,rect.Width(),rect.Height(),0,hmHeight,hmWidth,-hmHeight,NULL)))
          AfxMessageBox(_T("渲染图像失败!"));
            pPic->Release();
        }
        else
          AfxMessageBox(_T("从流中装载图像失败!"));
      }
    }

这些代码可以正常在控件中显示图片,在只要移动一个窗口(遮住显示图件的控件),则图片就不能正常重绘,看过网上很多代码,大多数是针对客户区在OnPaint中利用双缓冲技术画,然后在OnDraw中BitBlt一次,则不会出现闪烁,我也试了很久,但都没有成功,请教各位到底如何才能完美地在图像控件中动态显示图片(Jpg、Gif、Bmp),最好不要用其它的三方控件,谢谢!
...全文
279 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
noisy_x 2006-07-13
  • 打赏
  • 举报
回复
其实绘图的代码放在什么地方都可以的,只要在需要绘图的地方通过GetDC()得到pDC,然后用bitblt贴MemDC里面的图就可以了。
booklove 2006-07-11
  • 打赏
  • 举报
回复
你的这段代码是放在什么地方的?
绘图的部分要放在OnPaint里。
waitlife 2006-07-11
  • 打赏
  • 举报
回复
要显示图片基本上没什么问题,但每次点击打开图片的按钮,当选择图片的窗口挡住Picture控件中的图像时,图像就不会自动重绘,我试过用图像控件自己的变量m_pic.setbitmap,则不会出现这个问题,不知道是什么问题!
waitlife 2006-06-26
  • 打赏
  • 举报
回复
一样的还是会有些不能正常绘制,好像非得用bitblt这种形式了,用IPicture接口Render总是不正常。
hijack 2006-06-25
  • 打赏
  • 举报
回复
“单击一个按钮”后画图
OnPaint调用BitBlt
hurryboylqs 2006-06-25
  • 打赏
  • 举报
回复
直接在OnPaint函数的最前面画图就可以了(一定得在该函数的最开始处,否则画不出).......
waitlife 2006-06-25
  • 打赏
  • 举报
回复
up
waitlife 2006-06-24
  • 打赏
  • 举报
回复
搜出来的都是针对MDI/SDI的,我的目的是想在对话框单击一个按钮选择图片后,在图像控件上显示出来,当其它窗口移动遮住它再移走时,图像控件上的图片应该能够正确显示,而不是显示出被遮住的一片空白。
arrow8209 2006-06-23
  • 打赏
  • 举报
回复
CMemDC 网上去搜,很多得。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧