|
分類:[C/C++]
C/C++の質問になるのですが、ご質問させてください。
開発環境は、VisualStudio2019、Windows10です。
windowsAPIを使用して、ListViewを作成しています。
最後に記述するコードにて、2列1行のリストは表示を行うことができました。
表示は行わないが、情報として持っておきたい値があるため、LVITEMのlParamを使用しようと考えました。
そこで、コードのコメントアウト部のようにLVITEMのmaskで、LVIF_PARAMを有効にしてから、lParamに値を入れてみたのですが、
その様にすると、2列目の項目の表示が消えてしまうのです。
コメントアウト部の上の部分のように、LVIF_TEXTだけ有効の状態だと、2列共表示されます。
ListView_SetItemの戻り値も確認してみましたが、TRUEが返ってくる為、失敗はしていなさそうだと思われます。
LVIF_PARAMを有効の状態で、2列目の項目も表示を行いたいのですが、改善方法をご教授頂きたいたです。
使い方に根本的な誤りがあれば申し訳ございません。
以下再現の手順と、ソースコードです。
[再現手順]
・空のプロジェクトを新規作成
・リソースビューから、追加→リソース より、Dialogの追加(IDD_DIALOG1)
・ListControlを作成し(IDD_LIST1)、ビューのプロパティをレポートに変更
[ソースコード]
※resource.hに、IDD_DIALOG1とIDD_LIST1の定義が必要です
#include <Windows.h>
#include <CommCtrl.h>
#include "resource.h"
void InitList(HWND hWnd);
LRESULT CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
int main()
{
HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hWnd = GetConsoleWindow();
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)DialogProc);
return 0;
}
LRESULT CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_INITDIALOG:
InitList(hWnd);
break;
case WM_COMMAND:
switch (LOWORD(wp))
{
case IDOK:
case IDCANCEL:
EndDialog(hWnd, wp);
return TRUE;
}
}
return FALSE;
}
void InitList(HWND hWnd)
{
HWND hWndList = GetDlgItem(hWnd, IDC_LIST1);
// リストの内容
char columns[][64] = { "列1", "列2" };
char items[][64] = { "項目1", "項目2" };
// 列の作成
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (int i = 0; i < _countof(columns); i++)
{
lvc.pszText = columns[i];
lvc.cx = 100;
ListView_InsertColumn(hWndList, i, &lvc);
}
// 行の作成
LVITEM item;
item.mask = LVIF_TEXT;
//item.mask = LVIF_TEXT | LVIF_PARAM; // ←この様にすると、2列目が消える
item.iItem = 0;
item.iSubItem = 0;
item.lParam = 100;
item.pszText = items[0];
ListView_InsertItem(hWndList, &item);
item.iSubItem = 1;
item.lParam = 101;
item.pszText = items[1];
ListView_SetItem(hWndList, &item);
}
以上になります。
よろしくお願いします
|