C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ListView lParamの使用について


(過去ログ 176 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■101236 / inTopicNo.1)  ListView lParamの使用について
  
□投稿者/ パンの耳 (1回)-(2023/01/20(Fri) 02:05:31)

分類:[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);

}

以上になります。
よろしくお願いします




引用返信 編集キー/
■101237 / inTopicNo.2)  Re[1]: ListView lParamの使用について
□投稿者/ KOZ (384回)-(2023/01/20(Fri) 08:59:10)
2023/01/20(Fri) 09:45:05 編集(投稿者)

No101236 (パンの耳 さん) に返信
> // 行の作成
> 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);

LVITEM の lParam メンバはソート用の項目なので、2列目以降は使えないのでは?
http://www.kumei.ne.jp/c_lang/sdk2/sdk_110.htm

列ごとに情報を格納するのであれば、配列を用意する等、別の手段が必要と思います。

引用返信 編集キー/
■101243 / inTopicNo.3)  Re[2]: ListView lParamの使用について
□投稿者/ パンの耳 (2回)-(2023/01/20(Fri) 20:22:04)
ご回答有難うございます。

> LVITEM の lParam メンバはソート用の項目なので、2列目以降は使えないのでは?
> http://www.kumei.ne.jp/c_lang/sdk2/sdk_110.htm
ソート用なんですねorz
この方法では情報を持つのは諦めます。
(2列目を item.mask = LVIF_TEXT にするとテキスト表示自体はできました)

> 列ごとに情報を格納するのであれば、配列を用意する等、別の手段が必要と思います。
そのようにします。アドバイスありがとうございました!

引用返信 編集キー/
■101244 / inTopicNo.4)  Re[3]: ListView lParamの使用について
□投稿者/ パンの耳 (3回)-(2023/01/20(Fri) 20:22:27)
解決とします。
解決済み
引用返信 編集キー/
■101245 / inTopicNo.5)  Re[3]: ListView lParamの使用について
□投稿者/ とっちゃん (772回)-(2023/01/20(Fri) 21:08:04)
No101243 (パンの耳 さん) に返信
> ご回答有難うございます。
>
>>LVITEM の lParam メンバはソート用の項目なので、2列目以降は使えないのでは?
>>http://www.kumei.ne.jp/c_lang/sdk2/sdk_110.htm
> ソート用なんですねorz
> この方法では情報を持つのは諦めます。
> (2列目を item.mask = LVIF_TEXT にするとテキスト表示自体はできました)
>
>>列ごとに情報を格納するのであれば、配列を用意する等、別の手段が必要と思います。
> そのようにします。アドバイスありがとうございました!
>
解決にしてしまっていますが助言だけ…

lParamは、行に一つなので、各SubItemの単位での指定はできません。
また、ソート用のアイテムというわけではなく、本来なら別途ヒープから確保したオブジェクトを
行ごとの要素として持たせておくためのものとなっています。

lParam に持たせておくことで、アプリケーション側で個別にデータを保持しなくてもよく、
LVN_GETDISPINFO などの通知メッセージで、lParm の値を参照することでソート状態などを
考慮することなく、個々の行データにアクセスできるようになります。

今回の場合はインデックスみたいな形で使っているので、使えないかもしれませんが。

あと、今回は直接関係ない部分となりますが、GUIアプリを作るなら WinMain を使ってメイン関数を作ることをお勧めします。
テスト的に作ったプロジェクトなので、使い捨てだと思いますが、今の形だと必要のないコンソール画面が出てきてしまっていると思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -