リストビューからのメッセージ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
オカピーα
記事: 120
登録日時: 13年前

リストビューからのメッセージ

#1

投稿記事 by オカピーα » 13年前

現在、MDIを利用したソフトウェアを作成しています。
それの子ウィンドウにリストビューを貼り付けたのですが、
リストビューからのメッセージが捕まえられません。
具体的には、このソフトウェアでリストビューがダブルクリックされたときに
項目編集用のダイアログを表示したいのです。
ダブルクリックのメッセージはWM_NOTIFYで来ることはわかったのですが
一体どこのプロシージャで捕まえればいいのかさっぱりです。
MDIクライアントを一つ一つサブクラス化しなければいけないのでしょうか。
どなたか教えてください。
以下にコードを載せます。

[test.cpp]

コード:

#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#define STRICT 
#include <windows.h> 
#include "resource.h"
#define IDM_FIRSTCHILD 100 
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")

#define INIFILENAME TEXT(".\\info.ini")
LPCTSTR szBuf_edit1;
LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK DocProc(HWND, UINT, WPARAM, LPARAM); 
BOOL CALLBACK CloseAllProc(HWND, LPARAM); 
int MyRegisterWC(WNDPROC, LPCTSTR, HBRUSH); 
HWND MakeMyList(HWND);

TCHAR szClassName[] = TEXT("test");	//ウィンドウクラス
TCHAR ver[] = TEXT("Ver.test");
TCHAR winName[60];
TCHAR T_Name[] = TEXT("TEST");

TCHAR szFrameClassName[] = TEXT("MDI"); 
//フレームウィンドウクラス 
TCHAR szChildDoc[] = TEXT("DOC"); 
//ドキュメント 
HMENU hMenuDoc, hMenuDocWnd; 
HINSTANCE hInst;
void InsertMyColumn(HWND); 
void InsertMyItem(HWND);
// 関数定義:
void InitInfo();

//独自機能関数
void MyCreateTime(HWND);
void MyLoadIni();
HWND hChild_Time;
BOOL bTime = FALSE;
void CheckMySelect(); 
void CheckMyCheck();

//タイマー用グローバル変数
TCHAR szDate[32], szKey[8], szMsg[256];
int doc_no;
HWND hListView;

int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { 
	MSG msg; 
	HWND hFrame, 
	hClient; 
	hInst = hCurInst; 

	if(!MyRegisterWC(FrameWndProc, szFrameClassName,(HBRUSH)(COLOR_APPWORKSPACE + 1))) return FALSE; 
	if(!MyRegisterWC(DocProc, szChildDoc, (HBRUSH)GetStockObject(WHITE_BRUSH))) return FALSE; 


	hMenuDoc = LoadMenu(hInst, TEXT("MYDOCUMENT"));
	hMenuDocWnd = GetSubMenu(hMenuDoc, 1);
	
	//初期化処理関数
	InitInfo();

	hFrame = CreateWindow( szFrameClassName, winName, 
		 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 
		 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
		 NULL, hMenuDoc, hInst, NULL); 
	 hClient = GetWindow(hFrame, GW_CHILD);

	 ShowWindow(hFrame, nCmdShow); 
	 UpdateWindow(hFrame);

	  while (GetMessage(&msg, NULL, 0, 0)) {
		  if (!TranslateMDISysAccel(hClient, &msg)) { 
			  TranslateMessage(&msg); 
			  DispatchMessage(&msg); 
		  } 
	  } DestroyMenu(hMenuDoc); 
	  return msg.wParam; 
} 

 int MyRegisterWC(WNDPROC lpfnWndProc, LPCTSTR lpszClassName, HBRUSH hbrBack) {
	 WNDCLASSEX wc; 
	 
	 wc.cbSize = sizeof(WNDCLASSEX); 
	 wc.style = CS_HREDRAW | CS_VREDRAW; 
	 wc.lpfnWndProc = lpfnWndProc; 
	 wc.cbClsExtra = 0;
	 wc.cbWndExtra = 0;
	 wc.hInstance = hInst; //インスタンス 
	 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	 wc.hbrBackground = hbrBack;
	 wc.lpszMenuName = NULL; 
	 //メニュー名 
	 wc.lpszClassName = lpszClassName; 
	 wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
	 
	 return(RegisterClassEx(&wc)); 
 }


LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { 
	static HWND hClient; 

	CLIENTCREATESTRUCT ccs; 
	//MDICREATESTRUCT mdic; 
	//TCHAR str[64];
	HWND hChild;
	int MenuPos = 1;

	switch (msg) { 
		case WM_CREATE: 
			ccs.hWindowMenu = hMenuDocWnd; 
			ccs.idFirstChild = IDM_FIRSTCHILD; 
			hClient = CreateWindow( TEXT("MDICLIENT"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 
				0, 0, 0, 0, hWnd, (HMENU)1, hInst, (LPSTR)&ccs); 
			return 0;
		case WM_INITMENU:
			if (IsWindow(hChild_Time)){
				EnableMenuItem(hMenuDoc,IDM_T_TIME,MF_BYCOMMAND | MF_GRAYED);
			}else{
				EnableMenuItem(hMenuDoc,IDM_T_TIME,MF_BYCOMMAND | MF_ENABLED);
			}

		case WM_COMMAND: 
			switch (LOWORD(wp)) {
				case IDM_SELECT: 
					CheckMySelect(); 
					break;
				case IDM_CHECK: 
					CheckMyCheck();
					break;
				case IDM_CLOSE:
					hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0); 
					if (hChild) SendMessage(hClient, WM_MDIDESTROY, (WPARAM)hChild, 0); 
					return 0; 
				case IDM_EXIT: 
					SendMessage(hWnd, WM_CLOSE, 0, 0);
					return 0;
				case IDM_CLOSEALL:
					EnumChildWindows(hClient, &CloseAllProc, 0);
					return 0; 
				case IDM_TILE: 
					SendMessage(hClient, WM_MDITILE, 0, 0); 
					return 0;
				case IDM_CASCADE:
					SendMessage(hClient, WM_MDICASCADE, 0, 0);
					return 0; 
				case IDM_ARRANGE: 
					SendMessage(hClient, WM_MDIICONARRANGE, 0, 0);
					return 0;
				//以下独自機能
				case IDM_T_TIME:
					MyCreateTime(hClient);

				default: 
					hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0); 
					if (IsWindow(hChild)) SendMessage(hChild, WM_COMMAND, wp, lp); 
					break; 
			} 
			break; 
		case WM_QUERYENDSESSION: 
		case WM_CLOSE: 
			SendMessage(hWnd, WM_COMMAND, IDM_CLOSEALL, 0);
			if (GetWindow(hClient, GW_CHILD)) return 0; 
			break; 
		case WM_DESTROY: 
			PostQuitMessage(0);
			return 0; 
	} 
	return DefFrameProc(hWnd, hClient, msg, wp, lp); 
}



LRESULT CALLBACK DocProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
	static HWND hClient,hFrame; 
	RECT rc; 
	//int id; 
	INITCOMMONCONTROLSEX ic;

	switch (msg) {
		case WM_CREATE: 
			hClient = GetParent(hWnd); 
			hFrame = GetParent(hClient); 
			GetClientRect(hWnd, &rc);
			ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
			ic.dwICC = ICC_LISTVIEW_CLASSES; 
			InitCommonControlsEx(&ic);
			hListView = MakeMyList(hWnd);
			InsertMyColumn(hListView); 
			InsertMyItem(hListView);
			return 0;
		case WM_SIZE: 
			GetClientRect(hWnd, &rc);
			hListView = GetWindow(hWnd, GW_CHILD);
			MoveWindow(hListView, 0, 0, rc.right - rc.left, rc.bottom - rc.top, TRUE);
			break; 
		case WM_MDIACTIVATE: 
			if (lp == (LPARAM)hWnd) SendMessage(hClient, WM_MDISETMENU, (WPARAM)hMenuDoc, (LPARAM)hMenuDocWnd); 
			if (lp != (LPARAM)hWnd) SendMessage(hClient, WM_MDISETMENU, (WPARAM)hMenuDoc, (LPARAM)hMenuDocWnd);
			DrawMenuBar(hFrame);
			return 0;
			} return (DefMDIChildProc(hWnd, msg, wp, lp)); 
}

BOOL CALLBACK CloseAllProc(HWND hWnd, LPARAM lp) { 
	SendMessage(GetParent(hWnd), WM_MDIDESTROY, (WPARAM)hWnd, 0); 

	return TRUE;
}

void InitInfo(){
	//タイトルの作成
	//[TEST] + [Ver番号]
	wsprintf(winName,TEXT("%s %s"),T_Name , ver);

}


HWND MakeMyList(HWND hWnd) {
	HWND hListView;
	DWORD dwStyle;

	hListView = CreateWindowEx(0, WC_LISTVIEW, TEXT(""),
		WS_CHILD | WS_VISIBLE | LVS_REPORT, 
		0, 0, 0, 0, hWnd, (HMENU)100, hInst, NULL); 
	
	dwStyle = ListView_GetExtendedListViewStyle(hListView);
	dwStyle |= LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP; 
	ListView_SetExtendedListViewStyle(hListView, dwStyle); 
	return hListView;
}

void InsertMyColumn(HWND hListView) { 
	LV_COLUMN lvcol; 
	lvcol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvcol.fmt = LVCFMT_LEFT; 
	lvcol.cx = 100;
	lvcol.pszText = TEXT("日時"); 
	lvcol.iSubItem = 0;
	ListView_InsertColumn(hListView, 0, &lvcol);
	lvcol.cx = 80; 
	lvcol.pszText = TEXT("有効/無効");
	lvcol.iSubItem = 1; 
	ListView_InsertColumn(hListView, 1, &lvcol);
	lvcol.cx = 400; 
	lvcol.pszText = TEXT("メッセージ");
	lvcol.iSubItem = 2;
	ListView_InsertColumn(hListView, 2, &lvcol); 
	return; 
}

 void InsertMyItem(HWND hListView) {
	int n,i;
	TCHAR szKey[10],szSection[10],szBuf[256];
	LV_ITEM item;

	memset(&item, 0, sizeof(LV_ITEM));
	for(n = 0; n < 2 ; n++){
		wsprintf(szKey,TEXT("%d"),n);
		for(i = 0; i < 10; i++ ){
			wsprintf(szSection,TEXT("%d"),i);
			GetPrivateProfileString(szSection,szKey,TEXT("Nothing"),
					szBuf,(DWORD)sizeof(szBuf),INIFILENAME);

			item.mask = LVIF_TEXT;
			item.pszText = szBuf;
			item.iItem = i;               // 番号
			item.iSubItem = n;            // サブアイテムの番号
			if(n > 0){
				ListView_SetItem(hListView, &item);
			}else{
				ListView_InsertItem(hListView, &item);
			}
		}
	}

	 return; 
 }

 void MyCreateTime(HWND hClient){
/*	CLIENTCREATESTRUCT ccs;*/ 
	MDICREATESTRUCT mdic; 
		mdic.szClass = szChildDoc;
		mdic.szTitle = TEXT("時間設定"); 
		mdic.hOwner = hInst;
		mdic.x = CW_USEDEFAULT;
		mdic.y = CW_USEDEFAULT; 
		mdic.cx = CW_USEDEFAULT; 
		mdic.cy = CW_USEDEFAULT; 
		mdic.style = 0;
		mdic.lParam = 0;
		bTime = TRUE;
		hChild_Time = (HWND)SendMessage(hClient, WM_MDICREATE, 0, (LPARAM)&mdic);
 }


 void CheckMySelect() { 
	 int nItem = -1;
	 TCHAR str[256], name[64], sex[8], address[128]; 
	 while ((nItem = ListView_GetNextItem(hListView, nItem, LVNI_SELECTED)) != -1) { 
		 ListView_GetItemText(hListView, nItem, 0, name, sizeof(name)); 
		 ListView_GetItemText(hListView, nItem, 1, sex, sizeof(sex));
		 ListView_GetItemText(hListView, nItem, 2, address, sizeof(address)); 
		 wsprintf(str, TEXT("「%s, %s, %s」が選択されています"), name, sex, address);
		 MessageBox(hListView, str, TEXT("OK"), MB_OK); 
	 }
	 return;
}

 void CheckMyCheck() {
	 int nCount, i; 
	 TCHAR str[256], name[64], sex[8], address[128];
	 nCount = ListView_GetItemCount(hListView); 
	 for (i = 0; i < nCount; i++) { 
		 if (ListView_GetCheckState(hListView, i) != 0) { 
			 ListView_GetItemText(hListView, i, 0, name, sizeof(name));
			 ListView_GetItemText(hListView, i, 1, sex, sizeof(sex));
			 ListView_GetItemText(hListView, i, 2, address, sizeof(address)); 
			 wsprintf(str, TEXT("「%s, %s, %s」にチェックあり"), name, sex, address);
			 MessageBox(hListView, str, TEXT("CHECKED"), MB_OK);
		 } 
	 } return; 
 }
[resource.h]

コード:

#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif

#define IDM_EXIT                                105
#define IDI_ICON1                               107
#define IDM_CLOSE                               1001
#define IDM_CLOSEALL                            1002
#define IDM_TILE                                1003
#define IDM_CASCADE                             1004
#define IDM_ARRANGE                             1005
#define IDM_T_TIME                              40000
#define IDM_T_SUPPORT                           40001
#define IDM_T_REPORT                            40002
#define IDM_T_HIDDEN                            40003
#define IDM_T_LOGIN                             40004
#define IDM_T_ARMS                              40005
#define IDM_T_TEXT                              40006
#define IDM_CHECK                               40007
#define IDM_SELECT                              40008
[test.rc]

コード:

// Generated by ResEdit 1.5.9
// Copyright (C) 2006-2011
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"




//
// Menu resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
MYDOCUMENT MENU
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "閉じる(&C)", IDM_CLOSE
        MENUITEM SEPARATOR
        MENUITEM "終了(&X)", IDM_EXIT
    END
    POPUP "ウィンドウ(&W)"
    BEGIN
        MENUITEM "重ねて表示(&C)", IDM_CASCADE
        MENUITEM "並べて表示(&T)", IDM_TILE
        MENUITEM "すべて閉じる(&L)", IDM_CLOSEALL
        MENUITEM "アイコンの整列(&A)", IDM_ARRANGE
    END
    POPUP "ツール(&T)"
    BEGIN
        POPUP "起動"
        BEGIN
            MENUITEM "TEST", IDM_T_TIME
        END
    END
    POPUP "データ"
    BEGIN
        MENUITEM "チェックされたデータ", IDM_CHECK
        MENUITEM "選択されたアイテム", IDM_SELECT
    END
END



//
// Icon resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDI_ICON1          ICON           ".\\icon1.ico"
C,C++,C#,これらを極めることを「3C政策」と言う

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: リストビューからのメッセージ

#2

投稿記事 by へにっくす » 13年前

リストビューコントロール [WIN32 API]
の続きか?
とりあえず、WM_NOTIFYメッセージを書いてみて、動作するか確認してみたら?
少なくとも掲示されたソースには書かれていません。

それとソースをみてて思ったこと。。
MDIですよね?
子ウィンドウをいくつも作るかもしれないのに、
保持するのは一つのhListViewですか?
MDIの意味がないような…
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る