2013-04-28 79 views
8

我正在按照教程here,向列表控件添加一個水平滾動條。除了TextWidth()函數(VC++ 2012表示它是未定義的)之外,所有工作都是有效的,所以我發現了this問題。但我不知道如何初始化一個hdc,所以我嘗試了this。但GetTextExtentPoint32保持返回零。如何以像素(/邏輯單位)獲取字符串的寬度?

任何想法如何解決這個問題?

我的代碼看起來像這樣(編輯後):

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

(szMessage包含用戶輸入)

+3

當您將字符串設置爲特定字體時,字符串只有定義的寬度。這就是爲什麼你需要圖形上下文(hdc)。使用hdc作爲輸出窗口。 – stark 2013-04-28 13:41:59

+0

@stark如何爲我的輸出窗口獲取hdc,這就是我卡住的地方 – BioCycle 2013-04-28 13:44:03

+0

您可以通過調用'GetDC(hWnd)'來獲得它。 – 2013-04-28 13:53:06

回答

3

好了,所以回答我的問題: 上面的代碼(見問題)提供了一種方式太因爲MESSAGE_SIZE是1000而不是實際字符串的大小,所以我使用了strMessage.c_str和strMessage.size()來代替Size.cx。這仍然給輸出一些小的不準確,我認爲這是因爲使用了錯誤的字體,所以我手動做了一個字體。現在它爲Size.cx提供了一個正確的值。現在,該代碼如下所示:

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; 
    } 
} 

在後面的代碼:

SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETHORIZONTALEXTENT, iCurHorExt, NULL); 

編輯:

SelectObject(hdc, (HFONT)SendDlgItemMessage(hDlg, IDC_LIST1, WM_GETFONT, NULL, NULL)); 

工作過,也不需要你做的字體或編輯控制字體

4

我的辦法:

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); 
相關問題