none
CListCtrlのLVS_REPORTのカラムのヘッダーの▲▼ RRS feed

  • 質問

  • 開発環境はVC++6.0です。

    CListCtrlのLVS_REPORTのカラムのヘッダーをクリックすることにより、
    そのカラムをキーに昇順・降順に(エクスプローラと同様に)ソートする
    ことはできました。
    問題は、そのカラムのヘッダーに昇順・降順を示すため、
    「▲」・「▼」の印を付けることです。
    (エクスプローラと同様)

    関連すると思われるCHeaderCtrl クラス メンバや
    CImageList クラス メンバの説明を読んでみましたが、
    使い方がわかりませんでした。

    どうかご教授ください。

    2010年3月16日 6:49

回答

  • 6.0では試してません。あしからず。またネイティブでの話です。

    1.「▲▼」のビットマップを作成してリソースに追加する(▼の幅=16[pixl])

    2.CImageListを用意して構築する
      CImageList ImgSort;
      ImgSort.Create( 「1.のビットマップID」, 16, 0, RGB( 0xFF, 0xFF, 0xFF));

    3.ヘッダーコントロールにイメージをセットする
      CHeaderCtrl* Header = LstCtrl->GetHeaderCtrl();
      Header->SetImageList( &ImgSort);

    4.カラムインデックスIndxにイメージのインデックスを設定する
      CHeaderCtrl* Header = LstCtrl->GetHeaderCtrl();
      HDITEM   Item;
      Header->GetItem( Indx, &Item);
      Item.iImage  = 0; // ▲=0番 ▼=1番
      Item.mask  = HDI_FORMAT | HDI_IMAGE;
      Item.fmt  = HDF_IMAGE | HDF_STRING | HDF_BITMAP_ON_RIGHT;
      Header->SetItem( Idnx, &Item);

    なお、LstCtrlはCListCtrlです。ヘッダーカラムは追加済みとの想定です。
    ▲は右(HDF_BITMAP_ON_RIGHT)に付けてみました。

    • 回答としてマーク eliyyahuu 2010年3月16日 13:13
    2010年3月16日 7:27

すべての返信

  • 6.0では試してません。あしからず。またネイティブでの話です。

    1.「▲▼」のビットマップを作成してリソースに追加する(▼の幅=16[pixl])

    2.CImageListを用意して構築する
      CImageList ImgSort;
      ImgSort.Create( 「1.のビットマップID」, 16, 0, RGB( 0xFF, 0xFF, 0xFF));

    3.ヘッダーコントロールにイメージをセットする
      CHeaderCtrl* Header = LstCtrl->GetHeaderCtrl();
      Header->SetImageList( &ImgSort);

    4.カラムインデックスIndxにイメージのインデックスを設定する
      CHeaderCtrl* Header = LstCtrl->GetHeaderCtrl();
      HDITEM   Item;
      Header->GetItem( Indx, &Item);
      Item.iImage  = 0; // ▲=0番 ▼=1番
      Item.mask  = HDI_FORMAT | HDI_IMAGE;
      Item.fmt  = HDF_IMAGE | HDF_STRING | HDF_BITMAP_ON_RIGHT;
      Header->SetItem( Idnx, &Item);

    なお、LstCtrlはCListCtrlです。ヘッダーカラムは追加済みとの想定です。
    ▲は右(HDF_BITMAP_ON_RIGHT)に付けてみました。

    • 回答としてマーク eliyyahuu 2010年3月16日 13:13
    2010年3月16日 7:27
  • comctl32.dllのバージョンが6以上なら
    HDITEM のfmtにHDF_SORTUP/HDF_SORTDOWNをセットすることでソートマークが表示できます

    そうでない場合は、イメージリスト or イメージでやることになりますね。



    2010年3月16日 7:48
  • 仲澤さま、ご回答ありがとうございます。

    イメージが一つしか追加されていないところを見ると、
    「▲▼」の二つ繋がった32*16pixelのイメージを追加し、
    Item.iImageに「0」か「1」を指定すると、
    CHeaderCtrlがイメージを分割してどちらかを表示してくれるんですね。
    実にアクロバチックですね。

    実は私も失業者です(>_<)。

    2010年3月16日 13:03