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

waitlife 2006-06-23 04:29:16
完整代码如下,其中 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),最好不要用其它的三方控件,谢谢!
...全文
314 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
waitlife 2006-07-11
  • 打赏
  • 举报
回复
要显示图片基本上没什么问题,但每次点击打开图片的按钮,当选择图片的窗口挡住Picture控件中的图像时,图像就不会自动重绘,我试过用图像控件自己的变量m_pic.setbitmap,则不会出现这个问题,不知道是什么问题!
Soft_micro 2006-06-30
  • 打赏
  • 举报
回复
用DirectDraw的离屏缓冲,翻页,图像平滑。
一剑 2006-06-30
  • 打赏
  • 举报
回复
GetDC()得到对话框的DC
GetClientRect(&rc);
rcw=rc.Width();
rch=rc.Height();
objBmp.GetBitmap(&bmp);
bmw = bmp.bmWidth;
bmh = bmp.bmHeight;

dc.CreateCompatibleDC(pDC);
pOldBmp=dc.SelectObject(&objBmp);
for(int j=0; j<rch; j+=bmh)
for(int i=0; i<rcw; i+=bmw)
pDC->BitBlt(i, j, rcw, rch, &dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBmp);


waitlife 2006-06-30
  • 打赏
  • 举报
回复
up
waitlife 2006-06-29
  • 打赏
  • 举报
回复
up
waitlife 2006-06-29
  • 打赏
  • 举报
回复
我的目的是在对话框的图像控件上显示JPG(包括BMP、GIF)图像,不只是BMP图像,我想直接用IPicture接口来显示,因为还要考虑它在数据库中的存取问题,请各位帮忙看看,最好有示例代码,谢谢!
kugou123 2006-06-26
  • 打赏
  • 举报
回复
得到对话框的DC,然后创建一个兼容内存DC,先拷贝图片到内存DC,再复制到对话框DC,再Invalidate更新刷新即可。
huaren801007 2006-06-26
  • 打赏
  • 举报
回复
应该用不着copymemory,估计也就是BitBlt一下,可能楼主不会使用内存DC
delphiseabird 2006-06-26
  • 打赏
  • 举报
回复
copymemory??
waitlife 2006-06-26
  • 打赏
  • 举报
回复
可否贴出代码?
waitlife 2006-06-24
  • 打赏
  • 举报
回复
我想您误会我的意思了,上面的代码就是显示图片的呀!我的目的是在对话框点击按钮选择图像文件后,在图像控件上显示动态的图片。我看过很多双缓冲的例子,但都是针对MDI/SDI客户区显示图片的,包括MSDN上的那个例子。
booklove 2006-06-23
  • 打赏
  • 举报
回复
绘图的操作要放在OnPaint里

选完文件后InvalidateRect

双缓冲的例子网上很多,你把你的代码贴出来看看

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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