我在自定义绘制按钮里DrawItem里面
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
   PaintBK(lpRect,uState); //这个是绘制这个按钮背景的
   //绘制外形(包括3D外观的)
   //绘制按钮上的ICON和文字
}
void PaintBK(LPRECT lpRect,uState)//lpRect为按钮客户区 UINT uState(为状态标志)
{
   //根据uState选出一种color,(bgColor);
  CClientDC dc(this);
  dc.FillRect(*lpRect,&CBrush(bgColor));
}
这个普通情况下工作正常,但要是拖动的时候,比如拖动消失到了 屏幕边界里面的时候,引起重绘,
绘制出来的按钮就不正常了:
就是要么按钮显示一个flat(平坦的状态)全是,表明全部被bgColor填充(按钮的图标,文字等什么的全部被背景色覆盖了.
要么是按钮部分一部分显示正常,一部分被bgColor填充
这是什么原因呢?

解决方案 »

  1.   

    DrawItem里的所有绘图操作,都必须使用lpDrawItemStruct里面传进来的hDC来进行,不能使用CClientDC。另外,所有绘图操作结束后,必须通过SelectObject恢复hDC的状态。
      

  2.   

    有兴趣的话可以看看这个
    http://blog.csdn.net/xianglitian/archive/2007/08/06/1728242.aspx
      

  3.   

    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect itemRect = lpDrawItemStruct->rcItem;
    pDC->SetBkMode(TRANSPARENT);
      

  4.   

    DrawItem里的所有绘图操作,都必须使用lpDrawItemStruct里面传进来的hDC来进行,不能使用CClientDC。另外,所有绘图操作结束后,必须通过SelectObject恢复hDC的状态。
    CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    CRect itemRect = lpDrawItemStruct->rcItem;
    pDC->SetBkMode(TRANSPARENT);
      

  5.   

    呵呵 解决了 是这个“都必须使用lpDrawItemStruct里面传进来的hDC来进行”