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);
}
。
{
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);
}
。
if (state & ODS_DISABLED)是判断得出的结果是否所有位与操作后,里面的所有bit值是否都为0假设:state = 0x0001,用二进制表示就是 0B00000000 00000001,
而ODS_DISABLED = 0x0004,用二进制表示是 0B00000000 00000100
那么state & ODS_DISABLED的结果为 0B00000000 00000000。
然后用 & 就可以判断了,如何不state 和ODS_...不相同 结果就是0, 可以这么理解吧?