2016-04-15 86 views
2

当我有一个的CStatic控制,我可以如何查找实际内容的CStatic(文本)边界矩形?

CStatic textStatic = GetDlgItem(IDC_TEXT_STATIC); 
CRect rect; 
textStatic.GetWindowRect(&rect); 
ScreenToClient(rect); 

阅读控件的窗口矩形然而,这给了我的控制独立于实际显示的文本的边界矩形。如果文本比这更长,那么文本被截断,如果文本比这短,它不会给我文本的“右边框”。

对于对话框的一些动态调整大小,我想找到实际绘制的文本的边界矩形(或至少是宽度),而不是控件本身。

如何获得此(编程)?

回答

0

IInspectable的回答让我开始,但缺少位来选择合适的字体(处理系统字体DPI设置)。下面的方法现在做我所需要的:

CRect GetControlTextRect(CWnd *pWnd) 
{ 
    CString text; 
    pWnd->GetWindowText(text); 

    CDC* pDC = pWnd->GetDC(); 
    CFont* pFont = pWnd->GetParent()->GetFont(); 
    pDC->SelectObject(pFont); 

    CRect textRect; 
    pWnd->GetWindowRect(&textRect); 
    pDC->DrawTextEx(text, &textRect, DT_CALCRECT, NULL); 
    return textRect; 
} 

称为f.e.喜欢这里:

CWnd * txtCtrl = GetDlgItem(IDC_STATIC); // IDC_STATIC is the resource ID of the control 
CRect rect = GetControlTextRect(txtCtrl); 
ScreenToClient(rect); 

或可选择地想:

CStatic txtCtrl = GetDlgItem(IDC_STATIC); // IDC_STATIC is the resource ID of the control 
CRect rect = GetControlTextRect(&txtCtrl); 
ScreenToClient(rect); 
2

您可以使用DT_CALCRECT格式选项拨打CDC::DrawTextEx(请参阅DrawTextEx)。一个合适的设备上下文从调用返回到CWnd::GetDC:以上

CRect GetTextSize(int ctrlId) { 
    CWnd* pControl = GetDlgItem(ctrlId); 
    CString text; 
    pControl->GetWindowText(text); 

    CDC* pDC = pControl->GetDC(); 
    CRect textRect; 
    pDC->DrawTextEx(text, &textRect, DT_CALCRECT, NULL); 
    return textRect; 
} 
+1

除非我失去了一些东西,[CWnd的::函数GetDlgItem(https://msdn.microsoft.com/en-us/library/ 77d16yhw(v = vs.120).aspx)返回一个指向CWnd的指针。这会让你的示例代码不正确。 – rrirower

+0

+1感谢您的代码片段。为了获得更改系统字体的正确值而缺少一点(请参阅下面的答案),但它帮助我开始。 – BmyGuest