レポートビュー

レポートビューはCListCtrlクラスの機能です。
これは、エクスプローラーのファイル表示部分の機能です。
詳細表示の時にファイルサイズや種類が一目でわかるあれです。

レポートビューの実装

この機能を実現するには、CListCtrlをインスタンス化する際に、あるフラグを立てます。
LVS_REPORTです。
これは、CListCtrlオブジェクトをレポートビューとして利用する意味があります。

実際にどのように書くかというと、

レポートビューの作成
CListCtrl m_list; //スタイル設定 LONG lStyle = GetWindowLong(m_tree.m_hWnd, GWL_STYLE); lStyle |= WS_VISIBLE | LVS_REPORT; m_list.Create(lStyle2, listRect, hDC, IDS_LISTCTRL);

といった感じです。

レポートビューの構成

レポートビューはカラムとアイテムで成り立っています。
レポートビューのカラムとアイテムは
┌─┬─┬─┐
│1│2│3│←カラム
└─┴─┴─┘
┌─┬─┬─┐
│1│2│3│←アイテム
├─┼─┼─┤
│4│5│6│
├─┼─┼─┤
│7│8│9│
├─┼─┼─┤
│ │ │ │
という並びです
で、アイテムには2種類あり、一番左のアイテムが「アイテム」それ以降を「サブアイテム」という。
上記の表で言えば、「アイテム」が1,4,7、「サブアイテム」が2,3,5,6,8,9である。
もう少し詳しく言えば、
1のサブアイテムが2,3
4のサブアイテムが5,6
7のサブアイテムが8,9
です。

カラムの作成

最初にカラムの設定を行います。
カラムの設定にはLVCOLUMN構造体を利用します。
LVCOLUMN構造体
typedef struct _LVCOLUMN {
    UINT mask;
    int fmt;
    int cx;
    LPTSTR pszText;
    int cchTextMax;
    int iSubItem;
#if (_WIN32_IE >= 0x0300)
    int iImage;
    int iOrder;
#endif
} LVCOLUMN, FAR *LPLVCOLUMN;
説明
mask どの構造体メンバが有効かを示します
fmt 文字の表示位置などを設定
cx カラムのサイズ(幅)
pszText アイテムの文字列(キャプション)を示します。
cchTextMax 最大文字数
iSubImage サブアイテムを含むかどうか。含む場合は数字を記述
iImage イメージリスト中のイメージを指定
iOder ---
カラムを挿入するたびに上記の構造体を利用していく。
主に必要なものは、mask,cxあたりであろう。
なぜなら、maskでLVCF_WIDTHを設定し、CXでサイズを決めないと、 カラムのサイズが最小サイズで文字が見えない・・・なので、2つは必要。

さて、どのように設定するかを例に挙げます。

レポートビューの作成
//カラム設定
LVCOLUMN lvC;
lvC.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvC.fmt = LVCFMT_LEFT;
lvC.cx = 100;
lvC.cchTextMax = 256;

//カラムの設定
lvC.pszText = "属性";
lvC.iSubItem = 0;
m_list.InsertColumn(0,&lvC);

lvC.pszText = "要素";
lvC.iSubItem = 1;
m_list.InsertColumn(1,&lvC);

lvC.pszText = "値";
lvC.iSubItem = 2;
m_list.InsertColumn(2,&lvC);
最初のmaskでは幅設定を有効にするLVCF_WIDTH
メンバのpszTextを有効にするLVCF_TEXT
メンバのiSubitemを有効にするLVCF_SUBITEM
を設定します。
あとは、カラムの幅、最大文字数、文字の表示位置を設定します。
設定したらカラムを追加していきます。

アイテムの追加

アイテムの追加にはLVITEM構造体を利用します。
LVITEM構造体
typedef struct _LVITEM {
    UINT   mask;
    int    iItem;
    int    iSubItem;
    UINT   state;
    UINT   stateMask;
    LPTSTR  pszText;
    int    cchTextMax;
    int    iImage;
    LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
    int iIndent;
#endif
} LVITEM, FAR *LPLVITEM;
説明
mask どの構造体メンバが有効かを示します
iItem アイテムの挿入位置
iSubItem サブアイテムを含むかどうか。含む場合は数字を記述
state アイテムの状態
stateMask どの状態を有効にするか
pszText アイテムの文字列(キャプション)を示します。
cchTextMax 最大文字数
iImage イメージ指定
lParam ---
iIndent その名の通りインデントの設定
アイテム、サブアイテムを追加するごとに上記の構造体を利用します。
必要な項目はmask,iItem,iSubItemです。
iItemでアイテムの列の挿入位置を指定します。
iSubItemで行の挿入位置を指定します。
とりあえずソースを・・・
レポートビューの作成
int CHogeView::OnCreate(LPCREATESTRUCT lpCreateStruct){
                ・
                ・
                ・
        LVITEM  lvI;
        lvI.mask = LVIF_TEXT;
        lvI.iItem = 0;
        lvI.iItem = AddItems(lvI, "Data1", "Data2", "Data3");
        lvI.iItem = AddItems(lvI, "Data4", "Data5", "Data6");
        lvI.iItem = AddItems(lvI, "Data7", "Data8", "Data9");
}
int CHogeView::AddItems(LVITEM lvI, char *c1, char *c2, char *c3){
        lvI.iSubItem = 0;
        lvI.pszText = c1;
        nItem = m_list.InsertItem(&lvI);
        if(nItem == -1){
            return 0;
        }

        lvI.iSubItem = 1;
        lvI.pszText = c2;
        m_list.SetItem(&lvI);
        if(nItem == -1){
            return 0;
        }

        lvI.iSubItem = 2;
        lvI.pszText = c3;
        m_list.SetItem(&lvI);
        return nItem;
}
とまぁ、ちょっとサブルーチン化させていますが、こんな感じです。
これで一応レポートビューが利用できます。

ちなみに、GetItem()関数でLVITEM構造体を引数として渡す場合で、 maskにLVIF_TEXTが含まれている場合はpszTextとcchTextMaxには値を指定しましょう。
ヒープする事があります。

アイテム、サブアイテムの編集

えー、レポートビューはエクスプローラーを見ていただければわかるように、 一番左しか、編集できません。
一番左はアイテムですね。
アイテムの編集を可能にするには CListCtrl::Create()関数でスタイルを指定するときに、LVS_EDITLABELSを指定すれば良いです。

サブアイテムは実は自力でCEditクラスをインプリメントして、目的の場所に出力しないといけないようです。
うーむ、面倒だねぇ・・・

まぁ、これで実現できるらしい。
コンボボックスも同様。

ツールチップの表示

CListCtrlには拡張スタイルでツールチップを表示できます。
で、ツールチップの指定は2種類あります。

LVS_EX_INFOTIPLVS_EX_LABELTIPです。
LVS_EX_INFOTIPはレポートビューでは無意味な指定のようです。
手元の本ではLVS_ICONのスタイルの時のみ利用可能だとか・・・
あと、LVN_GETINFOTIP を指定しなければなりません。
ネットで調べてみると、レポートビューでも利用可能なようですが、 オーナードローでLVN_GETINFOTIP を指定したところアサートされたのであきらめました。
さらにコモンコントロールが4.71以上でなければなりません。

LVS_EX_LABELはレポートビューでも利用可能です。
ただしアイテムのみ表示します。(サブアイテムは非対応)
さらにコモンコントロールが5.80以上でなければなりません。

自力でツールチップを実装する方法もあるようですが、 部品としてCListCtrlを継承したクラスを作る場合にはあまりお勧めではないです
(CListCtrlの拡張クラスにCToolTipを自力で実装できなかったので。力不足)

どちらも最新のIEのバージョンが入っていれば問題ないようです。

拡張スタイルはコモンコントロールのバージョンや開発環境で利用できたり、 できなかったり、できるはずだけど指定できなかったりとややこしいです。
MSDNも役に立たないことが多いです。(わかりづらい日本語だしなぁ・・・MSDN)