Textlänge paßt nicht (DeviceContext)

jokey2

Erfahrenes Mitglied
Hallo Gemeinde!

In einem dynamisch erstellten Dialog werden bei der Initialisierung mehrere Checkboxen auf dem Dialog angelegt. Die Texte der Checkboxen werden aus der Stringtabelle gelesen. Da ich die Breite des Dialoges an die Breite des längsten Textes anpassen will, hole ich mir mit GetDC()->GetTextExtent(cstrText) die Breite und Höhe des Textes. Nach der Breite des Textes setze ich auch die Breite des Checkbox-Controls. Die größte Breite merke ich mir, danach setze ich dann die Fensterbreite.
Das Problem dabei ist, daß sowohl die Controls als auch der Dialog zu breit werden! Muß ich da noch irgendwas umrechnen? Und wenn ja, was?

Das ist zwar nicht wirklich kritisch, aber es sieht halt nicht so aus, wie ich will. Ich wäre dankbar, wenn mir da jemand einen Tip geben könnte.
 
Du musst noch den Font explizit setzen:
Code:
CDC   *pDC      = GetDC();
CFont *pFont    = GetFont();
CFont *pOldFont = pDC->SelectObject(pFont);

CSize size = pDC->GetTextExtent(cstrText);

pDC->SelectObject(pOldFont);
ReleaseDC(pDC);

Die Zeile "GetDC()->GetTextExtent(cstrText);" ist übrigens nicht sehr günstig, weil du den mit GetDC() geholten Device Context auch wieder mit ReleaseDC() freigeben musst. Das Speichern in einer Variablen kannst du dir also nicht ersparen.
 
Danke für die Antwort, aber ich bin mir nicht sicher, ob es das ist. Ich hole mir den DC des Dialoges und ermittle die Textlänge in diesem DC. Dann erzeuge ich die Checkbox mit der ermittelten Größe und weise ihr den gleichen Font zu, den der Dialog hat. Also sollte das mit dem Font eigentlich passen, oder. Aber vielleicht habe ich da auch etwas nicht verstanden. Ich poste mal ausschnittsweise den Code, wie ich das momentan mache:
Code:
CDC *pDC = GetWindowDC();
    .
    .
    .
    cstrCheckboxText.LoadString(ID_LABEL_DESCRIPTION);
    iCtrlID = IDC_SELDEF_DESCRIPTION;
    break;
    .
    .
    .
    sizeLabel = pDC->GetTextExtent(cstrCheckboxText);
    rectCheckbox.right = rectCheckbox.left + CHECKBOX_BASE_WIDTH + sizeLabel.cx;
    bRet = pNewCheckbox->Create(cstrCheckboxText,
    	WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX,
    	rectCheckbox,
    	this,
    	iCtrlID);
    pNewCheckbox->SetFont(GetFont(), FALSE);
    iCBWidth = rectCheckbox.Width();
    
    m_iNextVertPos += CHECKBOX_VERT_DIST;
    if(iCBWidth > m_iMaxCBWidth)
    	m_iMaxCBWidth = iCBWidth;
    .
    .
    .
    ReleaseDC(pDC);

EDIT: P.S.: Das ist ein Ausschnitt aus der OnInitDialog() meines Dialoges
 
Zuletzt bearbeitet:
Das Problem bei mit GetDC() bzw. GetWindowDC() geholten DCs ist, das darin irgendein Systemfont ausgewählt ist, der aber nicht unbedingt mit dem mittels SetFont() zugewiesenen übereinstimmt. Daher sollte man explizit noch mal ein SelectObject() für den aktuell eingestellten Font aufrufen.
 
...und schon geht's! Vielen Dank!

Das ist für mich allerdings etwas unlogisch. Ich hole einen DeviceContext des Dialoges und der enthält einen anderen Font als den, den ich mit GetFont() bekomme. Ich dachte eigentlich immer, der DC ist eine Repräsentation der grafischen Eigenschaften eines Fensters. Aber das isses wohl nicht.
 
Zurück