SetBGBitmap 系列)。void CLabelEx::OnPaint() {
CPaintDC dc(this);
dc.SetTextColor(m_crText); dc.SetBkMode(TRANSPARENT);
dc.SelectObject(GetFont());
CRect rect; GetClientRect(&rect);
CDC memDC; memDC.CreateCompatibleDC(&dc);
// 1. 畫邊框+背景色
if (m_bBorder) { /* Rectangle */ rect.DeflateRect(1,1); }
// 2. 貼背景圖(依狀態選擇 m_BGBm/m_MouseOverBGBm/m_ClickedBGBm)
// 3. 貼標籤圖(計算縮放比例,StretchBlt)
// 4. 輸出文字(TextOut)
// 5. 畫底線(若 m_bUnderLine)
}
void CLabelEx::OnMouseMove(UINT nFlags, CPoint point) {
if (m_bOver) {
if (!rect.PtInRect(point)) { // 移出
m_bOver = FALSE;
if (m_bAutoUnderLine) SetUnderLine(FALSE);
if (m_bHighLight) SetTextColor(m_crBackText);
RedrawWindow(); ReleaseCapture(); return;
}
} else { // 移入
m_bOver = TRUE;
if (m_bAutoUnderLine) SetUnderLine(TRUE, RGB(0,0,255));
if (m_bHighLight) { m_crBackText=m_crText; SetTextColor(RGB(0,0,255)); }
RedrawWindow(); SetCapture(); ::SetCursor(m_hHandCur);
}
CStatic::OnMouseMove(nFlags, point);
}
點擊彈出對話框後,滑鼠捕捉釋放時機導致狀態無法正確恢復,待解決。
工具列按鈕、狀態列連結、自訂標題列按鈕等需豐富視覺回饋的靜態文字場合。