关于GDI+使用双缓存显示图片

daodao315 2010-05-03 07:15:47
在一个基于单文档的程序中使用GDI+显示图片,比如jpg图片,为了使窗口大小改变时图片不产生闪烁现象,要使用双缓存处理。我是这样写的,在view类里面定义了两个成员变量Graphics *memgraph 和 Bitmap *membmp;在文件打开响应函数里面相关代码如下:

CFileDialog openfile(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,L"bmp,jpg|*.bmp;*.jpg| All Support File|*.bmp;*.jpg;*.png|");

if(openfile.DoModal()==IDOK)
{
strpath=openfile.GetPathName();
Bitmap *image=Bitmap::FromFile(strpath);
Bitmap bmp(image->GetWidth(),image->GetHeight());
membmp=new Bitmap(image->GetWidth(),image->GetHeight());
memgraph=Graphics::FromImage(membmp);
TextureBrush brush(image);
memgraph->FillRectangle(&brush,0,0,image->GetWidth(),image->GetHeight());
}


在OnDraw()里面的相关代码为:

if(!strpath.IsEmpty())
{
CDC *pDC=GetDC();
Graphics graph(pDC->GetSafeHdc());
CRect winrect;
GetClientRect(winrect);
graph.DrawImage(membmp,0,0,winrect.Width(),winrect.Height());
ReleaseDC(pDC);
}

这样还是有闪烁,我刚接触GDI+处理图像,请大家帮忙告诉一下GDI+中的防止闪烁现象应该怎么做呢.... 先谢谢了^_^
...全文
673 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
尹成 2010-05-04
  • 打赏
  • 举报
回复
另解:
void CXXXXXDlg::OnPaint()  
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CDC memDC; // 缓存DC
CDC selDC; // 选入图片的DC
HBITMAP hBmp;
HBITMAP hOldBMP;
memDC.CreateCompatibleDC(&dc);
selDC.CreateCompatibleDC(&dc);
hBmpMem = CreateCompatibleBitmap(dc.m_hDC, m_nCx, m_nCy);

// 画背景到缓存DC
memDC.FillSolidRect(0, 0, m_nCx, m_nCy, RGB(0, 0, 0));

// 画图片到缓存DC
hBmpMem = LoadBitmap(NULL, MAKEINTRESOURCE(ID_BMP1));
hOldBMP = memDC.SelectObject(hBmpMem);
memDC.BitBlt(0, 0, m_nCx, m_nCy, &selDC, 0, 0, SRCCOPY);

// 从缓存画到窗口DC
dc.BitBlt(0, 0, m_nCx, m_nCy, &memDC, 0, 0, SRCCOPY);

// 清除GDI对象

}

如果有闪烁, 处理一下 WM_ERASEBKGND 消息, 直接返回TRUE

ON_WM_ERASEBKGND()

BOOL CXXXXXDlg::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
尹成 2010-05-04
  • 打赏
  • 举报
回复
void   CRightView::OnDraw(CDC   *pDC)   
{
GetClientRect(&m_rectClient);

CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.CreateCompatibleBitmap(pDC,m_rectClient.Width(),m_rectClient.Height());
CBitmap* pOldBitmap;
pOldBitmap = dc.SelectObject(&bitmap);

//CBrush br(RGB(255,255,255));
//dc.FillRect(m_rectClient, &br);

CBrush br(OUTRGB);
CBrush* pOldBrush = dc.SelectObject(&br);
dc.Rectangle(0,0,m_rectClient.Width(),m_rectClient.Height());

dc.SetBkMode(TRANSPARENT);
//
// sort of plane model
//
for(int i = 0; i < GetDocument()->m_arrayPlane.GetSize(); i++)
{
int yPos = i*PLANESPACE+10 - GetDocument()->m_nRScrollPos;

if(GetDocument()->IsBoundary(i))
{
dc.MoveTo(m_rectClient.left,yPos+22);
dc.LineTo(m_rectClient.right,yPos+22);
}

CString strNO = GetDocument()->m_arrayPlane[i].m_strPlaneNO;
dc.TextOut(5,yPos,strNO.Right(2));
}

pDC->BitBlt(m_rectClient.left,
m_rectClient.top,
m_rectClient.Width(),
m_rectClient.Height(),
&dc,
0,
0,
SRCCOPY);

dc.SelectObject(pOldBitmap);
}
daodao315 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yincheng01 的回复:]

另解:C/C++ code
void CXXXXXDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CDC memDC; // 缓存DC
CDC selDC; // 选入图片的DC
HBITMAP ……
[/Quote]

谢谢啊,现在明白双缓存的意思了....^_^
daodao315 2010-05-03
  • 打赏
  • 举报
回复
没人看额....

19,468

社区成员

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

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