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

動態計算文字繪製區域:DrawText DT_CALCRECT 技巧與裝置內文脈選擇

     編輯:關於C語言

核心問題

動態建立靜態控制項顯示可變長度文字時,如何精確計算所需矩形大小以完整顯示內容?

解決方案:DrawText + DT_CALCRECT


CString strText = _T("動態文字內容...");
CRect rect(0, 0, 0, 0); // 初始零矩形

// 取得裝置內文脈 (DC)
CClientDC dc(this); // 或 CWindowDC、CPaintDC、GetDC()

// 選入目標字型
NONCLIENTMETRICS ncm = { sizeof(ncm) };
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
CFont font;
font.CreateFontIndirect(&ncm.lfMessageFont);
CFont* pOldFont = dc.SelectObject(&font);

// 關鍵:計算所需矩形
dc.DrawText(strText, &rect, DT_CALCRECT | DT_LEFT | DT_WORDBREAK);
// rect.right  = 文字寬度
// rect.bottom = 文字高度 (含換行)

// 還原字型
dc.SelectObject(pOldFont);

// 現在可用 rect 建立控制項或設定視窗大小
CreateStaticControl(rect);

關鍵旗標組合

裝置內文脈 (DC) 選擇指南

  • CClientDC:客戶區 DC,最常用,適合視窗建立前計算。
  • CWindowDC:整個視窗 DC (含非客戶區),較少用。
  • CPaintDC:僅在 OnPaint 中有效。
  • GetDC()/ReleaseDC():底層 API 對應。
  • 原則: 只要是螢幕 DC (非印表機 DC) 即可,字型度量一致。

完整流程:根據使用者選擇的系統字型動態建立控制項

  1. 呼叫 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ...) 取得 lfMessageFont (訊息方塊字型) 或 lfMenuFont 等。
  2. 用 CFont::CreateFontIndirect 建立字型物件。
  3. 建立螢幕 DC,SelectObject 選入字型。
  4. 呼叫 DrawText(str, &rect, DT_CALCRECT | DT_WORDBREAK) 取得尺寸。
  5. 加上邊界間距 (如 rect.InflateRect(4, 2))。
  6. 用計算出的 rect 呼叫 CStatic::Create 或 CreateWindow 建立控制項。

進階:多行文字自動換行寬度限制

若希望限制最大寬度自動換行:


CRect rect(0, 0, MAX_WIDTH, 0); // 指定最大寬度
dc.DrawText(str, &rect, DT_CALCRECT | DT_WORDBREAK);
// 返回 rect 底部為實際高度
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
旗標效果
DT_CALCRECT不實際繪製,僅計算矩形 (必須)
DT_WORDBREAK自動換行 (寬度固定時計算高度)
DT_LEFT / DT_CENTER / DT_RIGHT對齊方式 (影響寬度計算)
DT_SINGLELINE單行模式 (忽略換行符)
DT_EXPANDTABS展開 Tab 鍵
DT_NOPREFIX不處理 & 加速鍵前綴