それの子ウィンドウにリストビューを貼り付けたのですが、
リストビューからのメッセージが捕まえられません。
具体的には、このソフトウェアでリストビューがダブルクリックされたときに
項目編集用のダイアログを表示したいのです。
ダブルクリックのメッセージは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;
}
#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
// 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"