動態建立靜態控制項顯示可變長度文字時,如何精確計算所需矩形大小以完整顯示內容?
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);
| 旗標 | 效果 |
|---|---|
| DT_CALCRECT | 不實際繪製,僅計算矩形 (必須) |
| DT_WORDBREAK | 自動換行 (寬度固定時計算高度) |
| DT_LEFT / DT_CENTER / DT_RIGHT | 對齊方式 (影響寬度計算) |
| DT_SINGLELINE | 單行模式 (忽略換行符) |
| DT_EXPANDTABS | 展開 Tab 鍵 |
| DT_NOPREFIX | 不處理 & 加速鍵前綴 |