Cześć, problem wygląda następująco.
Tworzę sobie kontrolkę dziedziczącą po CStatic. To ma być zwykły label do pokazywania tekstu. Tyle, że ma mieć możliwość zawijania tekstu, jeśli ten będzie za długi. A więc muszę mieć szerokość tekstu i muszę mieć szerokość kontrolki. W teorii proste:
CRect thisRect;
SIZE txtSize = {0};
GetWindowRect(&thisRect); //pobieram szerokość kontrolki (piksele)
//liczę szerokość tekstu, funkcja zwraca wymiary w logical units
GetTextExtentPoint32(GetDC()->GetSafeHdc(), str, str.GetLength(), &txtSize);
//teraz muszę zmienić szerokość kontrolki z pikseli na logical units:
LONG baseUnits = GetDialogBaseUnits();
int baseUnitX = LOWORD(baseUnits);
int pxWidth = MulDiv(thisRect.Width(), baseUnitX, 4);
//teraz wystarczy sprawdzić, czy tekst jest dłuższy niż szerokość kontrolki:
if(txtSize.cx >= pxWidth)
{
}
Niestety, okazuje się, że daje mi to wynik taki, że kontrolka jest na tyle szeroka, żeby pomieścić naprawdę szerokie teksty. Oczywiście w rzeczywistości te szerokie teksty się nie mieszczą. Próbowałem też przeliczyć szerokość kontrolki w taki sposób (odwrotnie):
int pxWidth = MulDiv(thisRect.Width(), baseUnitX, 4);
Tutaj z kolei efekt jest taki, że teksty, które bez problemu mieszczą się w kontrolce, są zawijane. Szerokość kontrolki w wyniku tego działania wychodzi stosunkowo mała. Jak to zrobić poprawnie?