(0) exportieren Drucken
Alle erweitern
Erweitern Minimieren

Anpassen der Größe von statischen Steuerelementen an den Text

Veröffentlicht: 15. Feb 2001 | Aktualisiert: 16. Jun 2004

Von Paul DiLascia

Wie kann man die richtige Höhe und Breite für ein statisches Textelement festlegen, damit der Text vollständig angezeigt wird?

Frage
Ich lege in einer Unterklasse von CWnd dynamisch verschiedene Steuerelemente an. Um welche es sich handelt, hängt vom Inhalt einer Textdatei ab. Durch die folgenden Zeilen versuche ich in meiner Create-Methode zu erreichen, dass die Steuerelemente die Nachrichtenschriftart erhalten, die der Anwender im Eigenschaftsdialog für den Bildschirm festlegt.

NONCLIENTMETRICS ncm; 
ncm.cbSize = sizeof(NONCLIENTMETRICS); 
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0); 
m_DefaultFont.CreateFontIndirect(&ncm.lfMessageFont); 

Anschließend ist mir zwar die Schriftart bekannt, aber nun habe ich das Problem, für das jeweilige statische Textelement die richtige Höhe und Breite festzulegen, damit der Text vollständig angezeigt wird.

Antwort
Der angesprochene Dialog zeigt sich, um den Sachverhalt noch einmal zu verdeutlichen, wenn Sie den Desktop mit der rechten Maustaste anklicken und den Menüpunkt Eigenschaften wählen. Auf der Seite Darstellung kann der Anwender nun seine Menüs lila färben oder die Titelleisten giftgrün. Welche Schriftarten der Anwender gewählt hat, können Sie mit der Funktion SystemParametersInfo ermitteln, wenn Sie ihr beim Aufruf den Befehlscode SPI_GETNONCLIENTMETRICS übergeben. SystemParametersInfo schreibt die erforderlichen Angaben dann in eine NONCLIENTMETRICS-Strukur (Listing L1), einschließlich der LONGFONT-Strukturen für Menü, Meldung und andere Schriftarten.

L1 Die NONCLIENTMETRICS-Struktur

//////////////// 
// NONCLIENTMETRICS-Struktur, aus winuser.h 
// 
struct NONCLIENTMETRICS 
{ 
    UINT    cbSize; 
    int     iBorderWidth; 
    int     iScrollWidth;a 
    int     iScrollHeight; 
    int     iCaptionWidth; 
    int     iCaptionHeight; 
    LOGFONT lfCaptionFont; 
    int     iSmCaptionWidth; 
    int     iSmCaptionHeight; 
    LOGFONT lfSmCaptionFont; 
    int     iMenuWidth; 
    int     iMenuHeight; 
    LOGFONT lfMenuFont; 
    LOGFONT lfStatusFont; 
    LOGFONT lfMessageFont; 
}; 

Nun ist die Schriftart bekannt und es stellt sich die Frage, wie man die Fläche bestimmt, die zur Anzeige eines bestimmten Textes in dieser Schriftart auf dem Bildschirm erforderlich ist. Diese Frage stellt sich in Windows recht häufig. Zum Glück gibt es mit DrawText eine Funktion, mit der man den Text relativ einfach an der gewünschten Stelle anzeigen kann. DrawText ist die Grundfunktion zur Textausgabe unter Windows. Sie gibt den Text an einer gegebenen Position aus:

CDC dc = ...; 
CRect rc = ...; 
CString str = "Hello"; 
dc.DrawText(str, &rc, 0); 

DrawText zeigt den Text in einem Rechteck an, das Sie vorgeben. Aber was ist, wenn Sie die richtige Größe des Rechtecks noch nicht kennen? In diesem Fall berechnet die Funktion auch die erforderliche Größe des Rechtecks, sofern sie mit dem Argument DT_CALCRECT aufgerufen wird.

CRect rc(0,0,0,0); 
dc.DrawText(str, &rc, DT_CALCRECT); 

Nun gibt DrawText den Text nicht tatsächlich aus, sondern ermittelt nur seinen Platzbedarf und ändert das übergebene Rechteck so ab, dass der Text hineinpasst. Nach dem DrawText-Aufruf steht in rc.Width und rc.Height die Breite und Höhe des Textes. Sie können Ihr CRect auch mit der gewünschten oberen linken Ecke initialisieren, also mit (rc.left,rc.top) statt (0,0). In diesem Fall addiert DrawText die Höhe und die Breite zu diesem Ausgangspunkt und ermittelt so die untere rechte Ecke.
Die obigen Codezeilen gehen natürlich davon aus, dass die Schriftart bereits im fraglichen Gerätekontext eingetragen wurde. Und was soll man tun, wenn nur ein LOGFONT zur Verfügung steht? Sofern Sie bereits einen Gerätekontext von der MFC erhalten haben (zum Beispiel, weil die MFC CView::OnDraw von einem View aufruft oder für einen vom Anwender auszugebenden Gegenstand CWnd::OnDrawItem), können Sie den übergebenen Gerätekontext verwenden. Andernfalls halten Sie sich einfach an eine der CDC-Erzeugerfunktionen.

// Client-Gerätekontext anlegen 
CClientDC dc(pMyWnd); 

oder

// Fenster-Gerätekontext anlegen 
CWindowDC dc(pMyWnd); 

Da Sie gar nicht vorhaben, irgendetwas auf dem Bildschirm zu zeigen, spielt es eigentlich keine Rolle, welchen Gerätekontext Sie benutzen. Sie können jede CDC-Erzeugerfunktion aufrufen, solange Sie nur einen Bildschirmkontext anfordern, also einen Gerätekontext für den Bildschirm und nicht für einen Drucker oder andere Ausgabegeräte (es sei denn, der Text soll auf dem betreffenden Gerät erscheinen).
Sobald Sie den Gerätekontext haben, legen Sie ein Schriftobjekt an und tragen es in den Kontext ein.

// Schriftart anlegen 
CFont font; 
font.CreateFontIndirect(&ncm.lfMessageFont); 
// Schriftart in den Gerätekontext eintragen 
CFont* pOldFont = dc.SelectObject(&font); 
// Textgröße berechnen 
dc.DrawText(str, rc, DT_CALCRECT); 
// alte Schriftart wieder eintragen - wichtig! 
dc.SelectObject(pOldFont); 
Anzeigen:
© 2014 Microsoft