• ベストアンサー

Win32のリストコントロールで縦スクロールはできませんか?

こんにちは。Win32のリストコントロールについて質問です。 リストコントロールでアイコン表示で使用しています。 リストコントロールでアイコンをたくさん表示させると、縦幅に入る範囲で アイコンが複数行表示され、入らないアイコンは横スクロールさせることで 表示できますが、これを縦スクロールベースにはできないものでしょうか ?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。要するに、  →  [0][1]  [2][3]  [4][5]  [6][7]  ではなく、  ↓  [0][4]  [1][5]  [2][6]  [3][7]  の様にして追加していきたいと言う事なのでしょうか。  もしかしたら、ダイアログエディタでリストコントロールの「配置」を「上端」に設定すれば望みどおりの効果が出るかもしれません。    其れでも違うのであるのならば、アイコン表示ですと、カラムの効果が無効になるので、縦に向かって追加していくと言う事は出来ないです(レポートスタイルでないと効き目が無い)。  http://wisdom.sakura.ne.jp/system/winapi/common/common15.html  ただ、LVM_SETITEMPOSITIONを実行すると、任意の位置に並べ替えれるので、其れを利用して、縦に向かって並べて、次の列の真上に折り返す、と言った事は出来ます。  以下のマクロを使った方が楽かもしれません。  ListView_SetItemPosition(hList/*リストコントロールハンドル*/, itemPosition/*アイテム番号*/, xPixel/*x位置*/, yPixel/*y位置*/)  以下は30個のアイテムを縦並べ、2列に配置しなおします。参考程度に。 //取りあえず30個アイテムを作る LVITEM item = {LVIF_TEXT}; TCHAR buf[80]; TCHAR text[128]; for(item.iItem = 0; item.iItem < 30; ++item.iItem) { ::wsprintf(buf, "%d", item.iItem); ::_tcscpy(text, TEXT("ITEM")); ::_tcscat(text, buf); item.pszText = text; ListView_InsertItem(hList, &item); } //並べなおし const int ICONSIZE = 48;//アイコンのサイズ48x48とする const int COLUMN = 2;//列 for(int y = 0, itemCount = 0; y < (item.iItem / COLUMN); ++y) { for(int x = 0; x < COLUMN; ++x) { ListView_SetItemPosition(hList, itemCount++, x * ICONSIZE, y * ICONSIZE); } } //アイテムの個数によっては余って並べきれないので、此処でどうにかする

shuuden
質問者

お礼

こんにちは。 ご返答ありがとうございます。 「配置」を「上端」に設定したところ希望通りの表示なりました。 多少カスタマイズも必要なときも提示していた出した ListView_SetItemPosition を利用すればできそうです。 ありがとうございました。 助かりました。

関連するQ&A

専門家に質問してみよう