首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 多功能標籤控件 CLabelEx

     編輯:關於VC++

功能特色

  • 背景圖片三態:預設/滑鼠經過/點擊(SetBGBitmap 系列)。
  • 標籤圖片三態:同樣支援三種狀態切換。
  • 文字效果:顏色、底線、滑鼠經過自動變藍+加底線(超連結風格)。
  • 邊框與背景:可開關邊框、指定邊框色、填充背景色。

核心繪製:OnPaint

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);
}

已知問題

點擊彈出對話框後,滑鼠捕捉釋放時機導致狀態無法正確恢復,待解決。

適用場景

工具列按鈕、狀態列連結、自訂標題列按鈕等需豐富視覺回饋的靜態文字場合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved