Solution46
LibWindowUtility.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// ウィンドウユーティリティライブラリ実装ファイル
4 ///
5 /// ウィンドウユーティリティライブラリ実装ファイルです。
6 ///
7 /// $Id: LibWindowUtility.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <LibWindowUtility.h>
18 
19 //=============================================================================
20 // ウィンドウライブラリ名前空間
21 namespace LibWindow {
22  //=========================================================================
23  // グローバル関数
24  //-------------------------------------------------------------------------
25  // メニューコマンド項目情報取得関数
26  bool GetMenuCommandItem( HMENU hMenu, UINT uId, HMENU* phMenu, MENUITEMINFOW* psItem, UINT uMask ) noexcept {
27  // 処理ブロック
28  bool result = false;
29  do {
30  // メニューハンドルを調べる
31  if ( nullptr == hMenu ) {
32  // 失敗!
33  break;
34  }
35  // 巡回する
36  else for ( int nIndex = 0, nCount = ::GetMenuItemCount( hMenu ); nCount > nIndex; ++nIndex ) {
37  // メニュー項目情報を取得する
38  MENUITEMINFOW sItem = { sizeof( MENUITEMINFOW ) };
39  sItem.fMask = ( MIIM_ID | MIIM_SUBMENU | uMask );
40  if ( 0 != ::GetMenuItemInfoW( hMenu, nIndex, true, &sItem ) ) {
41  // サブメニューハンドルを調べる
42  if ( nullptr != sItem.hSubMenu ) {
43  // メニューコマンド項目情報を取得する
44  if ( GetMenuCommandItem( sItem.hSubMenu, uId, phMenu, psItem, uMask ) ) {
45  // 成功!
46  result = true;
47  break;
48  }
49  }
50  // コマンドIDを調べる
51  else if ( uId == sItem.wID ) {
52  // メニューハンドルポインタを調べる
53  if ( nullptr != phMenu ) {
54  // メニューハンドルを取得する
55  *phMenu = hMenu;
56  }
57 
58  // メニュー項目情報構造体ポインタを調べる
59  if ( nullptr != psItem ) {
60  // メニュー項目情報を取得する
61  *psItem = sItem;
62  }
63 
64  // 成功!
65  result = true;
66  break;
67  }
68  }
69  }
70  } while ( false );
71 
72  // 実行結果を返す
73  return result;
74  }
75 
76  //-------------------------------------------------------------------------
77  // メニューコマンド項目情報設定関数
78  bool SetMenuCommandItem( HMENU hMenu, UINT uId, MENUITEMINFOW const* psItem ) noexcept {
79  // 処理ブロック
80  bool result = false;
81  do {
82  // メニューハンドルを調べる
83  if ( nullptr == hMenu ) {
84  // 失敗!
85  break;
86  }
87  // メニュー項目情報構造体ポインタを調べる
88  else if ( nullptr == psItem ) {
89  // 失敗!
90  break;
91  }
92  // 巡回する
93  else for ( int nIndex = 0, nCount = ::GetMenuItemCount( hMenu ); nCount > nIndex; ++nIndex ) {
94  // メニュー項目情報を取得する
95  MENUITEMINFOW sItem = { sizeof( MENUITEMINFOW ) };
96  sItem.fMask = ( MIIM_ID | MIIM_SUBMENU );
97  if ( 0 != ::GetMenuItemInfoW( hMenu, nIndex, true, &sItem ) ) {
98  // サブメニューハンドルを調べる
99  if ( nullptr != sItem.hSubMenu ) {
100  // メニューコマンド項目情報を設定する
101  if ( SetMenuCommandItem( sItem.hSubMenu, uId, psItem ) ) {
102  // 成功!
103  result = true;
104  break;
105  }
106  }
107  // コマンドIDを調べる
108  else if ( uId == sItem.wID ) {
109  // メニュー項目情報を設定する
110  if ( 0 != ::SetMenuItemInfoW( hMenu, nIndex, true, psItem ) ) {
111  // 成功!
112  result = hMenu;
113  }
114  break;
115  }
116  }
117  }
118  } while ( false );
119 
120  // 実行結果を返す
121  return result;
122  }
123 
124  //-------------------------------------------------------------------------
125  // メニューコマンド検索関数
126  HMENU FindMenuCommand( HMENU hMenu, UINT uId ) noexcept {
127  // 処理ブロック
128  HMENU result = nullptr;
129  do {
130  // メニューコマンド項目情報を取得する
131  if ( !GetMenuCommandItem( hMenu, uId, &hMenu ) ) {
132  // 失敗!
133  break;
134  }
135 
136  // 成功!
137  result = hMenu;
138  } while ( false );
139 
140  // 実行結果を返す
141  return result;
142  }
143 
144  //-------------------------------------------------------------------------
145  // メニューコマンドデータ取得関数
146  bool GetMenuCommandData( HMENU hMenu, UINT uId, ULONG_PTR& ruData ) noexcept {
147  // 処理ブロック
148  bool result = false;
149  do {
150  // メニューコマンド項目情報を取得する
151  MENUITEMINFOW sItem;
152  if ( !GetMenuCommandItem( hMenu, uId, nullptr, &sItem, MIIM_DATA ) ) {
153  // 失敗!
154  break;
155  }
156 
157  // コマンドデータを取得する
158  ruData = sItem.dwItemData;
159 
160  // 成功!
161  result = true;
162  } while ( false );
163 
164  // 実行結果を返す
165  return result;
166  }
167 
168  //-------------------------------------------------------------------------
169  // メニューコマンドデータ設定関数
170  bool SetMenuCommandData( HMENU hMenu, UINT uId, ULONG_PTR uData ) noexcept {
171  // 処理ブロック
172  bool result = false;
173  do {
174  // メニュー項目情報を作成する
175  MENUITEMINFOW sItem = { sizeof( MENUITEMINFOW ) };
176  sItem.fMask = MIIM_DATA;
177  sItem.dwItemData = uData;
178 
179  // メニューコマンド項目情報を設定する
180  if ( !SetMenuCommandItem( hMenu, uId, &sItem ) ) {
181  // 失敗!
182  break;
183  }
184 
185  // 成功!
186  result = true;
187  } while ( false );
188 
189  // 実行結果を返す
190  return result;
191  }
192 
193  //-------------------------------------------------------------------------
194  // メニューコマンド有効状態取得関数
195  bool IsEnableMenuCommand( HMENU hMenu, UINT uId ) noexcept {
196  // 処理ブロック
197  bool result = false;
198  do {
199  // メニューコマンドを検索する
200  hMenu = FindMenuCommand( hMenu, uId );
201  if ( nullptr == hMenu ) {
202  // 失敗!
203  break;
204  }
205 
206  // メニュー項目フラグを取得する
207  UINT uState = ::GetMenuState( hMenu, uId, MF_BYCOMMAND );
208 
209  // メニュー項目有効状態を調べる
210  result = ( MF_ENABLED == ( uState & ( MF_GRAYED | MF_DISABLED ) ) );
211  } while ( false );
212 
213  // 実行結果を返す
214  return result;
215  }
216 
217  //-------------------------------------------------------------------------
218  // メニューコマンド有効状態設定関数
219  bool EnableMenuCommand( HMENU hMenu, UINT uId, bool bEnable ) noexcept {
220  // 処理ブロック
221  bool result = false;
222  do {
223  // メニューコマンドを検索する
224  hMenu = FindMenuCommand( hMenu, uId );
225  if ( nullptr == hMenu ) {
226  // 失敗!
227  break;
228  }
229  // メニュー項目有効状態を設定する
230  else if ( 0 == ::EnableMenuItem( hMenu, uId, ( MF_BYCOMMAND | ( bEnable? MFS_ENABLED: MFS_DISABLED ) ) ) ) {
231  // 失敗!
232  break;
233  }
234 
235  // 成功!
236  result = true;
237  } while ( false );
238 
239  // 実行結果を返す
240  return result;
241  }
242 
243  //-------------------------------------------------------------------------
244  // メニューコマンドチェック状態取得関数
245  bool IsCheckMenuCommand( HMENU hMenu, UINT uId ) noexcept {
246  // 処理ブロック
247  bool result = false;
248  do {
249  // メニューコマンドを検索する
250  hMenu = FindMenuCommand( hMenu, uId );
251  if ( nullptr == hMenu ) {
252  // 失敗!
253  break;
254  }
255 
256  // メニュー項目フラグを取得する
257  UINT uState = ::GetMenuState( hMenu, uId, MF_BYCOMMAND );
258 
259  // メニュー項目チェック状態を調べる
260  result = ( MF_CHECKED == ( uState & MF_CHECKED ) );
261  } while ( false );
262 
263  // 実行結果を返す
264  return result;
265  }
266 
267  //-------------------------------------------------------------------------
268  // メニューコマンドチェック状態設定関数
269  bool CheckMenuCommand( HMENU hMenu, UINT uId, bool bCheck ) noexcept {
270  // 処理ブロック
271  bool result = false;
272  do {
273  // メニューコマンドを検索する
274  hMenu = FindMenuCommand( hMenu, uId );
275  if ( nullptr == hMenu ) {
276  // 失敗!
277  break;
278  }
279  // メニュー項目チェック状態を設定する
280  else if ( 0 == ::CheckMenuItem( hMenu, uId, ( MF_BYCOMMAND | ( bCheck? MFS_CHECKED: MFS_UNCHECKED ) ) ) ) {
281  // 失敗!
282  break;
283  }
284 
285  // 成功!
286  result = true;
287  } while ( false );
288 
289  // 実行結果を返す
290  return result;
291  }
292 
293  //-------------------------------------------------------------------------
294  // メニューコマンド有効数取得関数
295  int GetEnableMenuCommandCount( HMENU hMenu ) noexcept {
296  // 処理ブロック
297  int result = 0;
298  do {
299  // 巡回する
300  for ( int nIndex = 0, nCount = ::GetMenuItemCount( hMenu ); nCount > nIndex; ++nIndex ) {
301  // メニュー項目情報を取得する
302  MENUITEMINFOW sItem = { sizeof( MENUITEMINFOW ) };
303  sItem.fMask = ( MIIM_STATE | MIIM_ID | MIIM_SUBMENU );
304  if ( 0 != ::GetMenuItemInfoW( hMenu, nIndex, true, &sItem ) ) {
305  // サブメニューハンドルを調べる
306  if ( nullptr != sItem.hSubMenu ) {
307  // メニューコマンド有効数を加算する
308  result += GetEnableMenuCommandCount( sItem.hSubMenu );
309  }
310  // メニュー項目有効状態を調べる
311  else if ( MF_ENABLED == ( ( MF_GRAYED | MF_DISABLED ) & sItem.fState ) ) {
312  // 有効コマンド数をインクリメントする
313  ++result;
314  }
315  }
316  }
317  } while ( false );
318 
319  // 実行結果を返す
320  return result;
321  }
322 
323  //-------------------------------------------------------------------------
324  // 親またはオーナーウィンドウ取得関数
325  HWND GetParentOrOwner( HWND hWnd ) noexcept {
326  // 処理ブロック
327  HWND result = nullptr;
328  do {
329  // 親ウィンドウを取得する
330  HWND hParent = ::GetParent( hWnd );
331  if ( nullptr == hParent ) {
332  // オーナーウィンドウを取得する
333  hParent = ::GetWindow( hWnd, GW_OWNER );
334  if ( nullptr == hParent ) {
335  // 失敗!
336  break;
337  }
338  }
339 
340  // 成功!
341  result = hParent;
342  } while ( false );
343 
344  // 実行結果を返す
345  return result;
346  }
347 
348  //-------------------------------------------------------------------------
349  // 自分または子ウィンドウ判定関数
350  bool IsOwnOrChild( HWND hWnd, HWND hChild ) noexcept {
351  // 処理ブロック
352  bool result = false;
353  do {
354  // 自分自身か、または子ウィンドウか調べる
355  if ( ( hChild == hWnd ) || ( 0 != ::IsChild( hWnd, hChild ) ) ) {
356  // 成功!
357  result = true;
358  }
359  } while ( false );
360 
361  // 実行結果を返す
362  return result;
363  }
364 }
365 
366 #pragma managed( pop )
LIB_WINDOW_API bool GetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR &ruData) noexcept
メニューコマンドデータ取得関数
ウィンドウユーティリティライブラリヘッダファイル
LIB_WINDOW_API bool SetMenuCommandItem(HMENU hMenu, UINT uId, MENUITEMINFOW const *psItem) noexcept
メニューコマンド項目情報設定関数
LIB_WINDOW_API bool CheckMenuCommand(HMENU hMenu, UINT uId, bool bCheck) noexcept
メニューコマンドチェック状態設定関数
LIB_WINDOW_API int GetEnableMenuCommandCount(HMENU hMenu) noexcept
メニューコマンド有効数取得関数
LIB_WINDOW_API bool IsEnableMenuCommand(HMENU hMenu, UINT uId) noexcept
メニューコマンド有効状態取得関数
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
LIB_WINDOW_API bool GetMenuCommandItem(HMENU hMenu, UINT uId, HMENU *phMenu=nullptr, MENUITEMINFOW *psItem=nullptr, UINT uMask=0) noexcept
メニューコマンド項目情報取得関数
LIB_WINDOW_API HMENU FindMenuCommand(HMENU hMenu, UINT uId) noexcept
メニューコマンド検索関数
LIB_WINDOW_API HWND GetParentOrOwner(HWND hWnd) noexcept
親またはオーナーウィンドウ取得関数
LIB_WINDOW_API bool EnableMenuCommand(HMENU hMenu, UINT uId, bool bEnable) noexcept
メニューコマンド有効状態設定関数
LIB_WINDOW_API bool SetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR uData) noexcept
メニューコマンドデータ設定関数
LIB_WINDOW_API bool IsCheckMenuCommand(HMENU hMenu, UINT uId) noexcept
メニューコマンドチェック状態取得関数
LIB_WINDOW_API bool IsOwnOrChild(HWND hWnd, HWND hChild) noexcept
自分または子ウィンドウ判定関数