2009-08-07 MSDN2003上的一个例子值得学习:WeatherService(关于ISAPI创建以及MFC调用) 其中的一个TransparentButton类值得使用, 另外不规则窗体的实现可以用下面的函数 class CTransparentButton : public CBitmapButton { public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS) { ASSERT(lpDIS != NULL); // must have at least the first bitmap loaded before calling DrawItem ASSERT(m_bitmap.m_hObject != NULL); // required // use the main bitmap for up, the selected bitmap for down CBitmap* pBitmap = &m_bitmap; UINT state = lpDIS->itemState; if ((state & ODS_SELECTED) && m_bitmapSel.m_hObject != NULL) pBitmap = &m_bitmapSel; else if ((state & ODS_FOCUS) && m_bitmapFocus.m_hObject != NULL) pBitmap = &m_bitmapFocus; // third image for focused else if ((state & ODS_DISABLED) && m_bitmapDisabled.m_hObject != NULL) pBitmap = &m_bitmapDisabled; // last image for disabled // draw the whole button CDC* pDC = CDC::FromHandle(lpDIS->hDC); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap* pOld = memDC.SelectObject(pBitmap); if (pOld == NULL) return; // destructors will clean up CRect rect; rect.CopyRect(&lpDIS->rcItem); pDC->TransparentBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, rect.Width(), rect.Height(), RGB(255, 0, 255)); memDC.SelectObject(pOld); } BOOL OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; } DECLARE_MESSAGE_MAP() };