Solution46
CWndDockingPartition.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// ドッキングパーティションウィンドウクラス実装ファイル
4 ///
5 /// ドッキングパーティションウィンドウクラス実装ファイルです。
6 ///
7 /// $Id: CWndDockingPartition.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 <CWndDockingPartition.h>
18 #include <CommandIdDef.h>
19 #include <LibWindowUtility.h>
20 
21 //=============================================================================
22 // インクルード実装ファイル
23 #include <CArray.hpp>
24 
25 //=============================================================================
26 // ウィンドウライブラリ名前空間
27 namespace LibWindow {
28  //=========================================================================
29  // ドッキングパーティションウィンドウクラス
30  //=========================================================================
31  // 構築子と解体子
32  //-------------------------------------------------------------------------
33  // コンストラクタ
35  // 基底クラスコンストラクタ
36  : CWndPartition( &CreateDockingWindow, L"ドッキングウィンドウ" )
37  // メンバ変数初期化
38  , m_hSizeBar( nullptr )
39  , m_ePartitionPos( CWndPartition::PARTITION_POS )
40  , m_nPartitionSize( CWndPartition::PARTITION_SIZE )
41  {}
42 
43  //-------------------------------------------------------------------------
44  // デストラクタ
46  // サイズバーコントロールを破棄する
47  ::DestroyWindow( m_hSizeBar );
48  }
49 
50  //=========================================================================
51  // 公開関数
52  //-------------------------------------------------------------------------
53  // ウィンドウ作成関数
54  bool CWndDockingPartition::Create( HWND hParent, HMENU hMenu ) noexcept {
55  // 処理ブロック
56  bool result = false;
57  do {
58  // 基底クラスの関数を実行する
59  if ( !CWndPartition::Create( hParent, hMenu ) ) {
60  // 失敗!
61  break;
62  }
63 
64  // サイズバーコントロールを作成する
65  m_hSizeBar = CreateSizeBar( hParent );
66  if ( nullptr == m_hSizeBar ) {
67  // 失敗!
68  break;
69  }
70 
71  // 成功!
72  result = true;
73  } while ( false );
74 
75  // 実行結果を返す
76  return result;
77  }
78 
79  //-------------------------------------------------------------------------
80  // ウィンドウ構成情報初期化関数
81  bool CWndDockingPartition::InitConfig( CJsonConfig& rcConfig ) noexcept {
82  // 処理ブロック
83  bool result = false;
84  do {
85  // 基底クラスの関数を実行する
86  if ( !CWndPartition::InitConfig( rcConfig ) ) {
87  // 失敗!
88  break;
89  }
90 
91  // パーティション配置位置を取得する
92  rcConfig.Get( *reinterpret_cast< int* >( &m_ePartitionPos ), CWndPartition::KEY_PARTITION_POS );
93 
94  // パーティションサイズを取得する
96 
97  // 成功!
98  result = true;
99  } while ( false );
100 
101  // 実行結果を返す
102  return result;
103  }
104 
105  //-------------------------------------------------------------------------
106  // ウィンドウ構成情報保存関数
107  bool CWndDockingPartition::SaveConfig( CJsonConfig& rcConfig ) noexcept {
108  // 処理ブロック
109  bool result = false;
110  do {
111  // 基底クラスの関数を実行する
112  if ( !CWndPartition::SaveConfig( rcConfig ) ) {
113  // 失敗!
114  break;
115  }
116  // パーティション配置位置を保存する
117  else if ( !rcConfig.Set( *reinterpret_cast< int* >( &m_ePartitionPos ), CWndPartition::KEY_PARTITION_POS ) ) {
118  // 失敗!
119  break;
120  }
121  // パーティションサイズを保存する
122  else if ( !rcConfig.Set( m_nPartitionSize, CWndPartition::KEY_PARTITION_SIZE ) ) {
123  // 失敗!
124  break;
125  }
126 
127  // 成功!
128  result = true;
129  } while ( false );
130 
131  // 実行結果を返す
132  return result;
133  }
134 
135  //-------------------------------------------------------------------------
136  // メニューコマンド実行関数
137  bool CWndDockingPartition::ExecMenuCommand( WORD wId, WORD wCode, HWND hCtrl ) noexcept {
138  // 処理ブロック
139  bool result = false;
140  do {
141  // 親ペインウィンドウを取得する
142  CWndPane* pcParent = GetPaneWindow( ::GetParent( m_hWnd ) );
143  if ( nullptr != pcParent ) {
144  // パーティションウィンドウか調べる
145  if ( pcParent->IsPartition() ) {
146  // エレメントウィンドウリストを取得する
147  CWndPartition* pcPartition = reinterpret_cast< CWndPartition* >( pcParent );
148  CWndList* pcElementList = pcPartition->GetElementList();
149  if ( nullptr != pcElementList ) {
150  // コマンドIDを調べる
151  if ( ( ID_DEBUG_POS_ORDER <= wId ) && ( ID_DEBUG_POS_ORDER_END >= wId ) ) {
152  // オーダー番号を取得する
153  int nOrder = ( wId - ID_DEBUG_POS_ORDER );
154  if ( ( 0 <= nOrder ) && ( pcElementList->GetCount() > nOrder ) ) {
155  // エレメントウィンドウリストから削除する
156  if ( pcElementList->RemoveElementWindow( this ) ) {
157  // エレメントウィンドウリストに追加する
158  if ( pcElementList->Insert( nOrder, this ) ) {
159  // 成功!
160  result = true;
161  }
162  }
163  }
164  }
165  // コマンドIDを調べる
166  else switch ( wId ) {
167  case ID_DEBUG_POS_LEFT: // デバッグ::パーティション配置位置左側
168  // パーティション配置位置を設定する
170 
171  // 成功!
172  result = true;
173  break;
174  case ID_DEBUG_POS_TOP: // デバッグ::パーティション配置位置上側
175  // パーティション配置位置を設定する
177 
178  // 成功!
179  result = true;
180  break;
181  case ID_DEBUG_POS_RIGHT: // デバッグ::パーティション配置位置右側
182  // パーティション配置位置を設定する
184 
185  // 成功!
186  result = true;
187  break;
188  case ID_DEBUG_POS_BOTTOM: // デバッグ::パーティション配置位置下側
189  // パーティション配置位置を設定する
191 
192  // 成功!
193  result = true;
194  break;
195  }
196 
197  // 実行結果を調べる
198  if ( result ) {
199  // 親ウィンドウにWM_SIZEメッセージを送信する
200  ::SendMessageW( pcParent->GetHandle(), WM_SIZE, 0, 0 );
201  ::UpdateWindow( pcParent->GetHandle() );
202 
203  // 終了!
204  break;
205  }
206  }
207  }
208 
209  // 実行結果を調べる
210  if ( result ) {
211  // 親またはオーナーウィンドウを取得する
212  HWND hParent = GetParentOrOwner( m_hWnd );
213 
214  // WM_NOTIFY_CHILD_COMMANDメッセージを送信する
215  ::SendMessageW( hParent, WM_NOTIFY_CHILD_COMMAND, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
216 
217  // 終了!
218  break;
219  }
220  }
221 
222  // 基底クラスの関数を実行する
223  result = CWndPartition::ExecMenuCommand( wId, wCode, hCtrl );
224  } while ( false );
225 
226  // 実行結果を返す
227  return result;
228  }
229 
230  //-------------------------------------------------------------------------
231  // デバッグメニュー追加関数
232  bool CWndDockingPartition::AppendDebugMenu( HMENU hMenu ) noexcept {
233  // 処理ブロック
234  bool result = false;
235  do {
236  // 基底クラスの関数を実行する
237  if ( !CWndPartition::AppendDebugMenu( hMenu ) ) {
238  // 失敗!
239  break;
240  }
241 
242  // ペインウィンドウオーダー番号を取得する
243  int nOrder = GetOrderIndex();
244  if ( 0 > nOrder ) {
245  // 失敗!
246  break;
247  }
248 
249  // 通知コードを取得する
250  WORD wCode = static_cast< WORD >( nOrder );
251 
252  // サブメニューを作成する
253  HMENU hSubMenu = ::CreatePopupMenu();
254  if ( nullptr == hSubMenu ) {
255  // 失敗!
256  break;
257  }
258 
259  // メニューコマンドを追加する
260  ::AppendMenuW ( hSubMenu, MF_STRING, MAKELONG( ID_DEBUG_POS_LEFT, wCode ), L"左側" );
261  SetMenuCommandData( hSubMenu, MAKELONG( ID_DEBUG_POS_LEFT, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
262  EnableMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_LEFT, wCode ), ( EPartitionPos::Left != m_ePartitionPos ) );
263  CheckMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_LEFT, wCode ), ( EPartitionPos::Left == m_ePartitionPos ) );
264  ::AppendMenuW ( hSubMenu, MF_STRING, MAKELONG( ID_DEBUG_POS_TOP, wCode ), L"上側" );
265  SetMenuCommandData( hSubMenu, MAKELONG( ID_DEBUG_POS_TOP, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
266  EnableMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_TOP, wCode ), ( EPartitionPos::Top != m_ePartitionPos ) );
267  CheckMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_TOP, wCode ), ( EPartitionPos::Top == m_ePartitionPos ) );
268  ::AppendMenuW ( hSubMenu, MF_STRING, MAKELONG( ID_DEBUG_POS_RIGHT, wCode ), L"右側" );
269  SetMenuCommandData( hSubMenu, MAKELONG( ID_DEBUG_POS_RIGHT, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
270  EnableMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_RIGHT, wCode ), ( EPartitionPos::Right != m_ePartitionPos ) );
271  CheckMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_RIGHT, wCode ), ( EPartitionPos::Right == m_ePartitionPos ) );
272  ::AppendMenuW ( hSubMenu, MF_STRING, MAKELONG( ID_DEBUG_POS_BOTTOM, wCode ), L"下側" );
273  SetMenuCommandData( hSubMenu, MAKELONG( ID_DEBUG_POS_BOTTOM, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
274  EnableMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_BOTTOM, wCode ), ( EPartitionPos::Bottom != m_ePartitionPos ) );
275  CheckMenuCommand ( hSubMenu, MAKELONG( ID_DEBUG_POS_BOTTOM, wCode ), ( EPartitionPos::Bottom == m_ePartitionPos ) );
276 
277  // メニュー項目数を調べる
278  if ( 0 < ::GetMenuItemCount( hMenu ) ) {
279  // セパレータを追加する
280  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
281  }
282 
283  // サブメニューを追加する
284  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"配置位置" );
285  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
286  // サブメニュー項目を無効化する
287  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
288  }
289 
290  // サブメニューを作成する
291  hSubMenu = ::CreatePopupMenu();
292  if ( nullptr == hSubMenu ) {
293  // 失敗!
294  break;
295  }
296 
297  // 親ペインウィンドウを取得する
298  CWndPane* pcParent = GetPaneWindow( ::GetParent( m_hWnd ) );
299  if ( nullptr != pcParent ) {
300  // パーティションウィンドウか調べる
301  if ( pcParent->IsPartition() ) {
302  // エレメントウィンドウリストを取得する
303  CWndPartition* pcPartition = reinterpret_cast< CWndPartition* >( pcParent );
304  CWndList* pcElementList = pcPartition->GetElementList();
305  if ( nullptr != pcElementList ) {
306  // 巡回する
307  for ( int nIndex = 0, nCount = pcElementList->GetCount(); ( nCount > nIndex ) && ( 256 > nIndex ); ++nIndex ) {
308  // エレメントウィンドウを取得する
309  CWndElement* pcElement = ( *pcElementList )[ nIndex ];
310  if ( nullptr != pcElement ) {
311  // ウィンドウタイトルを取得する
312  wchar_t szBuffer[ MAX_PATH ];
313  ::GetWindowTextW( pcElement->GetHandle(), szBuffer, MAX_PATH );
314 
315  // メニューコマンドIDを取得する
316  UINT uId = MAKELONG( ( ID_DEBUG_POS_ORDER + nIndex ), wCode );
317 
318  // メニューコマンドを追加する
319  ::AppendMenuW ( hSubMenu, MF_STRING, uId, CString().Format( L"%d: %s", nIndex, szBuffer ) );
320  SetMenuCommandData( hSubMenu, uId, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
321  EnableMenuCommand ( hSubMenu, uId, ( this != pcElement ) );
322  CheckMenuCommand ( hSubMenu, uId, ( this == pcElement ) );
323  }
324  }
325  }
326  }
327  }
328 
329  // メニュー項目数を調べる
330  if ( 0 < ::GetMenuItemCount( hMenu ) ) {
331  // セパレータを追加する
332  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
333  }
334 
335  // サブメニューを追加する
336  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"配置順序" );
337  if ( 1 >= GetEnableMenuCommandCount( hSubMenu ) ) {
338  // サブメニュー項目を無効化する
339  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
340  }
341 
342  // 成功!
343  result = true;
344  } while ( false );
345 
346  // 実行結果を返す
347  return result;
348  }
349 }
350 
351 #pragma managed( pop )
virtual HWND & GetHandle() noexcept
ウィンドウハンドル取得関数
Definition: CWndBase.h:69
ウィンドウユーティリティライブラリヘッダファイル
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
コマンドID定義ヘッダファイル
virtual bool AppendDebugMenu(HMENU hMenu) noexcept override
デバッグメニュー追加関数
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
static HWND CreateSizeBar(HWND hParent) noexcept
サイズバーコントロール作成関数
HWND m_hSizeBar
サイズバーコントロールハンドル
virtual bool AppendDebugMenu(HMENU hMenu) noexcept override
デバッグメニュー追加関数
LIB_WINDOW_API bool CheckMenuCommand(HMENU hMenu, UINT uId, bool bCheck) noexcept
メニューコマンドチェック状態設定関数
virtual int GetOrderIndex(CWndPane *pcPane=nullptr, int *pnOrder=nullptr) noexcept override
ペインウィンドウオーダー番号取得関数
virtual ~CWndDockingPartition() noexcept
デストラクタ
constexpr WORD const ID_DEBUG_POS_BOTTOM
デバッグ::パーティション配置位置下側
Definition: CommandIdDef.h:79
配列クラス実装ヘッダファイル
LIB_WINDOW_API int GetEnableMenuCommandCount(HMENU hMenu) noexcept
メニューコマンド有効数取得関数
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept override
メニューコマンド実行関数
virtual bool InitConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報初期化関数
HWND m_hWnd
ウィンドウハンドル
Definition: CWndBase.h:1539
パーティションウィンドウクラス
Definition: CWndPartition.h:31
JSON構成情報クラス
Definition: CJsonConfig.h:31
int m_nPartitionSize
パーティションサイズ
constexpr WORD const ID_DEBUG_POS_TOP
デバッグ::パーティション配置位置上側
Definition: CommandIdDef.h:77
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
CWndDockingPartition() noexcept
コンストラクタ
static wchar_t const *const KEY_PARTITION_POS
パーティション配置位置キー文字列
Definition: CWndPartition.h:41
LIB_WINDOW_API HWND GetParentOrOwner(HWND hWnd) noexcept
親またはオーナーウィンドウ取得関数
ドッキングパーティションウィンドウクラスヘッダファイル
virtual bool RemoveElementWindow(CWndElement *pcElement) noexcept
エレメントウィンドウ削除関数
Definition: CWndList.h:196
virtual CWndList * GetElementList() noexcept
エレメントウィンドウリスト取得関数
Definition: CWndContainer.h:81
virtual bool IsPartition() const noexcept
パーティションウィンドウ判別関数
Definition: CWndPane.h:228
EPartitionPos m_ePartitionPos
パーティション配置位置種別
ウィンドウリストクラス
Definition: CWndList.h:35
文字列クラス
Definition: CString.h:31
LIB_WINDOW_API bool EnableMenuCommand(HMENU hMenu, UINT uId, bool bEnable) noexcept
メニューコマンド有効状態設定関数
constexpr WORD const ID_DEBUG_POS_RIGHT
デバッグ::パーティション配置位置右側
Definition: CommandIdDef.h:78
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
constexpr WORD const ID_DEBUG_POS_ORDER
デバッグ::パーティション配置順序コマンド先頭
Definition: CommandIdDef.h:80
virtual bool Insert(int nIndex, CArray const &rcInstance) noexcept
挿入関数
Definition: CArray.hpp:425
LIB_WINDOW_API bool SetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR uData) noexcept
メニューコマンドデータ設定関数
constexpr WORD const ID_DEBUG_POS_ORDER_END
デバッグ::パーティション配置順序コマンド最後尾
Definition: CommandIdDef.h:81
static wchar_t const *const KEY_PARTITION_SIZE
パーティションサイズキー文字列
Definition: CWndPartition.h:42
virtual CWndPane * GetPaneWindow(HWND hWnd) const noexcept
表示フラグ取得関数
Definition: CWndPane.h:178
ペインウィンドウクラス
Definition: CWndPane.h:74
virtual bool InitConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報初期化関数
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept override
メニューコマンド実行関数
constexpr WORD const ID_DEBUG_POS_LEFT
デバッグ::パーティション配置位置左側
Definition: CommandIdDef.h:76
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
constexpr UINT const WM_NOTIFY_CHILD_COMMAND
子ウィンドウコマンド実行通知
Definition: CWndPane.h:32
virtual int GetCount() const noexcept
配列要素数取得関数
Definition: CArray.h:149