void COwnBmpButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
// TODO: Add your code to draw the specified item
CDC ButtonDC;
CBitmap BitMapTrans;
BITMAP bmp;
CDC mem;
CRect rc;
ButtonDC.Attach(lpDrawItemStruct->hDC);
mem.CreateCompatibleDC(&ButtonDC);
GetClientRect(&rc);
//rc = lpDrawItemStruct->rcItem;
UINT state =  lpDrawItemStruct->itemState;
if(!m_State)
{
BitMapTrans.LoadBitmap(IDB_DOWN);
BitMapTrans.GetBitmap(&bmp);
CBitmap *old = mem.SelectObject(&BitMapTrans);
ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
mem.SelectObject(old);
BitMapTrans.DeleteObject();
ButtonDC.SetBkMode(TRANSPARENT);
ButtonDC.SetTextColor(RGB(0,110,100));
ButtonDC.DrawText(m_strFocus,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);

}
else
{
BitMapTrans.LoadBitmap(IDB_UP);
CBitmap *old2 = mem.SelectObject(&BitMapTrans);
BitMapTrans.GetBitmap(&bmp);
CBitmap *old = mem.SelectObject(&BitMapTrans);
ButtonDC.StretchBlt(rc.left,rc.top,rc.right,rc.bottom,&mem,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

ButtonDC.SetBkMode(TRANSPARENT);
ButtonDC.SetTextColor(RGB(0,110,100));
ButtonDC.DrawText(m_strLostFocus,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
mem.SelectObject(old2);
BitMapTrans.DeleteObject();
}
}以上代码是自绘按钮中显示位图,现在在窗体中添加多个这种按钮,每个按钮显示不同的位图,结果当鼠标移动到按钮上时偶尔会出现闪烁白色区域,是不是刷新的问题,如果用双缓存该怎么改呢,请大侠指点!!在线等,答者有分

解决方案 »

  1.   

    先做如下更改试试:把承载按钮的窗体加上风格“WS_CLIPCHILDEN"
    按钮本身重载"OnEraseBackgroud" 直接return TRUE
      

  2.   

    Bitmap可以只Load一次,不用每次都Load,另外,你刷新的时候是不是调用过invalidat?
      

  3.   

    估计你跟踪了数遍移动消息并触发鼠标离开消息,在这些消息里面调用了Invalidate
      

  4.   

    可能鼠标触发Invalidate消息太多了。
      

  5.   

     你试试状态的 判断
    // click state, 按下去的状态
    if( lpDrawItemStruct -> itemState & ODS_SELECTED         {
    }
    else if ( m_hover)// hover state, 移上去的状态
    {
    }
    else// enable state, 正常的状态
    {
    }
      

  6.   

    在MouseMove时_TrackMouseEnent
    你加载Bitmap时 只需加载一次 放在OnInitDlg 中