リストビューの項目を編集できるようにします。編集ができるのは、一番左側の項目だけにします。
項目を左クリックすることで、項目が編集できるようになります。
リストビュー1 - インコのWindowsSDK で作成したソースを修正します。
流れ
WM_NOTIFY
1.WM_NOTIFYメッセージを捕まえます。
2.この時のwParamの値を調べてツリービューのIDと同じかどうか調べて同じなら、 lParamの値をLV_DISPINFO構造体のポインタに代入します。
typedef struct tag LV_DISPINFO {
NMHDR hdr; // NMHDR構造体
LVITEM item;
} LV_DISPINFO;
3.TV_DISPINFO構造体のメンバであるNMHDR構造体のcodeメンバが、LVN_BEGINLABELEDITならば、編集が開始されたと、判断します。このとき、ListView_GetEditControl()で、表示されたエデットコントロールのハンドルを取得します。
HWND ListView_GetEditControl(
HWND hwnd
);
SendMessage(hWndControl, LVM_GETEDITCONTROL, 0, 0)と同等。
4.TV_DISPINFO構造体のメンバであるNMHDR構造体のcodeメンバが、LVN_ENDLABELEDITメッセージならば編集が終わったと判断し、 GetWindowText()でエディトコントロールに入力された文字列をバッファ(ここではbuf)にセット。
5.ListView_SetItemText()で、リストビューの文字をセット。
VOID ListView_SetItemText(
HWND hwnd, // リストビューのハンドル
int i, // リストの項目のインデックス
int iSubItem, // リストの項目のサブアイテム(サブアイテムでないときは、0)
LPCTSTR pszText // セットする文字列
);
SendMessage(hWndControl, LVM_SETITEMTEXT, 0, 0)と同等。
リソース
ウインドウスタイルにLVS_EDITLABELSを追加。
ソースコードの入力
ソースコードは下記のように入れてください。
#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;
LV_DISPINFO *lvinfo;
TCHAR buf[64];
static HWND hEdit;
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_NOTIFY:
if ((int)wParam == IDC_LIST1)
{
lvinfo = (LV_DISPINFO *)lParam;
switch (lvinfo->hdr.code)
{
case LVN_BEGINLABELEDIT:
hEdit = ListView_GetEditControl(hList);
break;
case LVN_ENDLABELEDIT:
GetWindowText(hEdit, buf, sizeof(buf));
ListView_SetItemText(hList, lvinfo->item.iItem, 0, buf);
break;
}
}
break;
case WM_CLOSE:
EndDialog(hWnd, IDOK);
break;
default:
break;
}
return FALSE;
}
上記の太線で示している箇所のみ追加です。
#define IDC_LIST1 400 #ifndef IDC_STATIC #define IDC_STATIC -1 #endif
#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 | LVS_EDITLABELS,
2, 2, 166, 58
END
Reseditで作成した場合は、これとは異なるソースコードになります。 上記の太線で示している箇所のみ追加です。