关于GDI+使用双缓存显示图片
在一个基于单文档的程序中使用GDI+显示图片,比如jpg图片,为了使窗口大小改变时图片不产生闪烁现象,需要使用双缓存处理。我是这样写的,在view类里面定义了两个成员变量...
在一个基于单文档的程序中使用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);
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+中的防止闪烁现象应该怎么做呢.... 谢谢了^_^ 展开
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);
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+中的防止闪烁现象应该怎么做呢.... 谢谢了^_^ 展开
1个回答
展开全部
双缓存应当在 背景缓存 里 绘图,绘完,一次copy到前景。
OnDraw() 里要有 ..BitBlt(...SRCCOPY)
有关函数:
1)、为屏幕DC 创建兼容的内存 DC:CreateCompatibleDC()
if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory;
{
::PostQuitMessage(0);
}
2)、创建位图:CreateCompatibleBitmap()
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;
3)、把位图选入设备环境:SelectObject(),可以理解为选择画布
::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
4)、把绘制好的图形“拷贝“到屏幕上:BitBlt(...SRCCOPY)
pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);
OnDraw() 里要有 ..BitBlt(...SRCCOPY)
有关函数:
1)、为屏幕DC 创建兼容的内存 DC:CreateCompatibleDC()
if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory;
{
::PostQuitMessage(0);
}
2)、创建位图:CreateCompatibleBitmap()
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp;
3)、把位图选入设备环境:SelectObject(),可以理解为选择画布
::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
4)、把绘制好的图形“拷贝“到屏幕上:BitBlt(...SRCCOPY)
pdcView->BitBlt(0, 0, rt.Width(), rt.Height(), &m_dcMemory, 0, 0, SRCCOPY);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询