今回は、リストビューにアイコンを付けます。
リストビュー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で作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。