回答編集履歴

1

コード補完

2016/04/20 00:44

投稿

hsk
hsk

スコア728

test CHANGED
@@ -1,5 +1,129 @@
1
- 自己解決しました。
1
+ お陰様で、自己解決しました。
2
2
 
3
+
4
+
3
- 毎度LoadMenuで生成をしてしまっていては、チェック状態は記憶されないようです。
5
+ 毎度 [LoadMenu](https://msdn.microsoft.com/ja-jp/library/cc410866.aspx) で生成をしてしまっていては、チェック状態は記憶されないようです。
4
6
 
5
7
  ウインドウ生成時にLoadMenuしたハンドルを保持して、これを操作することで、うまくチェック状態を保持することが出来ました。
8
+
9
+ 親ウインドウのポップアップメニューであれば、[SetMenu](https://msdn.microsoft.com/ja-jp/library/cc411047.aspx) でウインドウとメニューを結び付け、適宜 [GetMenu](https://msdn.microsoft.com/ja-jp/library/cc364679.aspx) 経由で操作できますが、子ウインドウ(コントロール)の場合 SetMenu は使えない(エラーコード [1436](https://msdn.microsoft.com/en-us/library/windows/desktop/ms681385.aspx))ので、ハンドルをメンバー変数として保持することにしました。
10
+
11
+ [WM_CREATE](https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms632619.aspx) メッセージが飛んできたら LoadMenu でメニューを読み込んでハンドルをメンバー変数に保持、[WM_DESTROY](https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms632620.aspx) メッセージで [DestroyMenu](https://msdn.microsoft.com/ja-jp/library/cc410758.aspx) を呼び出してメニューハンドルを破棄、ポップアップメニュー表示などのときにはメンバー変数に保持しているハンドルを操作します。
12
+
13
+
14
+
15
+ ```C++
16
+
17
+ class COcxCtrl : public COleControl
18
+
19
+ {
20
+
21
+ //...
22
+
23
+ HMENU m_hMenu = NULL;
24
+
25
+ //...
26
+
27
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
28
+
29
+ afx_msg void OnDestroy();
30
+
31
+ //...
32
+
33
+ }
34
+
35
+
36
+
37
+ int COcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
38
+
39
+ {
40
+
41
+ if (COleControl::OnCreate(lpCreateStruct) == -1)
42
+
43
+ return -1;
44
+
45
+
46
+
47
+ m_hMenu = ::LoadMenu((HINSTANCE)::GetWindowLong(this->GetSafeHwnd(), GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1));
48
+
49
+
50
+
51
+ return 0;
52
+
53
+ }
54
+
55
+
56
+
57
+ void COcxCtrl::OnDestroy()
58
+
59
+ {
60
+
61
+ if (m_hMenu != NULL)
62
+
63
+ ::DestroyMenu(m_hMenu);
64
+
65
+
66
+
67
+ COleControl::OnDestroy();
68
+
69
+ }
70
+
71
+
72
+
73
+
74
+
75
+ void COcxCtrl::OnPopupCheck()
76
+
77
+ {
78
+
79
+ //...
80
+
81
+
82
+
83
+ MENUITEMINFO menuItemInfo;
84
+
85
+ ::ZeroMemory(&menuItemInfo, sizeof(menuItemInfo));
86
+
87
+ menuItemInfo.cbSize = sizeof(menuItemInfo);
88
+
89
+ menuItemInfo.fMask = MIIM_STATE;
90
+
91
+
92
+
93
+ if (::GetMenuItemInfo(m_hMenu, IDM_POPUP_CHECK, false, &menuItemInfo))
94
+
95
+ {
96
+
97
+ if (menuItemInfo.fState & MF_CHECKED)
98
+
99
+ {
100
+
101
+ //...
102
+
103
+ menuItemInfo.fState &= ~MF_CHECKED;
104
+
105
+ }
106
+
107
+ else
108
+
109
+ {
110
+
111
+ //...
112
+
113
+ menuItemInfo.fState |= MF_CHECKED;
114
+
115
+ }
116
+
117
+ ::SetMenuItemInfo(m_hMenu, IDM_POPUP_CHECK, false, &menuItemInfo);
118
+
119
+ }
120
+
121
+ //...
122
+
123
+ }
124
+
125
+
126
+
127
+
128
+
129
+ ```