Windowsリストコントロールでのイメージリストの管理について

このQ&Aのポイント
  • Windowsのリストコントロールでアイテムの横にアイコンを表示し、ソート機能も追加したいと考えています。
  • リストコントロールに表示するアイテム用のイメージリストとヘッダーコントロール用のイメージリストを用意し、追加しましたが、イメージリストの管理に問題が生じています。
  • イメージリストの追加順によって上書きされてしまい、リストコントロールでイメージリストを管理する上で問題があるようです。一つのイメージリストでアイテムとヘッダーを管理する必要があるのでしょうか?
回答を見る
  • ベストアンサー

リストコントロールにセットするイメージリストについて

こんにちは。 Windowsでレポート状態表示のリストコントロールについて質問です。 リストコントロールははオーナーデータで表示しています。 一覧でアイテムの横にアイコン(ビットマップ)を表示しています。 またソートできるようにし、コラム部分には昇順か降順か分かるように▲▼が 表示されるようにしようと思っています。 リストコントロールに表示するアイテム用のイメージリストとヘッダー コントロール用のイメージリストを用意し、リストコントロールと リストコントロールから取得したヘッダーコントロールにそれぞれ 追加したのですが、 Header_SetImageList(ヘッダーコントロールのウィンドウハンドル) ; ListView_SetImageList(リストコントロールのウィンドウハンドル) ; 上記の順番では後から追加したイメージリストで上書きされてしまいました。 Header_GetImageListでイメージリストを取るとListView_SetImageListで セットしたイメージリストのハンドルが取得されます。 リストコントロールでイメージリストを取り扱う場合はリストアイテムも ヘッダーも一つのイメージリストで管理しなければならないのでしょうか ?

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

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

 こんにちは。  試してみましたが、其の通りのようです。  同一のイメージリストを設定して、リストアイテムを追加する際にイメージリストの飛ばしたい位置の分を加算するしかなさそうです。 HIMAGELIST hImgHDR = ImageList_LoadImage(NULL, "header.bmp", 16, 0, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR | LR_LOADFROMFILE); //HIMAGELIST hImgLST = ImageList_LoadImage(NULL, "list.bmp", 16, 0, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR | LR_LOADFROMFILE); HWND hList = GetDlgItem(hWnd, IDC_LIST1); HWND hHeader = ListView_GetHeader(hList); Header_SetImageList(hHeader, hImgHDR); ListView_SetImageList(hList, hImgHDR, LVSIL_SMALL); //ListView_SetImageList(hList, hImgLST, LVSIL_SMALL);明らかに影響する //カラム設定 LVCOLUMN col = {0}; col.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_SUBITEM; col.pszText = "test"; col.cx = 100; col.fmt= LVCFMT_LEFT; //ヘッダ設定 HDITEM hi = {HDI_IMAGE | HDI_FORMAT}; hi.fmt = HDF_IMAGE; for(col.iSubItem = 0; col.iSubItem < 2; ++col.iSubItem) { ListView_InsertColumn(hList, col.iSubItem, &col); //ヘッダのイメージリスト位置設定 hi.iImage = col.iSubItem; Header_SetItem(hHeader, col.iSubItem, &hi); } //リストアイテム設定 LVITEM item = {LVIF_TEXT | LVIF_IMAGE}; 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; item.iImage = 2/*イメージリスト位置の飛ばしたい分*/ + ??? ListView_InsertItem(hList, &item); }

shuuden
質問者

お礼

早々のレスありがとうございます。 私も同じ結論になりました。あまくまとめるようにしたいと想います。 ソースコードも参考になります。 ありがとうございました。

関連するQ&A

  • ListBoxからImageコントロールへ

    アニメーションソフトを作ろうとしているのですが、 ListBoxにドラッグ&ドロップで追加した画像ファイルのフルパスから、Imageコントロールに画像を表示したいと思っているのですが、 詳しい動作 1.フルパスの取得 2.フルパスを元に画像を取得 3.取得した画像をImageコントロールに貼り付ける *これを繰り返す animePicture = List1.List(x)  注:(x)はList番号です で、animePictureにフルパスを取得したのはいいのですが、 その後、画像の取得、画像の表示、繰り返しの動作をどうすればよいかがわからなくて困っています。 どなたか教えていただけませんでしょうか?

  • リストビューのハンドルについて

    リストビューコントロールのハンドルについて疑問に思う事がありまして、ご教授よろしくおねがいします。 通常リストビューをCreateWindow()で作成した時に戻り値として受け取るウィンドウハンドルに対してSetWindowFont()を行うとリストビュー全体のフォントが変更されます。 リストビュー関数にはListView_GetHeader( リストビューハンドル );という関数が用意されていてリストビューのカラム部分のハンドルを取得できます。 このハンドルに対してSetWindowFont()を行うとカラム部分だけのフォントが変更されます。 という事はアイテム部分だけのハンドルを取得し、SetWindowFont()でフォントを変更する事はできるのでしょうか? ご教授よろしくお願いいたします。

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • ダイアログボックスにリストビューを付けたが、リストが表示されない

    ダイアログボックスにリストビューを付けて、ダイアログボックスにデータの一覧を表示させたいのですが、うまく表示されません。  http://gurigumi.s349.xrea.com/programming/visualcpp/sdk_dialog_listview1.html を参考にして、プログラミングしました。 プログラムの大まかな処理としては、  1.InitCommonControls()をコール  2.GetDlgItem()で、ダイアログボックスに貼り付けられているウィンドウハンドルを取得  3.ListView_InsertColumn()をコールして、項目を追加  4.ListView_InsertItem()をコールして、1つ目の値を設定  5.ListView_SetItem()をコールして、2つ目以降の値を設定 だと思いますが、この手順で行っても、うまく表示されませんでした。 何か抜けている手順はあるのでしょうか? また、上記以外に、何かポイントにしなければならないことはあるのでしょうか? 申し訳ありませんが、ご返答くださいますよう、よろしくお願いいたします。

  • リストコントロールのリスト内にスピンコントロールを配置したい

    お世話になります。 C++ 6.0 MFC で開発しております。 リストコントロール内に表示させるリスト内にスピンコントロールをつけたいのですが、どのようにすれば実現できるのでしょうか? ※リストを追加するたび、スピンコントロールがついたリストが追加されるようにしたいのです。 説明が載っているサイトでもいいので教えて頂ければありがたいですので なにとぞよろしくお願いします。 お手数ですが、なにとぞよろしくお願いします。

  • データ リスト コントロールについて教えてください

    AccessのデータをADOデータコントロールを通じてデータリストコントロールに表示させています。データリストの10のリストのうち3番目のリストを取得(マウスで選択せずに)するにはどうすればよいでしょうか?またリストの総数を取得するにはどうすればよいのでしょうか? 大変初歩的な質問ですがよろしくお願いします。

  • ListViewでのリスト表示(初歩的な質問です)

    WinXP Pro VB6.0で開発を行っています。 現在、ドラッグ&ドロップにより、ListViewでファイルのパスをリスト表示するプログラムを作成しています。 ListBoxではなくListViewを利用する理由は、パスの長さに合わせてスクロールバーを表示したいためです。 そこで、ドラッグ&ドロップイベントでファイルのパスを取得することは出来たのですが、単純なリスト表示ができません。 ListView1.ListItems.Add(, , tmpPath) でパスを追加しているのですが、プロパティの設定がよく分からずうまく表示できません。 Viewを2-lvwLstに変更し、何となく表示はしているのですが2列表示になり、縦のスクロールバーが表示されません。 なお、表示の際、ヘッダ部分は必要ありません。 また、パスのみの表示であるため、一項目の表示です。 プロパティの設定例を教えていただけませんか? 非常に初歩的な質問ですがよろしくお願いします。

  • コントロールリスト(CListCtrl)非表示行

    C++でのFORM部品のコントロールリスト(CListCtrl)において、登録済みの複数アイテムのうち、特定アイテム(行)のみを、アイテムを削除せずに非表示に設定することは可能でしょうか? やりたいのは特定カラムの格納値でフィルタリング設定を行い、特定の値をもつ行のみを選択表示したいでのすが、アイテム削除や別リストでの表示ではなく、あくまでもひとつのコントロールリスト内のアイテム設定で行いたいです。 アイテム別の状態設定としては SetItemState 関数がありますが、非表示にする機能は見当たりませんでした。

  • リストビューに色はつかない?

    CreateWindowEx を使ったリストビュー(WC_LISTVIEW) についてなんですが、 マクロの、ListView_InsertItem (hList, &item) で、リストに追加しますよね。 その際、カラーはできないのでしょうか。 例えば、一行おきに色を変えるとか・・・ SetTextColor(hdc, RGB(0, 255, 0)) とか SendMessage(hList, WM_SETFONT, (WPARAM)hFont, 0) とかいろいろ 見たり試したりしたのですが、無理なんでしょうか。

  • タブコントロール上のリストコントロール(再描画されない)

    VS2005 SP1のMFCでプログラムを作成しています。 OSはWindows XP SP3です。 タブコントロールを使用したダイアログベースです。 タブの切り替えによりコントロールを配置した子ウィンドウ(実際はダイアログ)を表示させたり、非表示にさせたりしています。 ■配置と親子関係 ダイアログ:(1)  ↓(の上に) タブコントロール:(2)((1)が親)  ↓(の上に) ダイアログ:(3)((1)が親)  ↓(の上に) リストコントロール:(4)((3)が親) ■現象 本プログラムを別のウィンドウで隠し、ALT+TAB等で、フォアグラウンドに持ってきた場合に、(4)のリストコントロールが再描画されません。 ※リストコントロールでアイテムを選択した状態でないと発生しない模様 ただし配置と親子関係で示した構成は2組あり、1組はリストコントロールのリソースプロパティで、TransparentをTUREにすることにより現象が解消されました。(たぶん最後にリストコントロールが描画されるようになった) しかし、2組目は同じ対策をとっても現象が起こってしまいます。 画面切り替わり時によくみていると、リストコントロールが一瞬みえてから消えてるので、別の何かが上書き描画により消えていると思われます。 対策として、 OnPaint()にてリストコントロールをInvalidate()すれば解消されることはされるのですが、ツールバーにツールチップが表示するだけで、リストコントロールの再描画が発生してチラつきます。 説明が長くなってしまいましたが、どなたか良い解決策をご教授お願いします。 最後まで読んで頂き、有難う御座います。

専門家に質問してみよう