2016-04-15 10 views
2

、私はしかし、これは私に実際に表示されるテキストから独立したコントロールの外接矩形を与える実際のコンテンツのCStatic(テキスト)境界矩形を見つけるにはどうすればよいですか?私は<a href="/questions/tagged/mfc" class="post-tag" title="show questions tagged 'mfc'" rel="tag">mfc</a><em>CStaticな</em>コントロールを持っている場合

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

によってコントロールのウィンドウ矩形を読むことができます。テキストがこれより長い場合、テキストは切り捨てられ、テキストがこれよりも短い場合は、テキストの「右の境界線」が表示されません。

ダイアログボックスの動的リサイズでは、実際に描画されたテキストの境界矩形(または少なくとも幅)を見つけたいと思います。

これはどのようにして取得できますか。

答えて

0

IInspectableの答えは上記の私を始めましたが、(システムフォントDPI設定に対処するために)適切なフォントを選択するために、少し欠けていた:適切なデバイスコンテキストはCWnd::GetDCへの呼び出しから返されます。以下のメソッドは、私が必要とするものを今では行います:

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

CDC::DrawTextExは、DT_CALCRECTという書式設定オプション(DrawTextExを参照)で呼び出すことができます。

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

関連する問題

 関連する問題