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

多行文字工具列實現:CMTToolBar 類別將文字轉位圖技術詳解

     編輯:關於VC++

MFC CToolBar 僅支援單行文字。本文實現 CMTToolBar 類別,核心技術是「將多行文字渲染為位圖,替換原工具列位圖」,支援工具列資源中以 \n 分隔多行文字。

核心算法:ShowText 完整流程

  1. 讀取工具列資源 (RT_TOOLBAR) 取得按鈕資訊與原始圖片尺寸
  2. 建立記憶體 DC,載入新字型(預設 6×12 宋體)
  3. 解析各按鈕字串資源,以 \n 分割多行,計算最大行數、單字高度、最大寬度
  4. 載入原始工具列位圖資源
  5. 建立新位圖:寬度 = 按鈕數 × 新按鈕寬,高度 = 原圖高 + 文字區高
  6. 繪製流程:先填背景色 → 複製原始圖片(置中) → 繪製多行文字(置中)
  7. 呼叫 SetSizes 更新按鈕尺寸,AddReplaceBitmap 替換工具列位圖

關鍵程式碼片段

BOOL CMTToolBar::ShowText(UINT nIDResource) {
    // 1. 讀取資源取得原始尺寸
    CToolBarData* pData = (CToolBarData*)LockResource(hGlobal);
    CSize sizeImage(pData->wWidth, pData->wHeight);
    
    // 2. 解析多行文字
    CStringArray* pstrArray = new CStringArray[nCount];
    int nLines = 0, nCharHeight = 0;
    for (int i = 0; i < nCount; ++i) {
        // 略過分隔器...
        CString strT; strT.LoadString(tb.idCommand);
        int nPos = strT.Find('\n') + 1;
        while (nPos > 0) {
            // 分割各行存入 pstrArray[nBtnCount]
            nLines = max(nLines, nIndex+1);
            nCharHeight = max(size.cy, nCharHeight);
        }
    }
    
    // 3. 計算新尺寸
    CSize sizeNewImage(sizeImage.cx, nLines * nCharHeight);
    
    // 4. 繪製新位圖
    dcDst.FillSolidRect(..., ::GetSysColor(COLOR_BTNFACE));
    for (i = 0; i < nBtnCount; ++i) {
        dcDst.BitBlt(i*sizeNewImage.cx + nStartX, 0, sizeImage.cx, sizeImage.cy, &dcSrc, ...);
        for (j = 0; j < pstrArray[i].GetSize(); j++) {
            dcDst.TextOut(i*sizeNewImage.cx + nStratX, sizeImage.cy + j*nCharHeight, ...);
        }
    }
    
    // 5. 套用
    SetSizes(sizeNewImage + CSize(7,7), sizeNewImage);
    AddReplaceBitmap((HBITMAP)bmpDst.Detach());
    return TRUE;
}

使用方法

  1. 工具列資源編輯器中,按鈕文字輸入:第一行\n第二行\n第三行
  2. 將主框架工具列變數型別改為 CMTToolBar
  3. OnCreate 中呼叫:m_wndToolBar.ShowText(IDR_MAINFRAME);

技術特點與限制

特點限制
支援任意行數文字文字渲染為位圖,無法動態改變字型大小/樣式
自動計算最佳按鈕寬度高 DPI 環境下位圖可能模糊
文字垂直/水平置中對齊不支援 RTL 語言
保留原始圖示完整顯示按鈕寬度由最長文字決定,可能過寬

改進方向

  • 支援 CCustomDraw 即時繪製文字(不生成位圖)
  • 加入字型設定介面
  • 支援圖示在文字上方/下方/左側/右側多種佈局
  • 整合 CImageList 支援高 DPI 圖示

總結

CMTToolBar 以「文字轉位圖」巧妙繞過 MFC 工具列單行限制,程式碼約 150 行,邏輯清晰。適合按鈕文字固定、不需頻繁動態變更的場景。原始碼可直接整合專案使用。

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