2016-04-15 96 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