リストビューにアイコンを付ける

リストビュー大きいアイコン リストビュー一覧
リストビューリスト リストビュー詳細

今回は、リストビューにアイコンを付けます。

リストビュー1 - インコのWindowsSDK で作成したソースを修正します。

流れ

WM_INITDIALOG

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

1.ImageList_Create()でイメージリストを作成

2.ImageList_AddIcon()アイコンをイメージリストに追加します。

int ImageList_AddIcon(
    HIMAGELIST himl, // イメージリストのハンドル
    HICON hicon);    // 追加するアイコン、またはカーソルのハンドル

3.LoadIcon()で、アイコンリソースをロード

4.ListView_SetImageList()で、イメージリストをリストビューにセットします。

HIMAGELIST ListView_SetImageList(
    HWND hwnd,       // リストビューのハンドル
    HIMAGELIST himl, // リストビューに関連付けるイメージリストのハンドル
    int iImageList   // himlメンバで指定するイメージリストのタイプを表すフラグ
);

iImageList機能
LVSIL_NORMAL大きいアイコン
LVSIL_SMALL小さいアイコン

WM_COMMAND

1.SetWindowLong()で、指定されたウィンドウの属性を変更

WM_CLOSE

1.ImageList_Destroy()で、イメージリストを破棄

BOOL ImageList_Destroy(
    HIMAGELIST himl    // イメージリストのハンドル
);

ソースコードの入力

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

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)
{
    UINT wmId;
    LVCOLUMN lvcol;
    LVITEM item;
    UINT i;
    static HWND hList;
    static HIMAGELIST hImgL;
    static HIMAGELIST hImgS;
    switch (msg)
    {
        case WM_INITDIALOG:
            InitCommonControls();
            hImgL = ImageList_Create(32 , 32 , ILC_COLOR4 | ILC_MASK, 1 , 1);
            hImgS = ImageList_Create(16 , 16 , ILC_COLOR4 | ILC_MASK, 1 , 1);
            ImageList_AddIcon(hImgL , LoadIcon(NULL , MAKEINTRESOURCE(IDI_APPLICATION)));
            ImageList_AddIcon(hImgS , LoadIcon(NULL , MAKEINTRESOURCE(IDI_APPLICATION)));
            hList = GetDlgItem(hWnd, IDC_LIST1);
            ListView_SetImageList(hList , hImgL , LVSIL_NORMAL);
            ListView_SetImageList(hList , hImgS , LVSIL_SMALL);
            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 | LVIF_IMAGE;
            item.iImage = 0;
            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_COMMAND:
            wmId = LOWORD(wParam);
            switch (wmId)
            {
                case IDM_LARGE:
                    SetWindowLong(hList, GWL_STYLE,
                      WS_CHILD | WS_VISIBLE | LVS_EDITLABELS | LVS_ICON);
                    break;
                case IDM_SMALL:
                    SetWindowLong(hList, GWL_STYLE,
                      WS_CHILD | WS_VISIBLE | LVS_EDITLABELS | LVS_SMALLICON);
                    break;
                case IDM_LIST:
                    SetWindowLong(hList, GWL_STYLE,
                      WS_CHILD | WS_VISIBLE | LVS_EDITLABELS | LVS_LIST);
                    break;
                case IDM_TABLE:
                    SetWindowLong(hList, GWL_STYLE,
                      WS_CHILD | WS_VISIBLE | LVS_EDITLABELS | LVS_REPORT);
                    break;
                default:
                    break;
            }
            break;
        case WM_CLOSE:
            ImageList_Destroy(hImgL); 
            ImageList_Destroy(hImgS);
            EndDialog(hWnd, IDOK);
            break;
        default:
            break;
    }
    return FALSE;
}

resource.h
#define IDC_LIST1 400
#define IDM_LARGE 101
#define IDM_SMALL 102
#define IDM_LIST 103
#define IDM_TABLE 104
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

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

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

/////////////////////////////////////////////////////////////////////////////
//
// メニュー
//

IDC_HP MENU
BEGIN
    POPUP "表示(&V)"
    BEGIN
        MENUITEM "アイコン(&N)", IDM_LARGE
        MENUITEM "一覧(&A)", IDM_SMALL
        MENUITEM "リスト(&L)", IDM_LIST 
        MENUITEM "詳細(&D)", IDM_TABLE 
    END
END

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

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

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