关于贴图闪屏使用双缓冲解决提问

来源:百度知道 编辑:UC知道 时间:2024/06/16 04:46:21
有个程序,在视类中需要贴图,并且在上面显示些用于输入的文字,文字内容改变后贴图和文字都会重绘,以显示最新的状态.
但会出现闪屏,下面贴出代码,并说明运行的方向.

PS:查了一些资料解决办法有刷新特定的矩形区域、设置返回背景、双缓冲等等。其中不重绘背景确实有效,但理想的还是使用双缓冲.并且有资料说,贴图黄金法则是只画一次,要要怎么样才能画一次,如果只画一次下次重绘的时候不是没背景贴图了?
另外我使用的是Cimage类,显示PNG图片,没有找到这方面的双缓冲资料,特询问大家,下面的代码要是改成双缓冲来解决闪屏要怎么修改.

在Doc中加载图片,Cimage m_Image;
void CExpressPrintDoc::ShowImage(CString &str)
{
POSITION pos = GetFirstViewPosition();
CExpressPrintView *pView = (CExpressPrintView*)GetNextView(pos);
m_Image.Destroy();
m_Image.Load(str);
pView->OnInitialUpdate();
}
因为执行OnInitialUpdate函数后会调用OnDraw,所以上面的代码中没有加重绘消息.
void CExpressPrintView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();

CExpressPrintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

CSize sizeTotal;
// TODO: 计算此视图的合计大小
if (!pDoc->m_Image.IsNull())
{

双缓冲是这样用的,我只改你绘制部分的代码(代码保证不会有问题,但是我不是在vc下写的,有些函数的大小写可能要改一下),
有看不明白的地方就mailto:huangzongwu@hotmail.com

// TODO: 在此处为本机数据添加绘制代码
if (!pDoc->m_Image.IsNull())
{
int nIndex1 = pDoc->m_nMoveXy.GetSize();

/////////////////////////
// 创建字体,与CreatePointFont展开一样
HFONT font;

LOGFONT logFont;
memset(&logFont, 0, sizeof(LOGFONT));
HDC hDC = ::GetDC(NULL);
logFont.lfCharSet = DEFAULT_CHARSET;
logFont.lfHeight = 110;
lstrcpyn(logFont.lfFaceName, _T("宋体"), sizeof(logFont.lfFaceName) / sizeof(logFont.lfFaceName[0]));

POINT pt;
pt.y = ::GetDeviceCaps(hDC, LOGPIXELSY) * logFont.lfHeight;
pt.y /= 720; // 72 points/inch, 10 decipoints/point
::DPtoLP(hDC, &pt, 1);
POINT ptOrg = { 0, 0 };
::DPtoLP(hDC, &ptOrg, 1);
logFont.lfHeight = -abs(pt.y - ptOrg.y);

::ReleaseDC(NULL, hDC);