teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード補完

2016/04/20 00:44

投稿

hsk
hsk

スコア728

answer CHANGED
@@ -1,3 +1,65 @@
1
- 自己解決しました。
2
- 毎度LoadMenuで生成をしてしまっていては、チェック状態は記憶されないようです。
3
- ウインドウ生成時にLoadMenuしたハンドル保持して、これを操作することで、うチェック状態を保持ることが出来ました
1
+ お陰様で、自己解決しました。
2
+
3
+ 毎度 [LoadMenu](https://msdn.microsoft.com/ja-jp/library/cc410866.aspx) で生成をしてっていては、チェック状態は記憶されないようです。
4
+ ウインドウ生成時にLoadMenuしたハンドルを保持して、これを操作することで、うまくチェック状態を保持することが出来ました。
5
+ 親ウインドウのポップアップメニューであれば、[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))ので、ハンドルをメンバー変数として保持することにしました。
6
+ [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) を呼び出してメニューハンドルを破棄、ポップアップメニュー表示などのときにはメンバー変数に保持しているハンドルを操作します。
7
+
8
+ ```C++
9
+ class COcxCtrl : public COleControl
10
+ {
11
+ //...
12
+ HMENU m_hMenu = NULL;
13
+ //...
14
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
15
+ afx_msg void OnDestroy();
16
+ //...
17
+ }
18
+
19
+ int COcxCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
20
+ {
21
+ if (COleControl::OnCreate(lpCreateStruct) == -1)
22
+ return -1;
23
+
24
+ m_hMenu = ::LoadMenu((HINSTANCE)::GetWindowLong(this->GetSafeHwnd(), GWL_HINSTANCE), MAKEINTRESOURCE(IDR_MENU1));
25
+
26
+ return 0;
27
+ }
28
+
29
+ void COcxCtrl::OnDestroy()
30
+ {
31
+ if (m_hMenu != NULL)
32
+ ::DestroyMenu(m_hMenu);
33
+
34
+ COleControl::OnDestroy();
35
+ }
36
+
37
+
38
+ void COcxCtrl::OnPopupCheck()
39
+ {
40
+ //...
41
+
42
+ MENUITEMINFO menuItemInfo;
43
+ ::ZeroMemory(&menuItemInfo, sizeof(menuItemInfo));
44
+ menuItemInfo.cbSize = sizeof(menuItemInfo);
45
+ menuItemInfo.fMask = MIIM_STATE;
46
+
47
+ if (::GetMenuItemInfo(m_hMenu, IDM_POPUP_CHECK, false, &menuItemInfo))
48
+ {
49
+ if (menuItemInfo.fState & MF_CHECKED)
50
+ {
51
+ //...
52
+ menuItemInfo.fState &= ~MF_CHECKED;
53
+ }
54
+ else
55
+ {
56
+ //...
57
+ menuItemInfo.fState |= MF_CHECKED;
58
+ }
59
+ ::SetMenuItemInfo(m_hMenu, IDM_POPUP_CHECK, false, &menuItemInfo);
60
+ }
61
+ //...
62
+ }
63
+
64
+
65
+ ```