******无闪烁绘制标题栏及二次缓冲问题*****
下面的代码是绘制标题栏的(贴图法),为什么我的标题栏仍然有些闪烁呢?我见人家好象基本也是这样绘制的,为什么他们的没闪烁(伸缩窗口时,能平滑的绘制)?
帮我改改,看那些地方还需要改进?我在响应
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一下