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

VC++ 自繪跑馬燈控制項:仿 Scroll.ocx 實現文字右移動畫

     編輯:關於VC++

為避免引入外部 OCX 控制項增加部署複雜度,且解決原控制項長文字重繪異常問題,本文實作一個繼承自 CStatic 的純 MFC 跑馬燈控制項 CScrollCtrl。採用雙緩衝繪圖,配合定時器動態調整文字輸出矩形左邊界,實現文字從右向左平滑捲動。

核心繪圖邏輯

背景繪製 DrawCtrlBackground

  • 建立實體畫筆填充背景色 m_clBkColor。
  • 計算文字寬度 m_nTextWidth,初始化文字起始 X 座標 m_nXPos 為控制項右邊界(文字寬度)。

文字繪製 DrawCtrlText

  • 設定透明背景模式 TRANSPARENT、文字顏色 m_clTextColor、選入字型 m_pFnt。
  • 構建輸出矩形:left = m_nXPos、right = 控制項右邊界、垂直置中。
  • 呼叫 DrawText 搭配 DT_LEFT | DT_VCENTER | DT_SINGLELINE 繪製。

動畫驅動機制

  • 建立定時器(如 50ms 間隔),於 OnTimer 中遞減 m_nXPos。
  • 當 m_nXPos < -m_nTextWidth 時重置為控制項寬度,形成循環捲動。
  • 每次更新座標後呼叫 Invalidate() 觸發重繪。
  • 採用 OnPaint → 建立記憶體 DC → 雙緩衝繪圖 → BitBlt 至螢幕 DC,消除閃爍。

關鍵代碼實作

void CScrollCtrl::DrawCtrlBackground(CDC *pDC, CRect &rect)
{
    CBrush newBrush, *pOldBrush;
    newBrush.CreateSolidBrush(m_clBkColor);
    pOldBrush = (CBrush*)pDC->SelectObject(&newBrush);
    pDC->FillRect(&rect, &newBrush);
    pDC->SelectObject(pOldBrush);
    newBrush.DeleteObject();

    CSize sSize = pDC->GetTextExtent(m_strText);
    m_nXPos = sSize.cx; // 重置至右邊界
}

void CScrollCtrl::DrawCtrlText(CDC *pDC, CRect rect)
{
    CRect rectText;
    CFont *pOldFont;
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(m_clTextColor);
    pOldFont = (CFont*)pDC->SelectObject(m_pFnt);

    CSize sSize = pDC->GetTextExtent(m_strText);
    m_nTextWidth = sSize.cx;

    rectText.left = m_nXPos;
    rectText.top = rect.top;
    rectText.bottom = rect.bottom;
    rectText.right = rect.right;

    pDC->DrawText(m_strText, rectText, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
    pDC->SelectObject(pOldFont);
}

使用方式

  1. 將 ScrollCtrl.h、ScrollCtrl.cpp 加入專案。
  2. 對話框編輯器放置靜態文字控制項,ID 設為 IDC_SCROLL_CTRL,類型選 Frame。
  3. 用 Class Wizard 建立控制項變數 m_ScrollCtrl,類型指定 CScrollCtrl。
  4. 於 OnInitDialog 設定屬性:SetBkColor、SetTextColor、SetFont、SetWindowText、啟動定時器。

擴充建議

  • 背景漸層填充(GradientFill)。
  • 支援多行文字循環捲動。
  • 提供捲動速度、方向、暫停/繼續介面。
  • 滑鼠懸停時暫停捲動、顯示完整文字 ToolTip。

演示效果圖:

完整原始碼可下載,歡迎回饋改進建議至 successq_g@163.com。

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