2013-04-28 15 views
8

Podążam za tutorialem here, aby dodać poziomy pasek przewijania do kontrolki listy. Wszystko tam działa z wyjątkiem funkcji TextWidth() (VC++ 2012 mówi, że jest niezdefiniowana), więc znalazłem pytanie: this. Ale nie mam pojęcia, jak zainicjować HDD, więc próbowałem this. Ale GetTextExtentPoint32 powraca do zera.Jak uzyskać szerokość łańcucha w pikselach (/ jednostki logiczne)?

Każdy pomysł, jak mogę to rozwiązać?

Mój kod wygląda następująco (po edycji):

SIZE Size; 
HDC hdc=GetDC(hWnd); 
iResult=GetTextExtentPoint32(hdc, szMessage, MESSAGE_SIZE, &Size); 

(szMessage zawiera dane wprowadzone przez użytkownika)

+3

Ł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

+0

@stark Jak uzyskać hdc dla mojego okna wyjściowego, to tam utknąłem – BioCycle

+0

Możesz go uzyskać, wywołując 'GetDC (hWnd)'. –

Odpowiedz

3

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

4

Moja droga:

SIZE sz; 
HFONT font = GetFont();  //GetFont() is part of WTL. If using raw WinAPI it needs to get font in other means. 
HDC hdc = GetDC(NULL); 
SelectObject(hdc, font); //attach font to hdc 

GetTextExtentPoint32(hdc, text, lstrlenW(text), &sz); 
ReleaseDC(NULL, hdc); 
Powiązane problemy