2009-11-16 11 views
5

Ich möchte eine CButton dynamisch die Breite des Textes darin ändern. Gibt es entweder eine integrierte Möglichkeit, dies in MFC zu tun, oder eine Möglichkeit, die Pixelbreite eines bestimmten Textes zu berechnen (so dass ich CWnd::SetWindowPos verwenden kann)?Get text width in MFC

Antwort

6

Sie können CDC::GetTextExtent verwenden, um die Breite von Text in einer bestimmten Schriftart zu berechnen. Verwenden Sie CWnd::GetDC, um den Gerätekontext von dem Steuerelement abzurufen, das den Text anzeigt.

6

Es ist langweilig. Sie müssen CWnd::GetFont() auf der Schaltfläche verwenden, um die Schriftart zu erhalten, die es verwendet, und dann den Standard GetTextText auf einem CDC Objekt verwenden, wo Sie diese Schriftart ausgewählt haben. Es sieht so etwas wie

CClientDC dc(&button); 
CFont * pOldFont = dc.SelectObject(button.GetFont()); 
... dc.GetTextExtent... 
dc.SelectObject(pOldFont); 
4

Neben @ demoncodemonkey Antwort, können Sie CDC::DrawText mit der DT_CALCRECT Flagge nennen. Auf diese Weise wird der Text nicht gezeichnet, aber der CRect, den Sie an die Funktion übergeben, hat die Breite und Höhe des zu zeichnenden Textes.

Dies ist besonders nützlich, wenn Sie Text mit Zeilenumbrüchen zeichnen möchten (mit dem Flag DT_WORDBREAK). Sie können dies nicht mit CDC::GetTextExtent tun.

+0

Gibt es einen Leistungsunterschied zwischen 'GetTextExtent' und' DrawText'? – Richard

1
CClientDC hdc(this); 
GetRect.SetRect(0,0,iLabelWidth,0); 
// 
//To get Height of Lable in advance 
// 
hdc.DrawText(
       TempData, 
       TempData.GetLength(), 
       GetRect, 
       DT_CALCRECT | DT_MODIFYSTRING | DT_WORDBREAK 
      );