ダイアログボックスにリストビューを付ける

VCwin32アプリケーション1

今回は、ダイアログボックスにリストビューを付けます。

テキストの表示 - インコのWindowsSDK で作成したソースを修正します。

ここでは、Reseditで作成する方法も説明します。

流れ

commctrl.hをインクルード

comctl32.lib を読み込む

WM_INITDIALOG

WM_INITDIALOGは、ダイアログが作成されたときに一度だけ実行されます。

1.InitCommonControls()でコモンコントロールの初期化

2.リストビューを作成します。まずは、リストビューに新しいカラム(項目)を追加するため、LVCOLUMN構造体を初期化。構造体にデータをセット。

typedef struct _LVCOLUMN {
    UINT mask;         // 有効メンバを示すフラグ
    int  fmt;          // 列の配置
    int  cx;           // カラム(項目)の幅
    LPTSTR pszText;    // カラムのヘッダの文字列
    int  cchTextMax;   // pszTextのサイズ
    int  iSubItem;     // カラムのサブアイテムインデックス
    int  iImage;       // イメージのインデックス
    int  iOrder;       // カラムのオフセット
} LVCOLUMN, FAR *LPLVCOLUMN;

mask有効のメンバ
LVCF_FMTfmtが有効
LVCF_WIDTHcxが有効
LVCF_TEXTpszTextが有効
LVCF_SUBITEMiSubItemが有効
LVCF_IMAGEiImageが有効
LVCF_ORDERiOrderが有効

fmt機能
LVCFMT_LEFTテキストが左に配置
LVCFMT_RIGHテキストが右に配置
LVCFMT_CENTERテキストが中央に配置
LVCFMT_IMAGEアイテムはイメージリストからイメージを表示
LVCFMT_BITMAP_ON_RIGHTビットマップをアイテムの右側に表示
LVCFMT_COL_HAS_IMAGESヘッダアイテムはイメージリスト中のイメージを含みます。

3.ListView_InsertColumn()で、リストビューに新しいカラム(項目)を追加
この関数の第3引数に、先ほど作成したLVCOLUMN 構造体へのポインタをセットします。

int ListView_InsertColumn(
    HWND hwnd,            // リストビューのハンドル
    int iCol,             // 追加する列のインデックス
    const LPLVCOLUMN pcol // LVCOLUMN 構造体へのポインタ
); 

4.次にリストビューの項目の属性を設定します。
LVITEM構造体を初期化。構造体にデータをセット。

typedef struct _LVITEM {
    UINT   mask;          // 有効メンバを示すフラグ
    int    iItem;         // アイテムのインデックス
    int    iSubItem;      // サブアイテムインデックス
    UINT   state;         // アイテムの状態・イメージ
    UINT   stateMask;     // state のフラグ
    LPTSTR pszText;       // アイテムの文字列
    int    cchTextMax;    // pszTextのサイズ
    int    iImage;        // イメージのインデックス
    LPARAM lParam;        // アイテムの持つ32ビット値
    int    iIndent;       // インデント
#if (_WIN32_IE >= 0x560)  // Internet Explorer 5.6以降で有効
    int    iGroupId;      // 
    UINT   cColumns;      // tile view columns
    PUINT  puColumns;     // 
#endif
} LVITEM, FAR *LPLVITEM;

mask 有効メンバを示すフラグ
LVIF_TEXT pszTextが有効
LVIF_IMAGE iImageが有効
LVIF_PARAM lParamが有効
LVIF_STATE stateが有効
LVIF_INDENT iIndentが有効
LVIF_GROUPID iGroupIDが有効
LVIF_COLUMNS pszTextが有効
LVIF_TEXT cColumnsが有効
iItem 0 から始まるアイテムのインデックスを指定
(列の上から数えた番号)
iSubItem 0 から始まるサブアイテムのインデックスを指定
(行の左から数えた番号)

5.ListView_SetItem()リストビューの項目の属性を設定
この関数の第2引数に、先ほど作成したLVITEM構造体へのポインタをセットします。

BOOL ListView_SetItem(
    HWND hwnd,           // リストビューのハンドル
    const LPLVITEM pitem // LVITEM構造体へのポインタ
);

リソースファイル

1.リストビューを使用するため、commctrl.hをインクルード。

2.リストビュー[WC_LISTVIEW]を追加。

WC_LISTVIEWの代わりに、"SysListView32"と記述することができます。「" "」を忘れないで下さい。
この場合は、リソースファイルで、commctrl.hをインクルードする必要はありません。
ただし、"SysListView32"と記述した場合でも、Cソースファイルでは、commctrl.hのインクルードが必要です。

CONTROL  "", id, WC_LISTVIEW, style, x0, y0, width, height

idリストビューID
styleリストビューのスタイル
ウインドウスタイルと、リストビューのスタイルが指定可能
x0リストビュー左上のx座標
y0リストビュー左上のy座標
widthリストビューの幅
heightリストビューの高さ

・Visual Studioのリソース ビュー、ResEditでの設定
ツールボックス(Toolbox)ウインドウの「ListView Cntrol」を選択

VCwin32アプリケーション2

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

#pragma comment(lib, "comctl32.lib")

LPTSTR strItem0[] = { TEXT("TILTE1"), TEXT("TILTE2") };
int CX[] = { 80, 160 };
LPTSTR strItem1[] =
         { TEXT("LIST11"), TEXT("LIST12") };
LPTSTR strItem2[] =
         { TEXT("LIST21"), TEXT("LIST22") };

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    LVCOLUMN lvcol;
    LVITEM item;
    UINT i;
    static HWND hList;
    switch (msg)
    {
        case WM_INITDIALOG:
            InitCommonControls();
            hList = GetDlgItem(hWnd, IDC_LIST1);

            lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
            lvcol.fmt = LVCFMT_LEFT;
            for(i = 0; i < 2; i++){
                lvcol.cx = CX[i];             // 表示位置
                lvcol.pszText = strItem0[i];  // 見出し
                lvcol.iSubItem = i;           // サブアイテムの番号
                ListView_InsertColumn(hList, i, &lvcol);
            }

            item.mask = LVIF_TEXT;
            for(i = 0; i < 2; i++){
                item.pszText = strItem1[i];   // テキスト
                item.iItem = i;               // 番号
                item.iSubItem = 0;            // サブアイテムの番号
                ListView_InsertItem(hList, &item);
                item.pszText = strItem2[i];   // テキスト
                item.iItem = i;               // 番号
                item.iSubItem = 1;            // サブアイテムの番号
                ListView_SetItem(hList, &item);
            }

            break;
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        default:
            break;
    }
    return FALSE;
}

resource.h

#define IDC_LIST1 400
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。

test.rc

#include <windows.h>
#include <commctrl.h>
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
BEGIN
     CONTROL         "", IDC_LIST1,
                    WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_REPORT | LVS_ICON,
                    2, 2, 166, 58
END

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。