读书人

*无闪烁绘制标题栏及二次缓冲有关问题*

发布时间: 2012-03-07 09:13:51 作者: rapoo

******无闪烁绘制标题栏及二次缓冲问题*****

下面的代码是绘制标题栏的(贴图法),为什么我的标题栏仍然有些闪烁呢?我见人家好象基本也是这样绘制的,为什么他们的没闪烁(伸缩窗口时,能平滑的绘制)?
帮我改改,看那些地方还需要改进?我在响应
case WM_PAINT:
case WM_MOVE:
case WM_NOTIFY:
case WM_NCPAINT:
这几个消息时画的:


BOOL DrawCaption(HINSTANCE hInstance,HDC hDCTitle,RECT rectTitle)
{


RECT temrc,rcInvalidate;
if(NULLREGION==GetClipBox(hDCTitle,&rcInvalidate)) //获取无效巨型区域
{
return FALSE;
}
if(!IntersectRect(&temrc,&rectTitle,&rcInvalidate)) //计算无效矩形是否落在边框上
{
return FALSE;
}

int nWidth = temrc.right - temrc.left;
int nHeight = temrc.bottom- temrc.top;


HDC memSrcDC = CreateCompatibleDC(hDCTitle); //创建一个兼容的内存DC
HDC memBufDC = CreateCompatibleDC(hDCTitle); //缓冲内存兼容DC

HBITMAP hbmpOld=(HBITMAP)SelectObject(memSrcDC,hBmTitle);//将原位图选入内存DC
HBITMAP hBufBmp = CreateCompatibleBitmap(hDCTitle,nWidth,nHeight); //创建一个兼容位图
HBITMAP hOldBufBmp = (HBITMAP)SelectObject(memBufDC,hBufBmp); //将兼容位图选入到缓冲DC
HBRUSH hbr = CreateSolidBrush(RGB(0,189,255));
FillRect(memBufDC,&temrc,hbr); //fill白色背景

for(int i=0;i <nWidth;i=i+bmTitle.bmWidth)
{

StretchBlt(memBufDC,i,0,bmTitle.bmWidth,nHeight,
memSrcDC,0,0,bmTitle.bmWidth,bmTitle.bmHeight,SRCCOPY);

}

//从缓冲DC拷贝到屏幕(位块传送)
BitBlt(hDCTitle,temrc.left,temrc.top,nWidth,nHeight,memBufDC,0,0,SRCCOPY);

SelectObject(memSrcDC,hbmpOld);
SelectObject(memBufDC,hOldBufBmp);

DeleteObject(hBufBmp);
DeleteObject(hbr);
DeleteDC(memBufDC);
DeleteDC(memSrcDC);

return TRUE;

}

[解决办法]
mark一下

读书人网 >VC/MFC

热点推荐