8

水平スクロールバーをリストコントロールに追加するために、チュートリアルhereに従っています。TextWidth() 関数 (VC++ 2012 では未定義であると言われています) 以外はすべて機能するため、この質問を見つけました。しかし、私は hdc を初期化する方法がわからないので、これを試しました。しかし、GetTextExtentPoint32 はゼロを返し続けます。

どうすればこれを解決できますか?

私のコードは次のようになります(編集後):

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

(szMessage にはユーザー入力が含まれます)

4

2 に答える 2

3

わかりましたので、私の質問に答えてください: 上記のコード (質問を参照) では、Size.cx の値が大きすぎます。これは、MESSAGE_SIZE が 1000 であり、実際の文字列のサイズではないため、代わりに strMessage.c_str と strMessage.size() を使用したためです。これはまだ出力にいくつかの小さな不正確さをもたらしました。これは間違ったフォントが使用されたためだと思い、手動でフォントを作成しました。これで、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));

あまりにも機能し、フォントを作成したり、コントロールのフォントを編集したりする必要はありません

于 2013-04-29T10:44:14.330 に答える