リストボックスhListに横スクロールバーを付けたいと思ってウィンドウスタイルにWS_HSCROLLを追加したところ、横スクロールバーは表示されませんでした。
これについて調べたところ
SendMessage(hList,LB_SETHORIZONTALEXTENT,x,0);
という風にxピクセル分のスクロール幅を用意させるメッセージをリストボックスに送る必要があると分かったので、文字列の幅を取得する関数を探したところ
GetTextExtentPoint32(HDC hdc,LPCTSTR lpString,int cbString,LPSIZE lpSize);
というデバイスコンテキストhdcと文字列lpstringと文字数cbStringから文字列の幅を取得してlpSizeに格納する関数を見つけました。
デバイスコンテキストは
hdc=GetWindowDC(hList);
文字数は
SendMessage(hList, LB_GETTEXTLEN ,lpString,0);
で求められるので、リストボックスに文字列を書き込む記述に文字列の長さを取得する記述を差し込んで下記のように書いて実行したところ、「Run-Time Check Failure #3 - The variable 'hStrSize' is being used without being initialized.」というエラーが発生してしまいました。
これは初期化されていない状態で数値として使用しようとした事に対する警告のメッセージのようであり、31行目でストップしていたのでここで数値として参照する事になったようですが、31行目ではhStrSizeを数値として参照しているのではなく、文字列のサイズを格納する変数として参照しているだけなので初期化が求められる意味が分かりません。
一体何故警告されたのでしょうか?
//変数宣言・定義
LPTSTR Str[] = {
L"hogehogehogehogehogehogehogehoge" ,
L"hogehogehoge" ,
L"hogehogehogehogehogehogehogehoge" ,
L"hogehogehoge" ,
L"hogehogehogehogehogehogehogehoge" ,
L"hogehogehoge" ,
L"/None"
};
WCHAR num[256]={0};
int i;
LPSIZE hStrSize;
int StrLength=0;
//--記述内容---------------------------------------
hList = CreateWindowEx(
NULL,
L"LISTBOX" ,NULL ,
WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | WS_HSCROLL ,
x ,y , width ,height,hMAGroup ,
(HMENU)ID ,hInst , NULL);
for(i=0;i<20;i++){
if(wcscmp(Str[i],L"/None")!=0){
_itow_s(i+1,num,10);
wcscat(num,L":");
wcscat(num,Str[i]);
GetTextExtentPoint32(
GetWindowDC(hList),
num,
wcslen(num),
hStrSize);
if(hStrSize->cx>StrLength){
StrLength=hStrSize->cx;
}
SendMessage(hList , LB_INSERTSTRING , i , (LPARAM)num);
}
else{break;}
}
SendMessage(hMaterialList,LB_SETHORIZONTALEXTENT,StrLength,0);