Ok, tak aby odpowiedzieć na moje pytanie: powyższy kod (patrz pytanie) daje drogę zbyt wysoka wartość dla Size.cx, ponieważ MESSAGE_SIZE ma wartość 1000, a nie rozmiar rzeczywistego łańcucha, dlatego użyłem zamiast nich strMessage.c_str i strMessage.size(). To nadal dawało pewne niedokładności w wyniku, zakładałem, że było tak dlatego, że użyto niewłaściwej czcionki, więc ręcznie wykonałem czcionkę. Teraz daje poprawną wartość Size.cx. Kod wygląda teraz tak:
int iHorExt=0;
SIZE Size;
int iCurHorExt=0 // iCurHorExt is actually a global var to prevent it from being reset to 0 evertime the code executes
string strMessage="Random user input here!"
HDC hdc=GetDC(hDlg);
//Random font
HFONT hFont=CreateFont(15, 5, NULL, NULL, FW_MEDIUM, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, FF_ROMAN, "Times New Roman");
//change font of the control
SendDlgItemMessage(hDlg, IDC_LIST1, WM_SETFONT, (WPARAM)hFont, true);
SelectObject(hdc, hFont);
int iResult=GetTextExtentPoint32(hdc, strMessage.c_str(), strMessage.size(), &Size);
if(iResult!=0)
{
iHorExt=Size.cx;
if(iHorExt>iCurHorExt)
{
iCurHorExt=iHorExt;
}
}
później w kodzie:
SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETHORIZONTALEXTENT, iCurHorExt, NULL);
Edit:
SelectObject(hdc, (HFONT)SendDlgItemMessage(hDlg, IDC_LIST1, WM_GETFONT, NULL, NULL));
Działa też i nie wymaga, aby czcionkę lub edytować czcionka kontrolki
Łańcuch ma określoną szerokość tylko po ustawieniu w określonej czcionce. Dlatego potrzebny jest kontekst graficzny (hdc). Użyj hdc do okna wyjściowego. – stark
@stark Jak uzyskać hdc dla mojego okna wyjściowego, to tam utknąłem – BioCycle
Możesz go uzyskać, wywołując 'GetDC (hWnd)'. –