void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
CDC *pDC;
CRect rcFocus, rcButton, rcText, rcOffsetText;
UINT state;

pDC    = CDC::FromHandle(lpDrawItemStruct->hDC);
state = lpDrawItemStruct->itemState;

rcFocus.CopyRect(&lpDrawItemStruct->rcItem); 
rcButton.CopyRect(&lpDrawItemStruct->rcItem); 

rcText = rcButton;
rcText.OffsetRect(-1, -1); rcOffsetText = rcText;
rcOffsetText.OffsetRect(1, 1);

// Set the focus rectangle to just past the border decoration
    rcFocus.left   += 4;
    rcFocus.right  -= 4;
    rcFocus.top    += 4;
    rcFocus.bottom -= 4;

// Retrieve the button's caption
CString strCaption;
GetWindowText(strCaption);

if (state & ODS_DISABLED)
    {
DrawFilledRect(pDC, rcButton,  m_DisabledBkgndColor);
}
else
{
DrawFilledRect(pDC, rcButton, m_BkgndColor);
}

解决方案 »

  1.   

    判断是否存在这个状态, 其实应该使用 std::bit的,也就是按位操作
      

  2.   

    用 & 是怎么判断的?
      

  3.   

    晕 这是C++的一个操作符呀,判断状态里是否 ODS_DISABLED呀你就把 0x0004 转换成 2进制 就知道是第几位了亚
      

  4.   

    0x0004也就是 100二进制  也就是判断 state 第二位是否是1
      

  5.   

    & 是位操作啊,也就是说 state 的所有bit位与ODS_DISABLED(0x0004)的所有bit位作位与的操作
    if (state & ODS_DISABLED)是判断得出的结果是否所有位与操作后,里面的所有bit值是否都为0假设:state = 0x0001,用二进制表示就是 0B00000000 00000001,
          而ODS_DISABLED = 0x0004,用二进制表示是 0B00000000 00000100
    那么state & ODS_DISABLED的结果为 0B00000000 00000000。
      

  6.   

    哦,也就是说表示状态的值都是0001,0100,1000,之类的,所有位只有一位是1,其余都是零,
    然后用 & 就可以判断了,如何不state 和ODS_...不相同 结果就是0, 可以这么理解吧?