C/C++ codevoid GYBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
ASSERT(lpDIS != NULL);
if (m_hSkinBitmap != NULL)
{
HDC hdcBmpMem = NULL;
HBITMAP hbmOldBmp = NULL;
HDC hdcPaint = NULL;
int iBtnWidth = 0;
BITMAP bminfo;
CRect rect;
hdcPaint = lpDIS->hDC;
rect = lpDIS->rcItem;
hdcBmpMem = ::CreateCompatibleDC(hdcPaint);
hbmOldBmp = (HBITMAP)::SelectObject(hdcBmpMem, m_hSkinBitmap);
GetObject(m_hSkinBitmap, sizeof(bminfo), &bminfo);
iBtnWidth = bminfo.bmWidth / 4;
UINT state = lpDIS->itemState;
int x = 0;
if (state & ODS_SELECTED)
x = 1;
// else if (state & ODS_FOCUS)
// x = 2; // third image for focused
else if (state & ODS_DISABLED)
x = 3; // last image for disabled
::BitBlt(hdcPaint, rect.left, rect.top, rect.Width(), rect.Height(),
hdcBmpMem, iBtnWidth*x, 0, SRCCOPY);
::SelectObject(hdcBmpMem, hbmOldBmp);
::DeleteDC(hdcBmpMem);
}
else
{
CRect rect;
rect.CopyRect(&lpDIS->rcItem);
COLORREF cr = RGB(129, 129, 129);
COLORREF crTopLeft = RGB(255, 255, 255);
COLORREF crBottomRight = RGB(0, 0, 0);
UINT state = lpDIS->itemState;
if (state & ODS_SELECTED)
{
crTopLeft = RGB(0, 0, 0);
crBottomRight = RGB(255, 255, 255);
}
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
pDC->FillSolidRect(&rect, cr);
rect.DeflateRect(1,1);
pDC->Draw3dRect(&rect, crTopLeft, crBottomRight);
CString s;
GetWindowText(s);
pDC->DrawText(s, &rect, DT_CENTER | DT_SINGLELINE);
}
}
------解决方案--------------------
重载drawitem
用位图贴上去,或者用画刷
------解决方案--------------------探讨
有一个叫BCGCTROL的插件,直接集成到VC中的,很好用,可以试试。
------解决方案--------------------
搜CHoverButton吧, 里面就有DrawItem的用法。
------解决方案--------------------