首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-03-07 
******无闪烁绘制标题栏及二次缓冲问题***** 下面的代码是绘制标题栏的(贴图法),为什么我的标题栏仍然有些

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

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

热点排行