Solution46
CWndMain.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// メインウィンドウクラス実装ファイル
4 ///
5 /// メインウィンドウクラス実装ファイルです。
6 ///
7 /// $Id: CWndMain.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 <CWndMain.h>
18 #include <CommandIdDef.h>
19 #include <CJsonConfigAuto.h>
20 #include <LibUtility.h>
21 #include <LibWindowUtility.h>
22 #include <algorithm>
23 
24 //=============================================================================
25 // インクルード実装ファイル
26 #include <CArray.hpp>
27 
28 //=============================================================================
29 // ウィンドウライブラリ名前空間
30 namespace LibWindow {
31  //=========================================================================
32  // メインウィンドウクラス
33  //=========================================================================
34  // 構築子と解体子
35  //-------------------------------------------------------------------------
36  // コンストラクタ
37  CWndMain::CWndMain() noexcept
38  // 基底クラスコンストラクタ
39  : CWndOverlap()
40  // メンバ変数初期化
41  , m_hMenu( nullptr )
42  , m_hAccel( nullptr )
43  , m_hStatusBar( nullptr )
44  , m_hSeparator( nullptr )
45  , m_cToolBar()
46  , m_cOverlapList()
47  , m_cFloatingList()
48  , m_hIconImageList( nullptr )
49  , m_pcIconImageList( nullptr )
50  , m_pcToolBarButtonList( nullptr )
51  , m_bFocusOverlap( false )
52  , m_bFocusFloating( false )
53  , m_bMenuMouseActivate( false )
54  , m_bValidMenuSelect( false )
55  , m_bToolBarMouseActivate( false )
56  , m_bValidToolBarSelect( false )
57  , m_bPerformanceTimer( false )
58  , m_nPerformanceFreq( 0 )
59  , m_nPerformanceCount( 0 )
60  , m_nSecondCount( 0 )
61  , m_nErrorCount( 0 )
62  , m_cFrameWaitTimer()
63  , m_nFrameWaitTime( 0 )
64  , m_nFpsCount( 0 )
65  , m_nFpsValue( 0 )
66  , m_nFpsMax( FPS_MAX )
67  , m_bUpdatedFpsValue( false )
68  , m_cOtherInfo()
69  {
70  // コモンコントロールを初期化する
71  ::InitCommonControls();
72 
73  // 処理ブロック
74  do {
75  // アイコンイメージリストを作成する
77  if ( nullptr == m_pcIconImageList ) {
78  // 致命的エラー!
80  break;
81  }
82 
83  // ツールバーボタンリストを作成する
85  if ( nullptr == m_pcToolBarButtonList ) {
86  // 致命的エラー!
88  break;
89  }
90 
91  // メインメニューを作成する
92  m_hMenu = ::CreateMenu();
93  if ( nullptr == m_hMenu ) {
94  // 致命的エラー!
96  break;
97  }
98  } while ( false );
99  }
100 
101  //-------------------------------------------------------------------------
102  // デストラクタ
103  CWndMain::~CWndMain() noexcept {
104  // アクセラレータテーブルを破棄する
105  ::DestroyAcceleratorTable( m_hAccel );
106 
107  // メニューを破棄する
108  ::DestroyMenu( m_hMenu );
109 
110  // ツールバーボタンリストを削除する
111  delete m_pcToolBarButtonList;
112 
113  // アイコンイメージリストを削除する
114  delete m_pcIconImageList;
115  }
116 
117  //=========================================================================
118  // 公開関数
119  //-------------------------------------------------------------------------
120  // ウィンドウ作成関数
121  bool CWndMain::Create( HWND, HMENU ) noexcept {
122  // 処理ブロック
123  bool result = false;
124  do {
125  // 基底クラスの関数を実行する
126  if ( !CWndOverlap::Create( nullptr, m_hMenu ) ) {
127  // 失敗!
128  break;
129  }
130  // アクセラレータテーブルを作成する
131  else if ( !CreateAccel() ) {
132  // 失敗!
133  break;
134  }
135  // ツールバーを作成する
136  else if ( !CreateToolBar() ) {
137  // 失敗!
138  break;
139  }
140  // ステータスバーを作成する
141  else if ( !CreateStatusBar() ) {
142  // 失敗!
143  break;
144  }
145  // セパレータを作成する
146  else if ( !CreateSeparator() ) {
147  // 失敗!
148  break;
149  }
150  // オーバーラップウィンドウリストを作成する
151  else if ( !m_cOverlapList.CreateListWindow( m_hWnd ) ) {
152  // 失敗!
153  break;
154  }
155  // フローティングウィンドウリストを作成する
156  else if ( !m_cFloatingList.CreateListWindow( m_hWnd ) ) {
157  // 失敗!
158  break;
159  }
160 
161  // 成功!
162  result = true;
163  } while ( false );
164 
165  // 実行結果を返す
166  return result;
167  }
168 
169  //-------------------------------------------------------------------------
170  // WM_DESTROYメッセージ処理関数
171  LRESULT CWndMain::WmDestroy() noexcept {
172  // 処理ブロック
173  LRESULT result = 0;
174  do {
175  // 終了メッセージをポストする
176  ::PostQuitMessage( 0 );
177  } while ( false );
178 
179  // 実行結果を返す
180  return result;
181  }
182 
183  //-------------------------------------------------------------------------
184  // WM_SIZEメッセージ処理関数
185  LRESULT CWndMain::WmSize() noexcept {
186  // 処理ブロック
187  LRESULT result = 0;
188  do {
189  // ウィンドウ表示状態を調べる
190  if ( 0 == ::IsWindowVisible( m_hWnd ) ) {
191  // 終了!
192  break;
193  }
194 
195  // クライアント領域を調べる
196  RECT sClientRect = {};
197  ::GetClientRect( m_hWnd, &sClientRect );
198  if ( 0 == ::IsRectEmpty( &sClientRect ) ) {
199  // ツールバー表示状態を調べる
200  if ( 0 != ::IsWindowVisible( m_cToolBar.GetHandle() ) ) {
201  // WM_SIZEメッセージを送信する
202  ::SendMessageW( m_cToolBar.GetHandle(), WM_SIZE, 0, 0 );
203  ::UpdateWindow( m_cToolBar.GetHandle() );
204 
205  // ツールバー表示領域を取得する
206  RECT sRect;
207  ::GetWindowRect( m_cToolBar.GetHandle(), &sRect );
208 
209  // クライアント座標系に変換する
210  ::ScreenToClient( m_hWnd, reinterpret_cast< LPPOINT >( &sRect.left ) );
211  ::ScreenToClient( m_hWnd, reinterpret_cast< LPPOINT >( &sRect.right ) );
212 
213  // セパレータを表示する
214  int nLeft = sRect.left;
215  int nTop = sRect.bottom;
216  int nWidth = ( sRect.right - nLeft );
217  int nHeight = SEPARATOR_HEIGHT;
218  ::SetWindowPos( m_hSeparator, HWND_TOP, nLeft, nTop, nWidth, nHeight, ( SWP_NOACTIVATE | SWP_SHOWWINDOW ) );
219  ::UpdateWindow( m_hSeparator );
220  }
221  else {
222  // セパレータを隠す
223  ::ShowWindow( m_hSeparator, SW_HIDE );
224  }
225 
226  // ステータスバー表示状態を調べる
227  if ( 0 != ::IsWindowVisible( m_hStatusBar ) ) {
228  // WM_SIZEメッセージを送信する
229  ::SendMessageW( m_hStatusBar, WM_SIZE, 0, 0 );
230  ::UpdateWindow( m_hStatusBar );
231  }
232  }
233 
234  // 基底クラスの関数を実行する
235  result = CWndOverlap::WmSize();
236  } while ( false );
237 
238  // 実行結果を返す
239  return result;
240  }
241 
242  //-------------------------------------------------------------------------
243  // WM_SETFOCUSメッセージ処理関数
244  LRESULT CWndMain::WmSetFocus() noexcept {
245  // 処理ブロック
246  LRESULT result = 0;
247  do {
248  // メニューマウスアクティベートフラグを調べる
249  if ( m_bMenuMouseActivate ) {
250  // フォーカスウィンドウを無効化する
251  ::SetFocus( nullptr );
252 
253  // 終了!
254  break;
255  }
256  // ツールバーマウスアクティベートフラグを調べる
257  else if ( m_bToolBarMouseActivate ) {
258  // フォーカスウィンドウを無効化する
259  ::SetFocus( nullptr );
260 
261  // 終了!
262  break;
263  }
264 
265  // オーバーラップウィンドウフォーカス有効状態を調べる
266  if ( m_bFocusOverlap ) {
267  // カレントエレメントウィンドウを取得する
269  if ( nullptr != pcElement ) {
270  // フォーカスウィンドウを設定する
271  ::SetFocus( pcElement->GetHandle() );
272 
273  // 終了!
274  break;
275  }
276  }
277 
278  // フローティングウィンドウフォーカス有効状態を調べる
279  if ( m_bFocusFloating ) {
280  // カレントエレメントウィンドウを取得する
282  if ( nullptr != pcElement ) {
283  // フォーカスウィンドウを設定する
284  ::SetFocus( pcElement->GetHandle() );
285 
286  // 終了!
287  break;
288  }
289  }
290 
291  // 基底クラスの関数を実行する
292  result = CWndOverlap::WmSetFocus();
293  } while ( false );
294 
295  // 実行結果を返す
296  return result;
297  }
298 
299  //-------------------------------------------------------------------------
300  // WM_MOUSEACTIVATEメッセージ処理関数
301  LRESULT CWndMain::WmMouseActivate() noexcept {
302  // 処理ブロック
303  LRESULT result = 0;
304  do {
305  // メニューマウスアクティベートフラグをクリアする
306  m_bMenuMouseActivate = false;
307 
308  // メニュー項目選択有効フラグをクリアする
309  m_bValidMenuSelect = false;
310 
311  // ツールバーマウスアクティベートフラグをクリアする
312  m_bToolBarMouseActivate = false;
313 
314  // ツールバーボタン選択有効フラグをクリアする
315  m_bValidToolBarSelect = false;
316 
317  // ヒットテストコードを調べる
318  WORD wHitTest = LOWORD( m_lParam );
319  if ( HTMENU == wHitTest ) {
320  // メニューマウスアクティベートフラグをセットする
321  m_bMenuMouseActivate = true;
322 
323  // 終了!
324  break;
325  }
326  // ツールバー表示状態を調べる
327  else if ( 0 != ::IsWindowVisible( m_cToolBar.GetHandle() ) ) {
328  // カーソル位置を取得する
329  POINT sPoint;
330  ::GetCursorPos( &sPoint );
331 
332  // クライアント座標系に変換する
333  ::ScreenToClient( m_cToolBar.GetHandle(), &sPoint );
334 
335  // 巡回する
336  for ( int nIndex = 0, nCount = m_pcToolBarButtonList->GetCount(); nCount > nIndex; ++nIndex ) {
337  // ボタン種別を調べる
338  if ( BTNS_BUTTON == ( *m_pcToolBarButtonList )[ nIndex ].fsStyle ) {
339  // ボタン表示領域を取得する
340  RECT sRect;
341  if ( TRUE == ::SendMessageW( m_cToolBar.GetHandle(), TB_GETITEMRECT, nIndex, reinterpret_cast< LPARAM >( &sRect ) ) ) {
342  // カーソル位置を調べる
343  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
344  // ツールバーマウスアクティベートフラグをセットする
346 
347  // ボタン有効状態を調べる
348  int idCommand = ( *m_pcToolBarButtonList )[ nIndex ].idCommand;
349  if ( 0 != ::SendMessageW( m_cToolBar.GetHandle(), TB_ISBUTTONENABLED, idCommand, 0 ) ) {
350  // ツールバーボタン選択有効フラグをセットする
351  m_bValidToolBarSelect = true;
352  }
353 
354  // 終了!
355  break;
356  }
357  }
358  }
359  }
360 
361  // ツールバーマウスアクティベートフラグを調べる
362  if ( m_bToolBarMouseActivate ) {
363  // 終了!
364  break;
365  }
366  }
367 
368  // オーバーラップウィンドウフォーカス有効フラグをクリアする
369  m_bFocusOverlap = false;
370 
371  // フローティングウィンドウフォーカス有効フラグをクリアする
372  m_bFocusFloating = false;
373  } while ( false );
374 
375  // 実行結果を返す
376  return result;
377  }
378 
379  //-------------------------------------------------------------------------
380  // WM_MENUSELECTメッセージ処理関数
381  LRESULT CWndMain::WmMenuSelect() noexcept {
382  // 処理ブロック
383  LRESULT result = 0;
384  do {
385  // メニューマウスアクティベートフラグを調べる
386  if ( m_bMenuMouseActivate ) {
387  // メニューハンドルを調べる
388  HMENU hMenu = reinterpret_cast< HMENU >( m_lParam );
389  if ( m_hMenu == hMenu ) {
390  // メニュー項目選択有効フラグをセットする
391  m_bValidMenuSelect = true;
392  }
393  }
394 
395  // 基底クラスの関数を実行する
396  result = CWndOverlap::WmMenuSelect();
397  } while ( false );
398 
399  // 実行結果を返す
400  return result;
401  }
402 
403  //-------------------------------------------------------------------------
404  // WM_EXITMENULOOPメッセージ処理関数
405  LRESULT CWndMain::WmExitMenuLoop() noexcept {
406  // 処理ブロック
407  LRESULT result = 0;
408  do {
409  // メニューマウスアクティベートフラグを調べる
410  if ( m_bMenuMouseActivate ) {
411  // メニューマウスアクティベートフラグをクリアする
412  m_bMenuMouseActivate = false;
413 
414  // メニュー項目選択有効フラグを調べる
415  if ( !m_bValidMenuSelect ) {
416  // メニュー項目選択有効フラグをクリアする
417  m_bValidMenuSelect = false;
418 
419  // オーバーラップウィンドウフォーカス有効フラグをクリアする
420  m_bFocusOverlap = false;
421 
422  // フローティングウィンドウフォーカス有効フラグをクリアする
423  m_bFocusFloating = false;
424  }
425 
426  // フォーカスウィンドウを設定する
427  ::SetFocus( m_hWnd );
428  }
429 
430  // 基底クラスの関数を実行する
431  result = CWndOverlap::WmExitMenuLoop();
432  } while ( false );
433 
434  // 実行結果を返す
435  return result;
436  }
437 
438  //-------------------------------------------------------------------------
439  // NM_CLICKメッセージ処理関数
440  LRESULT CWndMain::NmClick() noexcept {
441  // 処理ブロック
442  LRESULT result = 0;
443  do {
444  // 通知メッセージヘッダ構造体を取得する
445  NMHDR* psNmHdr = reinterpret_cast< LPNMHDR >( m_lParam );
446 
447  // コントロールハンドルを調べる
448  if ( m_cToolBar.GetHandle() == psNmHdr->hwndFrom ) {
449  // ツールバーマウスアクティベートフラグを調べる
450  if ( m_bToolBarMouseActivate ) {
451  // ツールバーマウスアクティベートフラグをクリアする
452  m_bToolBarMouseActivate = false;
453  }
454  else {
455  // オーバーラップウィンドウフォーカス有効フラグをクリアする
456  m_bFocusOverlap = false;
457 
458  // フローティングウィンドウフォーカス有効フラグをクリアする
459  m_bFocusFloating = false;
460  }
461 
462  // フォーカスウィンドウを設定する
463  ::SetFocus( m_hWnd );
464  }
465 
466  // 基底クラスの関数を実行する
467  result = CWndOverlap::NmClick();
468  } while ( false );
469 
470  // 実行結果を返す
471  return result;
472  }
473 
474  //-------------------------------------------------------------------------
475  // WM_DRAWITEMメッセージ処理関数
476  LRESULT CWndMain::WmDrawItem() noexcept {
477  // 処理ブロック
478  LRESULT result = 0;
479  do {
480  // 描画アイテム構造体を取得する
481  LPDRAWITEMSTRUCT lpDraw = reinterpret_cast< LPDRAWITEMSTRUCT >( m_lParam );
482 
483  // コントロールハンドルを調べる
484  if ( m_hSeparator == lpDraw->hwndItem ) {
485  // セパレータを描画する
486  DrawSeparator( lpDraw );
487 
488  // 終了!
489  break;
490  }
491 
492  // 基底クラスの関数を実行する
493  result = CWndOverlap::WmDrawItem();
494  } while ( false );
495 
496  // 実行結果を返す
497  return result;
498  }
499 
500  //-------------------------------------------------------------------------
501  // WM_COMMANDメッセージ処理関数
502  LRESULT CWndMain::WmCommand() noexcept {
503  // 処理ブロック
504  LRESULT result = 0;
505  do {
506  // コンテキストメニューハンドルを調べる
507  if ( nullptr == s_hContextMenu ) {
508  // コマンドIDを取得する
509  WORD wId = LOWORD( m_wParam );
510  if ( 0 != wId ) {
511  // 通知コードを取得する
512  WORD wCode = HIWORD( m_wParam );
513 
514  // コントロールハンドルを取得する
515  HWND hCtrl = reinterpret_cast< HWND >( m_lParam );
516  if ( nullptr != hCtrl ) {
517  // メニューコマンドを実行する
518  ExecMenuCommand( wId, wCode, hCtrl );
519 
520  // 終了!
521  break;
522  }
523 
524  // メニューコマンドデータを取得する
525  CWndPane* pcPane = nullptr;
526  ULONG_PTR uData;
527  if ( GetMenuCommandData( m_hMenu, static_cast< UINT >( m_wParam ), uData ) ) {
528  // コントロールハンドルを取得する
529  hCtrl = reinterpret_cast< HWND >( uData );
530 
531  // ペインウィンドウポインタを取得する
532  pcPane = GetPaneWindow( hCtrl );
533  }
534 
535  // ペインウィンドウポインタを調べる
536  if ( nullptr == pcPane ) {
537  // ペインウィンドウポインタを設定する
538  pcPane = this;
539  }
540 
541  // メニューコマンドを実行する
542  pcPane->ExecMenuCommand( wId, wCode, hCtrl );
543 
544  // 終了!
545  break;
546  }
547  }
548 
549  // 基底クラスの関数を実行する
550  result = CWndOverlap::WmCommand();
551  } while ( false );
552 
553  // 実行結果を返す
554  return result;
555  }
556 
557  //-------------------------------------------------------------------------
558  // WM_NOTIFY_CHILD_SET_FOCUSメッセージ処理関数
559  LRESULT CWndMain::WmNotifyChildSetFocus() noexcept {
560  // 処理ブロック
561  LRESULT result = 0;
562  do {
563  // オーバーラップウィンドウフォーカス有効フラグをクリアする
564  m_bFocusOverlap = false;
565 
566  // フローティングウィンドウフォーカス有効フラグをクリアする
567  m_bFocusFloating = false;
568 
569  // 子ウィンドウハンドルを取得する
570  HWND hChild = reinterpret_cast< HWND >( m_lParam );
571 
572  // オーバーラップウィンドウを取得する
573  CWndElement* pcElement = m_cOverlapList.GetElementWindow( hChild );
574  if ( nullptr != pcElement ) {
575  // カレントエレメントウィンドウを設定する
576  if ( m_cOverlapList.SetCurrentElement( pcElement ) ) {
577  // オーバーラップウィンドウフォーカス有効フラグをセットする
578  m_bFocusOverlap = true;
579  }
580  }
581 
582  // フローティングウィンドウを取得する
583  pcElement = m_cFloatingList.GetElementWindow( hChild );
584  if ( nullptr != pcElement ) {
585  // カレントエレメントウィンドウを設定する
586  if ( m_cFloatingList.SetCurrentElement( pcElement ) ) {
587  // フローティングウィンドウフォーカス有効フラグをセットする
588  m_bFocusFloating = true;
589  }
590  }
591 
592  // 基底クラスの関数を実行する
594  } while ( false );
595 
596  // 実行結果を返す
597  return result;
598  }
599 
600  //-------------------------------------------------------------------------
601  // WM_NOTIFY_CHILD_LBUTTONUPメッセージ処理関数
602  LRESULT CWndMain::WmNotifyChildLButtonUp() noexcept {
603  // 処理ブロック
604  LRESULT result = 0;
605  do {
606  // 子ウィンドウハンドルを調べる
607  HWND hChild = reinterpret_cast< HWND >( m_lParam );
608  if ( m_cToolBar.GetHandle() == hChild ) {
609  // ツールバーマウスアクティベートフラグを調べる
610  if ( m_bToolBarMouseActivate ) {
611  // ツールバーボタン選択有効フラグを調べる
612  if ( !m_bValidToolBarSelect ) {
613  // ツールバーマウスアクティベートフラグをクリアする
614  m_bToolBarMouseActivate = false;
615 
616  // フォーカスウィンドウを設定する
617  ::SetFocus( m_hWnd );
618  }
619  }
620  }
621 
622  // 基底クラスの関数を実行する
624  } while ( false );
625 
626  // 実行結果を返す
627  return result;
628  }
629 
630  //-------------------------------------------------------------------------
631  // WM_NOTIFY_CHILD_COMMANDメッセージ処理関数
632  LRESULT CWndMain::WmNotifyChildCommand() noexcept {
633  // 処理ブロック
634  LRESULT result = 0;
635  do {
636  // メニューバーを更新する
637  UpdateMenuBar();
638 
639  // 基底クラスの関数を実行する
641  } while ( false );
642 
643  // 実行結果を返す
644  return result;
645  }
646 
647  //-------------------------------------------------------------------------
648  // ウィンドウ構成情報初期化関数
649  bool CWndMain::InitConfig( CJsonConfig& rcConfig ) noexcept {
650  // 処理ブロック
651  bool result = false;
652  do {
653  // 基底クラスの関数を実行する
654  if ( !CWndOverlap::InitConfig( rcConfig ) ) {
655  // 失敗!
656  break;
657  }
658  // オーバーラップウィンドウリスト構成情報を初期化する
660  // 失敗!
661  break;
662  }
663  // フローティングウィンドウリスト構成情報を初期化する
665  // 失敗!
666  break;
667  }
668 
669  // オーバーラップウィンドウフォーカス有効フラグを取得する
670  rcConfig.Get( m_bFocusOverlap, KEY_FOCUS_OVERLAP );
671 
672  // フローティングウィンドウフォーカス有効フラグを取得する
673  rcConfig.Get( m_bFocusFloating, KEY_FOCUS_FLOATING );
674 
675  // 成功!
676  result = true;
677  } while ( false );
678 
679  // 実行結果を返す
680  return result;
681  }
682 
683  //-------------------------------------------------------------------------
684  // ウィンドウ構成情報復元関数
685  bool CWndMain::ResumeConfig( CJsonConfig& rcConfig ) noexcept {
686  // 処理ブロック
687  bool result = false;
688  do {
689  // ツールバー表示状態を復元する
690  bool bView = true;
691  rcConfig.Get( bView, KEY_VIEW_TOOLBAR );
692  ::ShowWindow( m_cToolBar.GetHandle(), ( bView? SW_SHOWNOACTIVATE: SW_HIDE ) );
693 
694  // ステータスバー表示状態を復元する
695  bView = true;
696  rcConfig.Get( bView, KEY_VIEW_STATUSBAR );
697  ::ShowWindow( m_hStatusBar, ( bView? SW_SHOWNOACTIVATE: SW_HIDE ) );
698 
699  // フォーカスウィンドウオーダー番号を取得する
700  int nOrder = 0;
701  if ( rcConfig.Get( nOrder, KEY_FOCUS_ORDER ) ) {
702  // オーダー番号ペインウィンドウを取得する
703  CWndPane* pcPane = GetOrderPane( &nOrder );
704  if ( nullptr != pcPane ) {
705  // フォーカスウィンドウ保存ハンドルを設定する
706  s_hFocus = pcPane->GetHandle();
707  }
708  }
709 
710  // 基底クラスの関数を実行する
711  if ( !CWndOverlap::ResumeConfig( rcConfig ) ) {
712  // 失敗!
713  break;
714  }
715  // オーバーラップウィンドウリスト構成情報を復元する
717  // 失敗!
718  break;
719  }
720  // フローティングウィンドウリスト構成情報を復元する
722  // 失敗!
723  break;
724  }
725 
726  // 成功!
727  result = true;
728  } while ( false );
729 
730  // 実行結果を返す
731  return result;
732  }
733 
734  //-------------------------------------------------------------------------
735  // ウィンドウ構成情報保存関数
736  bool CWndMain::SaveConfig( CJsonConfig& rcConfig ) noexcept {
737  // 処理ブロック
738  bool result = false;
739  do {
740  // 基底クラスの関数を実行する
741  if ( !CWndOverlap::SaveConfig( rcConfig ) ) {
742  // 失敗!
743  break;
744  }
745  // オーバーラップウィンドウリスト構成情報を保存する
746  else if ( !m_cOverlapList.SaveElementListConfig( rcConfig, SECTION_OVERLAP_LIST ) ) {
747  // 失敗!
748  break;
749  }
750  // フローティングウィンドウリスト構成情報を保存する
752  // 失敗!
753  break;
754  }
755 
756  // オーバーラップウィンドウフォーカス有効状態を調べる
757  if ( m_bFocusOverlap ) {
758  // オーバーラップウィンドウフォーカス有効状態を保存する
759  if ( !rcConfig.Set( true, KEY_FOCUS_OVERLAP ) ) {
760  // 失敗!
761  break;
762  }
763  }
764 
765  // フローティングウィンドウフォーカス有効状態を調べる
766  if ( m_bFocusFloating ) {
767  // フローティングウィンドウフォーカス有効状態を保存する
768  if ( !rcConfig.Set( true, KEY_FOCUS_FLOATING ) ) {
769  // 失敗!
770  break;
771  }
772  }
773 
774  // フォーカス保存ペインウィンドウを取得する
775  CWndPane* pcFocus = GetPaneWindow( s_hFocus );
776  if ( nullptr != pcFocus ) {
777  // オーダー番号を取得する
778  int nOrder = pcFocus->GetOrderIndex();
779  if ( 0 <= nOrder ) {
780  // フォーカスウィンドウオーダー番号を保存する
781  if ( !rcConfig.Set( nOrder, KEY_FOCUS_ORDER ) ) {
782  // 失敗!
783  break;
784  }
785  }
786  }
787 
788  // ツールバー表示状態を調べる
789  if ( 0 == ::IsWindowVisible( m_cToolBar.GetHandle() ) ) {
790  // ツールバー表示状態を保存する
791  if ( !rcConfig.Set( false, KEY_VIEW_TOOLBAR ) ) {
792  // 失敗!
793  break;
794  }
795  }
796 
797  // ステータスバー表示状態を調べる
798  if ( 0 == ::IsWindowVisible( m_hStatusBar ) ) {
799  // ステータスバー表示状態を保存する
800  if ( !rcConfig.Set( false, KEY_VIEW_STATUSBAR ) ) {
801  // 失敗!
802  break;
803  }
804  }
805 
806  // 成功!
807  result = true;
808  } while ( false );
809 
810  // 実行結果を返す
811  return result;
812  }
813 
814  //-------------------------------------------------------------------------
815  // 子ペインウィンドウ情報取得関数
816  bool CWndMain::GetChildPaneInfo( SChildPaneInfo& rsChildInfo ) noexcept {
817  // 処理ブロック
818  bool result = false;
819  do {
820  // 基底クラスの関数を実行する
821  if ( !CWndOverlap::GetChildPaneInfo( rsChildInfo ) ) {
822  // 失敗!
823  break;
824  }
825  // オーバーラップウィンドウリスト情報を取得する
826  else if ( !m_cOverlapList.GetChildElementListInfo( this, rsChildInfo ) ) {
827  // 失敗!
828  break;
829  }
830  // フローティングウィンドウリスト情報を取得する
831  else if ( !m_cFloatingList.GetChildElementListInfo( this, rsChildInfo ) ) {
832  // 失敗!
833  break;
834  }
835 
836  // 成功!
837  result = true;
838  } while ( false );
839 
840  // 実行結果を返す
841  return result;
842  }
843 
844  //-------------------------------------------------------------------------
845  // ペインウィンドウオーダー番号取得関数
846  int CWndMain::GetOrderIndex( CWndPane* pcPane, int* pnOrder ) noexcept {
847  // 処理ブロック
848  int result = -1;
849  do {
850  // 基底クラスの関数を実行する
851  int nOrder = CWndOverlap::GetOrderIndex( pcPane, pnOrder );
852  if ( 0 > nOrder ) {
853  // オーバーラップウィンドウリストオーダー番号を取得する
854  nOrder = m_cOverlapList.GetElementListOrderIndex( pcPane, pnOrder );
855  if ( 0 > nOrder ) {
856  // フローティングウィンドウリストオーダー番号を取得する
857  nOrder = m_cFloatingList.GetElementListOrderIndex( pcPane, pnOrder );
858  if ( 0 > nOrder ) {
859  // 失敗!
860  break;
861  }
862  }
863  }
864 
865  // 成功!
866  result = nOrder;
867  } while ( false );
868 
869  // 実行結果を返す
870  return result;
871  }
872 
873  //-------------------------------------------------------------------------
874  // オーダー番号ペインウィンドウ取得関数
875  CWndPane* CWndMain::GetOrderPane( int* pnOrder ) noexcept {
876  // 処理ブロック
877  CWndPane* result = nullptr;
878  do {
879  // 基底クラスの関数を実行する
880  CWndPane* pcPane = CWndOverlap::GetOrderPane( pnOrder );
881  if ( nullptr == pcPane ) {
882  // オーバーラップウィンドウリストオーダー番号ペインウィンドウを取得する
883  pcPane = m_cOverlapList.GetElementListOrderPane( pnOrder );
884  if ( nullptr == pcPane ) {
885  // フローティングウィンドウリストオーダー番号ペインウィンドウを取得する
886  pcPane = m_cFloatingList.GetElementListOrderPane( pnOrder );
887  if ( nullptr == pcPane ) {
888  // 失敗!
889  break;
890  }
891  }
892  }
893 
894  // 成功!
895  result = pcPane;
896  } while ( false );
897 
898  // 実行結果を返す
899  return result;
900  }
901 
902  //-------------------------------------------------------------------------
903  // 子ウィンドウ削除関数
904  bool CWndMain::DeleteChildWindow( CWndPane* pcChild ) noexcept {
905  // 処理ブロック
906  bool result = false;
907  do {
908  // 子ペインウィンドウポインタを調べる
909  if ( nullptr == pcChild ) {
910  // 失敗!
911  break;
912  }
913 
914  // フォーカスウィンドウ保存ハンドルを調べる
915  bool bFocus = ( IsOwnOrChild( m_hWnd, s_hFocus ) );
916 
917  // オーバーラップウィンドウリストから削除する
918  if ( m_cOverlapList.RemoveElementWindow( pcChild ) ) {
919  // 子ウィンドウインスタンスを削除する
920  delete pcChild;
921 
922  // フォーカス状態を調べる
923  if ( bFocus ) {
924  // フォーカスウィンドウをクリアする
925  ::SetFocus( nullptr );
926 
927  // フォーカスウィンドウを設定する
928  ::SetFocus( m_hWnd );
929  }
930 
931  // 成功!
932  result = true;
933  break;
934  }
935  // フローティングウィンドウリストから削除する
936  else if ( m_cFloatingList.RemoveElementWindow( pcChild ) ) {
937  // 子ウィンドウインスタンスを削除する
938  delete pcChild;
939 
940  // フォーカス状態を調べる
941  if ( bFocus ) {
942  // フォーカスウィンドウをクリアする
943  ::SetFocus( nullptr );
944 
945  // フォーカスウィンドウを設定する
946  ::SetFocus( m_hWnd );
947  }
948 
949  // 成功!
950  result = true;
951  break;
952  }
953 
954  // 基底クラスの関数を実行する
955  result = CWndOverlap::DeleteChildWindow( pcChild );
956  } while ( false );
957 
958  // 実行結果を返す
959  return result;
960  }
961 
962  //-------------------------------------------------------------------------
963  // 全子ウィンドウ表示関数
964  bool CWndMain::ShowChildAll( bool bShow ) noexcept {
965  // 処理ブロック
966  bool result = false;
967  do {
968  // 基底クラスの関数を実行する
969  if ( !CWndOverlap::ShowChildAll( bShow ) ) {
970  // 失敗!
971  break;
972  }
973  // 全オーバーラップウィンドウリストを表示する
974  else if ( !m_cOverlapList.ShowElementListAll( this, bShow ) ) {
975  // 失敗!
976  break;
977  }
978  // 全フローティングウィンドウリストを表示する
979  else if ( !m_cFloatingList.ShowElementListAll( this, bShow ) ) {
980  // 失敗!
981  break;
982  }
983 
984  // 成功!
985  result = true;
986  } while ( false );
987 
988  // 実行結果を返す
989  return result;
990  }
991 
992  //-------------------------------------------------------------------------
993  // 全子ウィンドウ削除関数
994  bool CWndMain::DeleteChildAll() noexcept {
995  // 処理ブロック
996  bool result = false;
997  do {
998  // 全フローティングウィンドウリストを削除する
999  if ( !m_cFloatingList.DeleteElementListAll( this ) ) {
1000  // 失敗!
1001  break;
1002  }
1003  // 全オーバーラップウィンドウリストを削除する
1004  else if ( !m_cOverlapList.DeleteElementListAll( this ) ) {
1005  // 失敗!
1006  break;
1007  }
1008 
1009  // 基底クラスの関数を実行する
1010  result = CWndOverlap::DeleteChildAll();
1011  } while ( false );
1012 
1013  // 実行結果を返す
1014  return result;
1015  }
1016 
1017  //-------------------------------------------------------------------------
1018  // メニューコマンド実行関数
1019  bool CWndMain::ExecMenuCommand( WORD wId, WORD wCode, HWND hCtrl ) noexcept {
1020  // 処理ブロック
1021  bool result = false;
1022  do {
1023  // コマンドIDを調べる
1024  switch ( wId ) {
1025  case ID_FILE_EXIT: // ファイル::終了
1026  // クローズメッセージをポストする
1027  ::PostMessageW( m_hWnd, WM_CLOSE, 0, 0 );
1028 
1029  // 成功!
1030  result = true;
1031  break;
1032  case ID_VIEW_TOOLBAR: // 表示::ツールバー
1033  // ツールバー表示状態を調べる
1034  if ( 0 == ::IsWindowVisible( m_cToolBar.GetHandle() ) ) {
1035  // ツールバーを表示する
1036  ::ShowWindow( m_cToolBar.GetHandle(), SW_SHOWNA );
1037  }
1038  else {
1039  // ツールバーを隠す
1040  ::ShowWindow( m_cToolBar.GetHandle(), SW_HIDE );
1041  }
1042 
1043  // WM_SIZEメッセージを送信する
1044  ::SendMessageW( m_hWnd, WM_SIZE, 0, 0 );
1045  ::UpdateWindow( m_hWnd );
1046 
1047  // 成功!
1048  result = true;
1049  break;
1050  case ID_VIEW_STATUSBAR: // 表示::ステータスバー
1051  // ステータスバー表示状態を調べる
1052  if ( 0 == ::IsWindowVisible( m_hStatusBar ) ) {
1053  // ステータスバーを表示する
1054  ::ShowWindow( m_hStatusBar, SW_SHOWNA );
1055  }
1056  else {
1057  // ステータスバーを隠す
1058  ::ShowWindow( m_hStatusBar, SW_HIDE );
1059  }
1060 
1061  // WM_SIZEメッセージを送信する
1062  ::SendMessageW( m_hWnd, WM_SIZE, 0, 0 );
1063  ::UpdateWindow( m_hWnd );
1064 
1065  // 成功!
1066  result = true;
1067  break;
1068  case ID_WINDOW_FLOATING: // ウィンドウ::フローティング
1069  // ドッキングウィンドウをフローティング表示する
1070  DockingToFloating( hCtrl );
1071 
1072  // 成功!
1073  result = true;
1074  break;
1075  case ID_WINDOW_DOCKING: // ウィンドウ::ドッキング
1076  // フローティングウィンドウをドッキング表示する
1077  FloatingToDocking( hCtrl );
1078 
1079  // 成功!
1080  result = true;
1081  break;
1082  case ID_WINDOW_POS_LEFT: // ウィンドウ::表示位置::左側
1083  // ウィンドウを左端に表示する
1085 
1086  // 成功!
1087  result = true;
1088  break;
1089  case ID_WINDOW_POS_RIGHT: // ウィンドウ::表示位置::右側
1090  // ウィンドウを右端に表示する
1092 
1093  // 成功!
1094  result = true;
1095  break;
1096  case ID_WINDOW_POS_TOP: // ウィンドウ::表示位置::上側
1097  // ウィンドウを上端に表示する
1099 
1100  // 成功!
1101  result = true;
1102  break;
1103  case ID_WINDOW_POS_BOTTOM: // ウィンドウ::表示位置::下側
1104  // ウィンドウを下端に表示する
1106 
1107  // 成功!
1108  result = true;
1109  break;
1110  case ID_WINDOW_POS_FULL: // ウィンドウ::表示位置::フルサイズ
1111  // ウィンドウをフルサイズ表示する
1112  SetWindowPosition( m_hWnd, EWindowPosition::Full );
1113 
1114  // 成功!
1115  result = true;
1116  break;
1117  case ID_WINDOW_POS_MAXIMIZE: // ウィンドウ::表示位置::最大化
1118  // ウィンドウ最大化状態を調べる
1119  if ( ::IsZoomed( m_hWnd ) ) {
1120  // ウィンドウを通常表示する
1121  ::ShowWindow( m_hWnd, SW_SHOWNOACTIVATE );
1122  }
1123  else {
1124  // ウィンドウを最大化する
1125  ::ShowWindow( m_hWnd, SW_SHOWMAXIMIZED );
1126  }
1127 
1128  // 成功!
1129  result = true;
1130  break;
1131  case ID_HELP_ABOUT: // ヘルプ::バージョン情報
1132  // メッセージを表示する
1133  ShowMessage( L"こんにちわ!世界" );
1134 
1135  // 成功!
1136  result = true;
1137  break;
1138  case ID_DEBUG_SHOW_ALL: // デバッグ::すべて表示
1139  // 全子ウィンドウを表示する
1140  ShowChildAll( true );
1141 
1142  // 成功!
1143  result = true;
1144  break;
1145  case ID_DEBUG_HIDE_ALL: // デバッグ::すべて隠す
1146  // 全子ウィンドウを隠す
1147  ShowChildAll( false );
1148 
1149  // 成功!
1150  result = true;
1151  break;
1152  case ID_DEBUG_DELETE_ALL: // デバッグ::すべて削除
1153  {
1154  // 確認する
1155  int nResult = ShowMessage( L"この操作は元に戻せません。\r\n本当に削除しても良いですか?", m_hWnd, MB_OKCANCEL );
1156  if ( IDOK == nResult ) {
1157  // 全子ウィンドウを削除する
1158  DeleteChildAll();
1159  }
1160  }
1161 
1162  // 成功!
1163  result = true;
1164  break;
1165  case ID_DEBUG_SHOW_DENUG_INFO: // デバッグ::デバッグ情報表示
1166  // デバッグ情報を表示する
1167  ShowDebugInfo();
1168 
1169  // 成功!
1170  result = true;
1171  break;
1172  case ID_DEBUG_DRAW_DOUBLE_BUFFER: // デバッグ::ダブルバッファリング描画
1173  // ダブルバッファリング描画フラグを反転する
1175 
1176  // 成功!
1177  result = true;
1178  break;
1179  case ID_DEBUG_REALTIME_RESIZE_PARTITION: // デバッグ::リアルタイムパーティションサイズ変更
1180  // リアルタイムパーティションサイズ変更フラグを反転する
1182 
1183  // 成功!
1184  result = true;
1185  break;
1186  case ID_DEBUG_NEW_OVERLAP: // デバッグ::新規オーバーラップウィンドウ
1187  // 新規オーバーラップウィンドウを追加する
1189 
1190  // 成功!
1191  result = true;
1192  break;
1193  case ID_DEBUG_NEW_FLOATING: // デバッグ::新規フローティングウィンドウ
1194  // 新規フローティングウィンドウを追加する
1196 
1197  // 成功!
1198  result = true;
1199  break;
1200  default:
1201  // 基底クラスの関数を実行する
1202  result = CWndOverlap::ExecMenuCommand( wId, wCode, hCtrl );
1203  break;
1204  }
1205 
1206  // 実行結果を調べる
1207  if ( result ) {
1208  // メニューバーを更新する
1209  UpdateMenuBar();
1210  }
1211  } while ( false );
1212 
1213  // 実行結果を返す
1214  return result;
1215  }
1216 
1217  //-------------------------------------------------------------------------
1218  // コンテキストメニュー作成関数
1219  HMENU CWndMain::CreateContextMenu() noexcept {
1220  // 処理ブロック
1221  HMENU result = nullptr;
1222  do {
1223  // ポップアップメニューを作成する
1224  HMENU hMenu = ::CreatePopupMenu();
1225  if ( nullptr == hMenu ) {
1226  // 失敗!
1227  break;
1228  }
1229 
1230  // サブメニューを作成する
1231  HMENU hSubMenu = ::CreatePopupMenu();
1232  if ( nullptr != hSubMenu ) {
1233  // 共通デバッグメニューを追加する
1234  AppendCommonDebugMenu( hSubMenu );
1235 
1236  // サブメニューを追加する
1237  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"共通" );
1238  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1239  // サブメニューを無効化する
1240  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1241  }
1242 
1243  // セパレータを追加する
1244  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
1245  }
1246 
1247  // ウィンドウタイトルを取得する
1248  wchar_t szBuffer[ MAX_PATH ];
1249  ::GetWindowTextW( m_hWnd, szBuffer, MAX_PATH );
1250 
1251  // メニュー見出しを追加する
1252  ::AppendMenuW( hMenu, MF_STRING, 0, szBuffer );
1253  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_GRAYED ) );
1254 
1255  // デバッグメニューを追加する
1256  AppendDebugMenu( hMenu );
1257 
1258  // 成功!
1259  result = hMenu;
1260  } while ( false );
1261 
1262  // 実行結果を返す
1263  return result;
1264  }
1265 
1266  //-------------------------------------------------------------------------
1267  // デバッグメニュー追加関数
1268  bool CWndMain::AppendDebugMenu( HMENU hMenu ) noexcept {
1269  // 処理ブロック
1270  bool result = false;
1271  do {
1272  // 基底クラスの関数を実行する
1273  if ( !CWndOverlap::AppendDebugMenu( hMenu ) ) {
1274  // 失敗!
1275  break;
1276  }
1277  // オーバーラップウィンドウリストデバッグサブメニューを追加する
1278  else if ( !m_cOverlapList.AppendElementListDebugSubMenu( hMenu, this, L"オーバーラップウィンドウ", ID_DEBUG_NEW_OVERLAP ) ) {
1279  // 失敗!
1280  break;
1281  }
1282  // フローティングウィンドウリストデバッグサブメニューを追加する
1283  else if ( !m_cFloatingList.AppendElementListDebugSubMenu( hMenu, this, L"フローティングウィンドウ", ID_DEBUG_NEW_FLOATING ) ) {
1284  // 失敗!
1285  break;
1286  }
1287 
1288  // 成功!
1289  result = true;
1290  } while ( false );
1291 
1292  // 実行結果を返す
1293  return result;
1294  }
1295 
1296  //-------------------------------------------------------------------------
1297  // パーティション表示クライアント領域取得関数
1298  bool CWndMain::GetPartitionClientRect( RECT& rsRect ) noexcept {
1299  // 処理ブロック
1300  bool result = false;
1301  do {
1302  // クライアント領域を取得する
1303  RECT sClientRect;
1304  if ( 0 == ::GetClientRect( m_hWnd, &sClientRect ) ) {
1305  // 失敗!
1306  break;
1307  }
1308 
1309  // ツールバー表示状態を調べる
1310  if ( 0 != ::IsWindowVisible( m_cToolBar.GetHandle() ) ) {
1311  // クライアント領域から減算する
1312  if ( !SubtractChildRect( m_cToolBar.GetHandle(), sClientRect ) ) {
1313  // 失敗!
1314  break;
1315  }
1316  }
1317 
1318  // セパレータ表示状態を調べる
1319  if ( 0 != ::IsWindowVisible( m_hSeparator ) ) {
1320  // クライアント領域から減算する
1321  if ( !SubtractChildRect( m_hSeparator, sClientRect ) ) {
1322  // 失敗!
1323  break;
1324  }
1325  }
1326 
1327  // ステータスバー表示状態を調べる
1328  if ( 0 != ::IsWindowVisible( m_hStatusBar ) ) {
1329  // クライアント領域から減算する
1330  if ( !SubtractChildRect( m_hStatusBar, sClientRect ) ) {
1331  // 失敗!
1332  break;
1333  }
1334  }
1335 
1336  // 子ウィンドウ表示領域を取得する
1337  rsRect = sClientRect;
1338 
1339  // 成功!
1340  result = true;
1341  } while ( false );
1342 
1343  // 実行結果を返す
1344  return result;
1345  }
1346 
1347  //-------------------------------------------------------------------------
1348  // 全ウィンドウクライアント領域更新関数
1350  // 処理ブロック
1351  bool result = false;
1352  do {
1353  // 基底クラスの関数を実行する
1355  // 失敗!
1356  break;
1357  }
1358 
1359  // 巡回する
1360  for ( int nIndex = 0, nCount = m_cOverlapList.GetCount(); nCount > nIndex; ++nIndex ) {
1361  // エレメントウィンドウを取得する
1362  CWndElement* pcElement = m_cOverlapList[ nIndex ];
1363  if ( nullptr != pcElement ) {
1364  // 全ウィンドウクライアント領域を更新する
1365  pcElement->UpdateClientRectAll();
1366  }
1367  }
1368 
1369  // 巡回する
1370  for ( int nIndex = 0, nCount = m_cFloatingList.GetCount(); nCount > nIndex; ++nIndex ) {
1371  // エレメントウィンドウを取得する
1372  CWndElement* pcElement = m_cFloatingList[ nIndex ];
1373  if ( nullptr != pcElement ) {
1374  // 全ウィンドウクライアント領域を更新する
1375  pcElement->UpdateClientRectAll();
1376  }
1377  }
1378 
1379  // 成功!
1380  result = true;
1381  } while ( false );
1382 
1383  // 実行結果を返す
1384  return result;
1385  }
1386 
1387  //-------------------------------------------------------------------------
1388  // デバッグ情報表示関数
1389  bool CWndMain::ShowDebugInfo() noexcept {
1390  // 処理ブロック
1391  bool result = false;
1392  do {
1393  // デバッグ情報表示フラグを反転する
1395 
1396  // 全ウィンドウクライアント領域を更新する
1398 
1399  // 成功!
1400  result = true;
1401  } while ( false );
1402 
1403  // 実行結果を返す
1404  return result;
1405  }
1406 
1407  //-------------------------------------------------------------------------
1408  // 新規オーバーラップウィンドウ追加関数
1410  // 処理ブロック
1411  bool result = false;
1412  do {
1413  // 新規オーバーラップウィンドウを追加する
1415  if ( nullptr == pcElement ) {
1416  // 失敗!
1417  break;
1418  }
1419 
1420  // ウィンドウを表示する
1421  ::ShowWindow( pcElement->GetHandle(), SW_SHOWNA );
1422 
1423  // WM_SIZEメッセージを送信する
1424  ::SendMessageW( pcElement->GetHandle(), WM_SIZE, 0, 0 );
1425  ::UpdateWindow( pcElement->GetHandle() );
1426 
1427  // フォーカスウィンドウを設定する
1428  ::SetFocus( pcElement->GetHandle() );
1429 
1430  // 成功!
1431  result = true;
1432  } while ( false );
1433 
1434  // 実行結果を返す
1435  return result;
1436  }
1437 
1438  //-------------------------------------------------------------------------
1439  // 新規フローティングウィンドウ追加関数
1441  // 処理ブロック
1442  bool result = false;
1443  do {
1444  // 新規フローティングウィンドウを追加する
1446  if ( nullptr == pcElement ) {
1447  // 失敗!
1448  break;
1449  }
1450 
1451  // ウィンドウを表示する
1452  ::ShowWindow( pcElement->GetHandle(), SW_SHOWNA );
1453 
1454  // WM_SIZEメッセージを送信する
1455  ::SendMessageW( pcElement->GetHandle(), WM_SIZE, 0, 0 );
1456  ::UpdateWindow( pcElement->GetHandle() );
1457 
1458  // フォーカスウィンドウを設定する
1459  ::SetFocus( pcElement->GetHandle() );
1460 
1461  // 成功!
1462  result = true;
1463  } while ( false );
1464 
1465  // 実行結果を返す
1466  return result;
1467  }
1468 
1469  //-------------------------------------------------------------------------
1470  // ドッキングウィンドウフローティング表示関数
1471  bool CWndMain::DockingToFloating( HWND hWnd ) noexcept {
1472  // 処理ブロック
1473  bool result = false;
1474  do {
1475  // ドッキングウィンドウを取得する
1476  CWndDocking* pcDocking = reinterpret_cast< CWndDocking* >( GetPaneWindow( hWnd ) );
1477  if ( nullptr == pcDocking ) {
1478  // 失敗!
1479  break;
1480  }
1481 
1482  // 親パーティションウィンドウを取得する
1483  CWndPartition* pcPartition = reinterpret_cast< CWndPartition* >( GetPaneWindow( ::GetParent( pcDocking->GetHandle() ) ) );
1484  if ( nullptr == pcPartition ) {
1485  // 失敗!
1486  break;
1487  }
1488 
1489  // エレメントウィンドウリストを取得する
1490  CWndList* pcElementList = pcPartition->GetElementList();
1491  if ( nullptr == pcElementList ) {
1492  // 失敗!
1493  break;
1494  }
1495  // エレメントウィンドウリストから削除する
1496  else if ( !pcElementList->RemoveElementWindow( pcDocking ) ) {
1497  // 失敗!
1498  break;
1499  }
1500 
1501  // フローティングウィンドウを作成する
1502  CWndFloating* pcFloating = new CWndFloating( std::move( *pcDocking ) );
1503  if ( nullptr != pcFloating ) {
1504  // フローティングウィンドウを追加する
1505  if ( m_cFloatingList.AppendElementWindow( m_hWnd, pcFloating ) ) {
1506  // エレメントウィンドウリストを取得する
1507  pcElementList = pcFloating->GetElementList();
1508  if ( nullptr != pcElementList ) {
1509  // 巡回する
1510  for ( int nIndex = 0, nCount = pcElementList->GetCount(); nCount > nIndex; ++nIndex ) {
1511  // エレメントウィンドウを取得する
1512  CWndElement* pcElement = ( *pcElementList )[ nIndex ];
1513  if ( nullptr != pcElement ) {
1514  // 親ウィンドウを設定する
1515  ::SetParent( pcElement->GetHandle(), pcFloating->GetHandle() );
1516  }
1517  }
1518  }
1519 
1520  // ウィンドウを表示する
1521  ::ShowWindow( pcFloating->GetHandle(), SW_SHOWNA );
1522 
1523  // WM_SIZEメッセージを送信する
1524  ::SendMessageW( pcFloating->GetHandle(), WM_SIZE, 0, 0 );
1525  ::UpdateWindow( pcFloating->GetHandle() );
1526 
1527  // フォーカスウィンドウを設定する
1528  ::SetFocus( pcFloating->GetHandle() );
1529 
1530  // 成功!
1531  result = true;
1532  }
1533  else {
1534  // フローティングウィンドウを削除する
1535  delete pcFloating;
1536  }
1537  }
1538 
1539  // ドッキングウィンドウを削除する
1540  delete pcDocking;
1541 
1542  // パーティションウィンドウにWM_SIZEメッセージを送信する
1543  ::SendMessageW( pcPartition->GetHandle(), WM_SIZE, 0, 0 );
1544  ::UpdateWindow( pcPartition->GetHandle() );
1545  } while ( false );
1546 
1547  // 実行結果を返す
1548  return result;
1549  }
1550 
1551  //-------------------------------------------------------------------------
1552  // フローティングウィンドウドッキング表示関数
1553  bool CWndMain::FloatingToDocking( HWND hWnd ) noexcept {
1554  // 処理ブロック
1555  bool result = false;
1556  do {
1557  } while ( false );
1558 
1559  // 実行結果を返す
1560  return result;
1561  }
1562 
1563  //-------------------------------------------------------------------------
1564  // 共通デバッグメニュー追加関数
1565  bool CWndMain::AppendCommonDebugMenu( HMENU hMenu ) noexcept {
1566  // 処理ブロック
1567  bool result = false;
1568  do {
1569  // メニューハンドルを調べる
1570  if ( nullptr == hMenu ) {
1571  // 失敗!
1572  break;
1573  }
1574 
1575  // 子ペインウィンドウ数を取得する
1576  int nCount = GetChildCount();
1577 
1578  // 表示状態子ペインウィンドウ数を取得する
1579  int nShow = GetShowChildCount();
1580 
1581  // 非表示状態子ペインウィンドウ数を取得する
1582  int nHide = GetHideChildCount();
1583 
1584  // 非表示可能子ペインウィンドウ数を取得する
1585  int nHideable = GetHideableChildCount();
1586 
1587  // 削除可能子ペインウィンドウ数を取得する
1588  int nDeletable = GetDeletableChildCount();
1589 
1590  // 子ペインウィンドウを列挙する
1591  bool bShow = ( nCount > nShow );
1592  bool bHide = ( nHideable > nHide ) ;
1593  bool bDelete = ( 0 < nDeletable );
1594 
1595  // 共通メニューコマンドを追加する
1596  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_SHOW_ALL, L"すべて表示" );
1597  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_HIDE_ALL, L"すべて非表示" );
1598  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_DELETE_ALL, L"すべて削除" );
1599  EnableMenuCommand ( hMenu, ID_DEBUG_SHOW_ALL, bShow );
1600  EnableMenuCommand ( hMenu, ID_DEBUG_HIDE_ALL, bHide );
1601  EnableMenuCommand ( hMenu, ID_DEBUG_DELETE_ALL, bDelete );
1602  CheckMenuCommand ( hMenu, ID_DEBUG_SHOW_ALL, !bShow );
1603  CheckMenuCommand ( hMenu, ID_DEBUG_HIDE_ALL, !bHide );
1604  SetMenuCommandData( hMenu, ID_DEBUG_SHOW_ALL, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1605  SetMenuCommandData( hMenu, ID_DEBUG_HIDE_ALL, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1606  SetMenuCommandData( hMenu, ID_DEBUG_DELETE_ALL, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1607  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
1608  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_SHOW_DENUG_INFO, L"デバッグ情報表示" );
1609  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_DRAW_DOUBLE_BUFFER, L"ダブルバッファリング描画" );
1610  ::AppendMenuW( hMenu, MF_STRING, ID_DEBUG_REALTIME_RESIZE_PARTITION, L"リアルタイムパーティションサイズ変更" );
1614  SetMenuCommandData( hMenu, ID_DEBUG_SHOW_DENUG_INFO, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1615  SetMenuCommandData( hMenu, ID_DEBUG_DRAW_DOUBLE_BUFFER, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1616  SetMenuCommandData( hMenu, ID_DEBUG_REALTIME_RESIZE_PARTITION, reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1617 
1618  // 成功!
1619  result = true;
1620  } while ( false );
1621 
1622  // 実行結果を返す
1623  return result;
1624  }
1625 
1626  //-------------------------------------------------------------------------
1627  // メニューバー更新関数
1628  bool CWndMain::UpdateMenuBar() noexcept {
1629  // 処理ブロック
1630  bool result = false;
1631  do {
1632  // 巡回する
1633  for ( int nCount = ::GetMenuItemCount( m_hMenu ), nIndex = ( nCount - 1 ); 0 <= nIndex; --nIndex ) {
1634  // メニューを削除する
1635  ::DeleteMenu( m_hMenu, nIndex, MF_BYPOSITION );
1636  }
1637 
1638  // メインメニューを追加する
1639  if ( !AppendMainMenu( m_hMenu ) ) {
1640  // 失敗!
1641  break;
1642  }
1643 
1644  // メニューバーを再描画する
1645  ::DrawMenuBar( m_hWnd );
1646 
1647  // ツールバーを更新する
1648  UpdateToolBar();
1649 
1650  // 成功!
1651  result = true;
1652  } while ( false );
1653 
1654  // 実行結果を返す
1655  return result;
1656  }
1657 
1658  //-------------------------------------------------------------------------
1659  // メインメニュー追加関数
1660  bool CWndMain::AppendMainMenu( HMENU hMenu ) noexcept {
1661  // 処理ブロック
1662  bool result = false;
1663  do {
1664  // メニューハンドルを調べる
1665  if ( nullptr == hMenu ) {
1666  // 失敗!
1667  break;
1668  }
1669 
1670  // サブメニューを作成する
1671  HMENU hSubMenu = ::CreatePopupMenu();
1672  if ( nullptr == hSubMenu ) {
1673  // 失敗!
1674  break;
1675  }
1676 
1677  // ファイルメニューコマンドを追加する
1678  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_NEW, L"新規作成(&N)\tCtrl+N" );
1679  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_OPEN, L"開く(&O)...\tCtrl+O" );
1680  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_CLOSE, L"閉じる(&C)\tCtrl+W,Ctrl+F4" );
1681  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1682  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_SAVE, L"保存(&S)\tCtrl+S" );
1683  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_SAVE_AS, L"名前を付けて保存(&A)...\tCtrl+Shift+S" );
1684  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_SAVE_ALL, L"すべて保存(&L)" );
1685  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1686  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_PRINT, L"印刷(&P)...\tCtrl+P" );
1687  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_RECENT_FILE, L"最近使ったファイル(&F)..." );
1688  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1689  ::AppendMenuW( hSubMenu, MF_STRING, ID_FILE_EXIT, L"終了(&X)\tAlt+F4" );
1690  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1691  EnableMenuCommand( hSubMenu, ID_FILE_NEW, false );
1692  EnableMenuCommand( hSubMenu, ID_FILE_OPEN, false );
1693  EnableMenuCommand( hSubMenu, ID_FILE_CLOSE, false );
1694  EnableMenuCommand( hSubMenu, ID_FILE_SAVE, false );
1695  EnableMenuCommand( hSubMenu, ID_FILE_SAVE_AS, false );
1696  EnableMenuCommand( hSubMenu, ID_FILE_SAVE_ALL, false );
1697  EnableMenuCommand( hSubMenu, ID_FILE_PRINT, false );
1698  EnableMenuCommand( hSubMenu, ID_FILE_RECENT_FILE, false );
1699 
1700  // サブメニューを追加する
1701  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"ファイル(&F)" );
1702  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1703  // サブメニューを無効化する
1704  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1705  }
1706 
1707  // サブメニューを作成する
1708  hSubMenu = ::CreatePopupMenu();
1709  if ( nullptr == hSubMenu ) {
1710  // 失敗!
1711  break;
1712  }
1713 
1714  // 編集メニューコマンドを追加する
1715  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_UNDO, L"元に戻す(&U)\tCtrl+Z" );
1716  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_REDO, L"やり直し(&R)\tCtrl+Y" );
1717  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1718  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_CUT, L"切り取り(&T)\tCtrl+X" );
1719  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_COPY, L"コピー(&C)\tCtrl+C" );
1720  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_PASTE, L"貼り付け(&P)\tCtrl+V" );
1721  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1722  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_DELETE, L"削除(&D)\tDel" );
1723  ::AppendMenuW( hSubMenu, MF_SEPARATOR, 0, nullptr );
1724  ::AppendMenuW( hSubMenu, MF_STRING, ID_EDIT_SELECT_ALL, L"すべて選択(&A)\tCtrl+A" );
1725  EnableMenuCommand( hSubMenu, ID_EDIT_UNDO, false );
1726  EnableMenuCommand( hSubMenu, ID_EDIT_REDO, false );
1727  EnableMenuCommand( hSubMenu, ID_EDIT_CUT, false );
1728  EnableMenuCommand( hSubMenu, ID_EDIT_COPY, false );
1729  EnableMenuCommand( hSubMenu, ID_EDIT_PASTE, false );
1730  EnableMenuCommand( hSubMenu, ID_EDIT_DELETE, false );
1731  EnableMenuCommand( hSubMenu, ID_EDIT_SELECT_ALL, false );
1732 
1733  // サブメニューを追加する
1734  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"編集(&E)" );
1735  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1736  // サブメニューを無効化する
1737  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1738  }
1739 
1740  // サブメニューを作成する
1741  hSubMenu = ::CreatePopupMenu();
1742  if ( nullptr == hSubMenu ) {
1743  // 失敗!
1744  break;
1745  }
1746 
1747  // 表示メニューコマンドを追加する
1748  ::AppendMenuW( hSubMenu, MF_STRING, ID_VIEW_TOOLBAR, L"ツールバー(&T)" );
1749  ::AppendMenuW( hSubMenu, MF_STRING, ID_VIEW_STATUSBAR, L"ステータスバー(&S)" );
1750  CheckMenuCommand( hSubMenu, ID_VIEW_TOOLBAR, ( 0 != ::IsWindowVisible( m_cToolBar.GetHandle() ) ) );
1751  CheckMenuCommand( hSubMenu, ID_VIEW_STATUSBAR, ( 0 != ::IsWindowVisible( m_hStatusBar ) ) );
1752 
1753  // サブメニューを追加する
1754  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"表示(&V)" );
1755  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1756  // サブメニューを無効化する
1757  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1758  }
1759 
1760  // サブメニューを作成する
1761  hSubMenu = ::CreatePopupMenu();
1762  if ( nullptr == hSubMenu ) {
1763  // 失敗!
1764  break;
1765  }
1766 
1767  // ツールメニュー項目を追加する
1768  ::AppendMenuW( hSubMenu, MF_STRING, ID_TOOL_CUSTOMIZE, L"カスタマイズ(&C)..." );
1769  ::AppendMenuW( hSubMenu, MF_STRING, ID_TOOL_OPTION, L"オプション(&O)..." );
1770  EnableMenuCommand( hSubMenu, ID_TOOL_CUSTOMIZE, false );
1771  EnableMenuCommand( hSubMenu, ID_TOOL_OPTION, false );
1772 
1773  // サブメニューを追加する
1774  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"ツール(&T)" );
1775  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1776  // サブメニューを無効化する
1777  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1778  }
1779 
1780  // サブメニューを作成する
1781  hSubMenu = ::CreatePopupMenu();
1782  if ( nullptr == hSubMenu ) {
1783  // 失敗!
1784  break;
1785  }
1786 
1787  // ウィンドウメニューを追加する
1788  ::AppendMenuW( hSubMenu, MF_STRING, ID_WINDOW_NEW, L"新規ウィンドウ(&N)" );
1789  ::AppendMenuW( hSubMenu, MF_STRING, ID_WINDOW_FLOATING, L"フローティング(&F)" );
1790  ::AppendMenuW( hSubMenu, MF_STRING, ID_WINDOW_DOCKING, L"ドッキング(&K)" );
1791  ::AppendMenuW( hSubMenu, MF_STRING, ID_WINDOW_LIST, L"ウィンドウ(&W)..." );
1792  EnableMenuCommand( hSubMenu, ID_WINDOW_NEW, false );
1793  EnableMenuCommand( hSubMenu, ID_WINDOW_FLOATING, false );
1794  EnableMenuCommand( hSubMenu, ID_WINDOW_DOCKING, false );
1795  EnableMenuCommand( hSubMenu, ID_WINDOW_LIST, false );
1796 
1797  // サブサブメニューを作成する
1798  HMENU hSubMenu2 = ::CreatePopupMenu();
1799  if ( nullptr == hSubMenu2 ) {
1800  // 失敗!
1801  break;
1802  }
1803 
1804  // ウィンドウ表示位置メニューコマンドを追加する
1805  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_LEFT, L"左側(&L)\tCtrl+Alt+Left" );
1806  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_RIGHT, L"右側(&R)\tCtrl+Alt+Right" );
1807  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_TOP, L"上側(&T)\tCtrl+Alt+Up" );
1808  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_BOTTOM, L"下側(&B)\tCtrl+Alt+Down" );
1809  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_FULL, L"フルサイズ(&F)\tCtrl+Alt+Enter" );
1810  ::AppendMenuW( hSubMenu2, MF_STRING, ID_WINDOW_POS_MAXIMIZE, L"最大化(&M)\tCtrl+Enter" );
1811 
1812  // サブサブメニューを追加する
1813  ::AppendMenuW( hSubMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu2 ), L"表示位置(&P)" );
1814  if ( 0 >= GetEnableMenuCommandCount( hSubMenu2 ) ) {
1815  // サブサブメニューを無効化する
1816  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1817  }
1818 
1819  // サブメニューを追加する
1820  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"ウィンドウ(&W)" );
1821  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1822  // サブメニューを無効化する
1823  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1824  }
1825 
1826  // サブメニューを作成する
1827  hSubMenu = ::CreatePopupMenu();
1828  if ( nullptr == hSubMenu ) {
1829  // 失敗!
1830  break;
1831  }
1832 
1833  // ヘルプメニューを追加する
1834  ::AppendMenuW( hSubMenu, MF_STRING, ID_HELP_ABOUT, L"バージョン情報(&A)" );
1835 
1836  // サブメニューを追加する
1837  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"ヘルプ(&H)" );
1838  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1839  // サブメニューを無効化する
1840  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1841  }
1842 
1843  // サブメニューを作成する
1844  hSubMenu = ::CreatePopupMenu();
1845  if ( nullptr == hSubMenu ) {
1846  // 失敗!
1847  break;
1848  }
1849 
1850  // サブサブメニューを作成する
1851  hSubMenu2 = ::CreatePopupMenu();
1852  if ( nullptr == hSubMenu2 ) {
1853  // 失敗!
1854  break;
1855  }
1856 
1857  // 共通デバッグメニューを追加する
1858  AppendCommonDebugMenu( hSubMenu2 );
1859 
1860  // サブサブメニューを追加する
1861  ::AppendMenuW( hSubMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu2 ), L"共通" );
1862  if ( 0 >= GetEnableMenuCommandCount( hSubMenu2 ) ) {
1863  // サブサブメニューを無効化する
1864  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1865  }
1866 
1867  // デバッグメニューを追加する
1868  AppendDebugMenu( hSubMenu );
1869 
1870  // サブメニューを追加する
1871  ::AppendMenuW( hMenu, MF_POPUP, reinterpret_cast< UINT_PTR >( hSubMenu ), L"デバッグ(&D)" );
1872  if ( 0 >= GetEnableMenuCommandCount( hSubMenu ) ) {
1873  // サブメニューを無効化する
1874  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1875  }
1876 
1877  // 成功!
1878  result = true;
1879  } while ( false );
1880 
1881  // 実行結果を返す
1882  return result;
1883  }
1884 
1885  //-------------------------------------------------------------------------
1886  // アクセラレータテーブル作成関数
1887  bool CWndMain::CreateAccel() noexcept {
1888  // アクセラレータリスト
1889  static ACCEL sAccels[] = {
1890  { FVIRTKEY | FCONTROL, L'N', ID_FILE_NEW },
1891  { FVIRTKEY | FCONTROL, L'O', ID_FILE_OPEN },
1892  { FVIRTKEY | FCONTROL, L'W', ID_FILE_CLOSE },
1893  { FVIRTKEY | FCONTROL, VK_F4, ID_FILE_CLOSE },
1894  { FVIRTKEY | FCONTROL, L'S', ID_FILE_SAVE },
1895  { FVIRTKEY | FCONTROL | FSHIFT, L'S', ID_FILE_SAVE_AS },
1896  { FVIRTKEY, VK_F1, ID_HELP_ABOUT },
1897  { FVIRTKEY | FCONTROL | FALT, VK_LEFT, ID_WINDOW_POS_LEFT },
1898  { FVIRTKEY | FCONTROL | FALT, VK_RIGHT, ID_WINDOW_POS_RIGHT },
1899  { FVIRTKEY | FCONTROL | FALT, VK_UP, ID_WINDOW_POS_TOP },
1900  { FVIRTKEY | FCONTROL | FALT, VK_DOWN, ID_WINDOW_POS_BOTTOM },
1901  { FVIRTKEY | FCONTROL | FALT, VK_RETURN, ID_WINDOW_POS_FULL },
1902  { FVIRTKEY | FCONTROL, VK_RETURN, ID_WINDOW_POS_MAXIMIZE },
1903  };
1904 
1905  // 処理ブロック
1906  bool result = false;
1907  do {
1908  // アクセラレータテーブルを作成する
1909  int nCount = ( sizeof sAccels / sizeof( ACCEL ) );
1910  m_hAccel = ::CreateAcceleratorTableW( sAccels, nCount );
1911  if ( nullptr == m_hAccel ) {
1912  // 失敗!
1913  break;
1914  }
1915 
1916  // 成功!
1917  result = true;
1918  } while ( false );
1919 
1920  // 実行結果を返す
1921  return result;
1922  }
1923 
1924  //-------------------------------------------------------------------------
1925  // ツールバー作成関数
1926  bool CWndMain::CreateToolBar() noexcept {
1927  // 処理ブロック
1928  bool result = false;
1929  do {
1930  // アイコンイメージリストを作成する
1931  if ( !CreateIconImageList() ) {
1932  // 失敗!
1933  break;
1934  }
1935  // ツールバーボタンリストを作成する
1936  else if ( !CreateToolBarButtonList() ) {
1937  // 失敗!
1938  break;
1939  }
1940  // ツールバーを作成する
1941  else if ( !m_cToolBar.Create( m_hWnd ) ) {
1942  // 失敗!
1943  break;
1944  }
1945 
1946  // ツールバーの設定をする
1947  ::SendMessageW( m_cToolBar.GetHandle(), TB_BUTTONSTRUCTSIZE, sizeof( TBBUTTON ), 0 );
1948  ::SendMessageW( m_cToolBar.GetHandle(), TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS );
1949  ::SendMessageW( m_cToolBar.GetHandle(), TB_SETIMAGELIST, 0, reinterpret_cast< LPARAM >( m_hIconImageList ) );
1950 
1951  // ツールバーボタンを追加する
1952  ::SendMessageW( m_cToolBar.GetHandle(), TB_ADDBUTTONS, m_pcToolBarButtonList->GetCount(), reinterpret_cast< LPARAM >( m_pcToolBarButtonList->GetBuffer() ) );
1953 
1954  // 成功!
1955  result = true;
1956  } while ( false );
1957 
1958  // 実行結果を返す
1959  return result;
1960  }
1961 
1962  //-------------------------------------------------------------------------
1963  // ツールバー更新関数
1964  bool CWndMain::UpdateToolBar() noexcept {
1965  // 処理ブロック
1966  bool result = false;
1967  do {
1968  // 巡回する
1969  for ( int nIndex = 0, nCount = m_pcToolBarButtonList->GetCount(); nCount > nIndex; ++nIndex ) {
1970  // ボタン種別を調べる
1971  if ( BTNS_BUTTON == ( *m_pcToolBarButtonList )[ nIndex ].fsStyle ) {
1972  // ボタン有効状態を設定する
1973  int idCommand = ( *m_pcToolBarButtonList )[ nIndex ].idCommand;
1974  ::SendMessageW( m_cToolBar.GetHandle(), TB_ENABLEBUTTON, idCommand, IsEnableMenuCommand( m_hMenu, idCommand ) );
1975  }
1976  }
1977 
1978  // 成功!
1979  result = true;
1980  } while ( false );
1981 
1982  // 実行結果を返す
1983  return result;
1984  }
1985 
1986  //-------------------------------------------------------------------------
1987  // アイコンイメージリスト作成関数
1989  // 処理ブロック
1990  bool result = false;
1991  do {
1992  // アイコンイメージ情報リスト
1993  static SIconImageInfo const sIconImageInfoList[] = {
1994  { ID_FILE_NEW, L"新規作成", L"Generic_Document.ico", },
1995  { ID_FILE_OPEN, L"開く", L"folder_open.ico", },
1996  { ID_FILE_SAVE, L"保存", L"FloppyDisk.ico", },
1997  { ID_TOOL_OPTION, L"オプション", L"1381_cog.ico", },
1998  { ID_HELP_ABOUT, L"バージョン情報", L"help.ico", },
1999  };
2000 
2001  // 巡回する
2002  for ( int nIndex = 0, nCount = ( sizeof( sIconImageInfoList ) / sizeof( SIconImageInfo ) );; ++nIndex ) {
2003  // インデックスを調べる
2004  if ( nCount <= nIndex ) {
2005  // 成功!
2006  result = true;
2007  break;
2008  }
2009  // アイコンイメージリストを追加する
2010  else if ( !m_pcIconImageList->Append( sIconImageInfoList[ nIndex ] ) ) {
2011  // 失敗!
2012  break;
2013  }
2014  }
2015 
2016  // 実行結果を調べる
2017  if ( !result ) {
2018  // 失敗!
2019  break;
2020  }
2021 
2022  // 実行結果をクリアする
2023  result = false;
2024 
2025  // イメージリストを作成する
2026  m_hIconImageList = ::ImageList_Create( 16, 15, ILC_COLOR32 | ILC_MASK, m_pcIconImageList->GetCount(), 0 );
2027  if ( nullptr == m_hIconImageList ) {
2028  // 失敗!
2029  break;
2030  }
2031  // 巡回する
2032  else for ( int nIndex = 0, nCount = m_pcIconImageList->GetCount();; ++nIndex ) {
2033  // インデックスを調べる
2034  if ( nCount <= nIndex ) {
2035  // 成功!
2036  result = true;
2037  break;
2038  }
2039 
2040  // アイコンファイルパスを作成する
2041  CString cPath;
2042  cPath = PATH_ICON_IMAGE;
2043  cPath += ( *m_pcIconImageList )[ nIndex ].m_pszIconFileName;
2044 
2045  // アイコンをロードする
2046  HICON hIcon = reinterpret_cast< HICON >( ::LoadImageW( ::GetModuleHandleW( nullptr ), cPath, IMAGE_ICON, 0, 0, LR_LOADFROMFILE ) );
2047  if ( nullptr == hIcon ) {
2048  // 失敗!
2049  break;
2050  }
2051 
2052  // アイコンをイメージリストに追加する
2053  ::ImageList_AddIcon( m_hIconImageList, hIcon );
2054 
2055  // アイコンを削除する
2056  ::DeleteObject( hIcon );
2057  }
2058  } while ( false );
2059 
2060  // 実行結果を返す
2061  return result;
2062  }
2063 
2064  //-------------------------------------------------------------------------
2065  // ツールバーボタンリスト作成関数
2067  // 処理ブロック
2068  bool result = false;
2069  do {
2070  // ツールバーボタンリスト
2071  static TBBUTTON const sButtons[] = {
2072  { 0, ID_FILE_NEW, TBSTATE_ENABLED, BTNS_BUTTON },
2073  { 0, ID_FILE_OPEN, TBSTATE_ENABLED, BTNS_BUTTON },
2074  { 0, ID_FILE_SAVE, TBSTATE_ENABLED, BTNS_BUTTON },
2075  { 0, 0, 0, BTNS_SEP },
2076  { 0, ID_TOOL_OPTION, TBSTATE_ENABLED, BTNS_BUTTON },
2077  { 0, 0, 0, BTNS_SEP },
2078  { 0, ID_HELP_ABOUT, TBSTATE_ENABLED, BTNS_BUTTON },
2079  };
2080 
2081  // 巡回する
2082  for ( int nIndex = 0, nCount = ( sizeof( sButtons ) / sizeof( TBBUTTON ) );; ++nIndex ) {
2083  // インデックスを調べる
2084  if ( nCount <= nIndex ) {
2085  // 成功!
2086  result = true;
2087  break;
2088  }
2089 
2090  // コマンドIDを調べる
2091  TBBUTTON sButton = sButtons[ nIndex ];
2092  if ( 0 != sButton.idCommand ) {
2093  // 巡回する
2094  for ( int nIndex2 = 0, nCount2 = m_pcIconImageList->GetCount(); nCount2 > nIndex2; ++nIndex2 ) {
2095  // コマンドIDを調べる
2096  if ( sButton.idCommand == ( *m_pcIconImageList )[ nIndex2 ].m_wId ) {
2097  // イメージリストインデックスを設定する
2098  sButton.iBitmap = nIndex2;
2099 
2100  // ボタン名を設定する
2101  sButton.iString = reinterpret_cast< INT_PTR >( ( *m_pcIconImageList )[ nIndex2 ].m_pszButtonName );
2102  break;
2103  }
2104  }
2105  }
2106 
2107  // ツールバーボタンリストを追加する
2108  if ( !m_pcToolBarButtonList->Append( sButton ) ) {
2109  // 失敗!
2110  break;
2111  }
2112  }
2113  } while ( false );
2114 
2115  // 実行結果を返す
2116  return result;
2117  }
2118 
2119  //-------------------------------------------------------------------------
2120  // ステータスバー作成関数
2121  bool CWndMain::CreateStatusBar() noexcept {
2122  // 処理ブロック
2123  bool result = false;
2124  do {
2125  // ステータスバーコントロールを作成する
2126  DWORD dwStyle = ( WS_VISIBLE | WS_CHILD | SBARS_SIZEGRIP | CCS_BOTTOM );
2127  m_hStatusBar = ::CreateWindowExW( 0, STATUSCLASSNAMEW, nullptr, dwStyle, 0, 0, 0, 0, m_hWnd, nullptr, ::GetModuleHandleW( nullptr ), nullptr );
2128  if ( nullptr == m_hStatusBar ) {
2129  // 失敗!
2130  break;
2131  }
2132 
2133  // ステータスバー分割サイズ配列を初期化する
2134  int nSizeList[ STATUSBAR_PARTS_COUNT ] = {};
2135  nSizeList[ STATUSBAR_PARTS_COUNT - 1 ] = -1;
2136 
2137  // ステータスバーのデバイスコンテキストハンドルを取得する
2138  HDC hDc = ::GetDC( m_hStatusBar );
2139 
2140  // 固定文字列の描画サイズを取得して分割サイズを設定する
2141  int nPos = 0;
2142  SIZE sSize;
2143  ::GetTextExtentPoint32W( hDc, STATUSBAR_TITLE_FPS, static_cast< int >( ::wcslen( STATUSBAR_TITLE_FPS ) ), &sSize );
2144  nPos = nSizeList[ STATUSBAR_INDEX_FPS_TITLE ] = ( nPos + sSize.cx + 4 );
2145  nPos = nSizeList[ STATUSBAR_INDEX_FPS_VALUE ] = ( nPos + STATUSBAR_INDEX_FPS_WIDTH );
2146  ::GetTextExtentPoint32W( hDc, STATUSBAR_TITLE_ERROR, static_cast< int >( ::wcslen( STATUSBAR_TITLE_ERROR ) ), &sSize );
2147  nPos = nSizeList[ STATUSBAR_INDEX_ERROR_TITLE ] = ( nPos + sSize.cx + 4 );
2148  nPos = nSizeList[ STATUSBAR_INDEX_ERROR_VALUE ] = ( nPos + STATUSBAR_INDEX_ERROR_WIDTH );
2149 
2150  // デバイスコンテキストハンドルを解放する
2151  ReleaseDC( m_hStatusBar, hDc );
2152 
2153  // ステータスバーコントロールを分割する
2154  ::SendMessageW( m_hStatusBar, SB_SETPARTS, STATUSBAR_PARTS_COUNT, reinterpret_cast< LPARAM >( nSizeList ) );
2155 
2156  // 固定文字列を設定する
2157  ::SendMessageW( m_hStatusBar, SB_SETTEXT, ( STATUSBAR_INDEX_FPS_TITLE | SBT_POPOUT ), reinterpret_cast< LPARAM >( STATUSBAR_TITLE_FPS ) );
2158  ::SendMessageW( m_hStatusBar, SB_SETTEXT, ( STATUSBAR_INDEX_ERROR_TITLE | SBT_POPOUT ), reinterpret_cast< LPARAM >( STATUSBAR_TITLE_ERROR ) );
2159 
2160  // その他の情報を初期化する
2162 
2163  // ステータスバーを更新する
2164  UpdateStatusBar();
2165 
2166  // 成功!
2167  result = true;
2168  } while ( false );
2169 
2170  // 実行結果を返す
2171  return result;
2172  }
2173 
2174  //-------------------------------------------------------------------------
2175  // ステータスバー更新関数
2176  bool CWndMain::UpdateStatusBar() noexcept {
2177  // 処理ブロック
2178  bool result = false;
2179  do {
2180  // 高精度タイマ有効フラグを調べる
2181  if ( m_bPerformanceTimer ) {
2182  // FPS測定値を表示する
2183  CString cString;
2184  cString.Format( L"%d/%d", m_nFpsValue, m_nFpsMax );
2185  ::SendMessageW( m_hStatusBar, SB_SETTEXT, ( STATUSBAR_INDEX_FPS_VALUE | 0 ), reinterpret_cast< LPARAM >( cString.GetBuffer() ) );
2186 
2187  // 積算誤差を表示する
2188  LONGLONG nWaitTime = ( 1000 * 1000 * m_nErrorCount / m_nPerformanceFreq );
2189  cString.Format( L"%.3f ms", ( nWaitTime / 1000.0 ) );
2190  ::SendMessageW( m_hStatusBar, SB_SETTEXT, ( STATUSBAR_INDEX_ERROR_VALUE | 0 ), reinterpret_cast< LPARAM >( cString.GetBuffer() ) );
2191  }
2192 
2193  // その他の情報を表示する
2194  ::SendMessageW( m_hStatusBar, SB_SETTEXT, ( STATUSBAR_INDEX_OTHERS | 0 ), reinterpret_cast< LPARAM >( m_cOtherInfo.GetBuffer() ) );
2195 
2196  // 成功!
2197  result = true;
2198  } while ( false );
2199 
2200  // 実行結果を返す
2201  return result;
2202  }
2203 
2204  //-------------------------------------------------------------------------
2205  // セパレータ作成関数
2206  bool CWndMain::CreateSeparator() noexcept {
2207  // 処理ブロック
2208  bool result = false;
2209  do {
2210  // スタティックコントロールを作成する
2211  DWORD dwStyle = ( WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | SS_OWNERDRAW );
2212  m_hSeparator = ::CreateWindowExW( 0, WC_STATICW, nullptr, dwStyle, 0, 0, 0, 0, m_hWnd, nullptr, ::GetModuleHandleW( nullptr ), nullptr );
2213  if ( nullptr == m_hSeparator ) {
2214  // 失敗!
2215  break;
2216  }
2217 
2218  // 成功!
2219  result = true;
2220  } while ( false );
2221 
2222  // 実行結果を返す
2223  return result;
2224  }
2225 
2226  //-------------------------------------------------------------------------
2227  // セパレータ描画関数
2228  bool CWndMain::DrawSeparator( LPDRAWITEMSTRUCT lpDraw ) noexcept {
2229  // 処理ブロック
2230  bool result = false;
2231  do {
2232  // 背景色ブラシを作成する
2233  HBRUSH hBrush = ::CreateSolidBrush( COLOR_SEPARATOR );
2234 
2235  // 塗りつぶす
2236  ::FillRect( lpDraw->hDC, &lpDraw->rcItem, hBrush );
2237 
2238  // 背景色ブラシを削除する
2239  ::DeleteObject( hBrush );
2240 
2241  // 成功!
2242  result = true;
2243  } while ( false );
2244 
2245  // 実行結果を返す
2246  return result;
2247  }
2248 
2249  //-------------------------------------------------------------------------
2250  // ウィンドウアプリケーション実行関数
2251  bool CWndMain::Run() noexcept {
2252  // 処理ブロック
2253  bool result = false;
2254  do {
2255  // ウィンドウハンドルを調べる
2256  if ( nullptr == m_hWnd ) {
2257  // ウィンドウを作成する
2258  if ( !Create() ) {
2259  // 失敗!
2260  break;
2261  }
2262  }
2263 
2264  // ウィンドウ表示状態を調べる
2265  if ( 0 == ::IsWindowVisible( m_hWnd ) ) {
2266  // ウィンドウを表示する
2267  ::ShowWindow( m_hWnd, SW_SHOWNOACTIVATE );
2268  }
2269 
2270  // メニューバーを更新する
2271  UpdateMenuBar();
2272 
2273  // フレーム管理処理を初期化する
2274  if ( !InitFrame() ) {
2275  // 失敗!
2276  break;
2277  }
2278 
2279  // 巡回する
2280  MSG sMsg;
2281  for ( ;; ) {
2282  // フレーム開始処理を実行する
2283  StartFrame();
2284 
2285  // ウィンドウメッセージをピークする
2286  if ( 0 != ::PeekMessageW( &sMsg, nullptr, 0, 0, PM_REMOVE ) ) {
2287  // 終了メッセージか調べる
2288  if ( WM_QUIT == sMsg.message ) {
2289  // 終了!
2290  break;
2291  }
2292  // アクセラレータキーを処理する
2293  else if ( 0 == ::TranslateAcceleratorW( sMsg.hwnd, m_hAccel, &sMsg ) ) {
2294  // 仮想キーメッセージを文字メッセージへ変換する
2295  ::TranslateMessage( &sMsg );
2296 
2297  // ウィンドウプロシージャへメッセージをディスパッチする
2298  ::DispatchMessageW( &sMsg );
2299  }
2300  }
2301  // アイドル処理コールバック関数を実行する
2302  else if ( !IdleCallBackProc() ) {
2303  // 終了!
2304  break;
2305  }
2306 
2307  // フレーム終了処理を実行する
2308  EndFrame();
2309 
2310  // FPS測定値更新フラグを調べる
2311  if ( m_bUpdatedFpsValue ) {
2312  // FPS測定値更新フラグをクリアする
2313  m_bUpdatedFpsValue = false;
2314 
2315  // ステータスバーを更新する
2316  UpdateStatusBar();
2317  }
2318  }
2319 
2320  // 成功!
2321  result = true;
2322  } while ( false );
2323 
2324  // 実行結果を返す
2325  return result;
2326  }
2327 
2328  //-------------------------------------------------------------------------
2329  // フレーム管理初期化関数
2330  bool CWndMain::InitFrame() noexcept {
2331  // 処理ブロック
2332  bool result = false;
2333  do {
2334  // フレーム更新待機タイマを作成する
2335  if ( !m_cFrameWaitTimer.Create() ) {
2336  // 失敗!
2337  break;
2338  }
2339 
2340  // パフォーマンスカウンタ周波数を取得する
2341  LARGE_INTEGER sFrequency = {};
2342  if ( 0 != ::QueryPerformanceFrequency( &sFrequency ) ) {
2343  // 高精度タイマ有効フラグをセットする
2344  m_bPerformanceTimer = true;
2345 
2346  // パフォーマンスカウンタ周波数を設定する
2347  m_nPerformanceFreq = sFrequency.QuadPart;
2348 
2349  // パフォーマンスカウントを取得する
2350  LARGE_INTEGER sPerformanceCount = {};
2351  ::QueryPerformanceCounter( &sPerformanceCount );
2352  m_nPerformanceCount = sPerformanceCount.QuadPart;
2353 
2354  // 1秒待ちカウントを設定する
2356  }
2357 
2358  // 成功!
2359  result = true;
2360  } while ( false );
2361 
2362  // 実行結果を返す
2363  return result;
2364  }
2365 
2366  //-------------------------------------------------------------------------
2367  // フレーム開始関数
2368  bool CWndMain::StartFrame() noexcept {
2369  // 処理ブロック
2370  bool result = false;
2371  do {
2372  // 高精度タイマ有効フラグを調べる
2373  if ( !m_bPerformanceTimer ) {
2374  // 終了!
2375  break;
2376  }
2377  // 積算誤差を調べる
2378  else if ( 0 < m_nErrorCount ) {
2379  // 待機時間を取得する
2380  m_nFrameWaitTime = ( 10LL * 1000 * 1000 * m_nErrorCount / m_nPerformanceFreq );
2381 
2382  // 100ナノ待機タイマをセットする
2384  }
2385  else {
2386  // フレーム更新待機時間をクリアする
2387  m_nFrameWaitTime = 0;
2388  }
2389 
2390  // 成功!
2391  result = true;
2392  } while ( false );
2393 
2394  // 実行結果を返す
2395  return result;
2396  }
2397 
2398  //-------------------------------------------------------------------------
2399  // フレーム終了関数
2400  bool CWndMain::EndFrame() noexcept {
2401  // 処理ブロック
2402  bool result = false;
2403  do {
2404  // 高精度タイマ有効フラグを調べる
2405  if ( !m_bPerformanceTimer ) {
2406  // 終了!
2407  break;
2408  }
2409  // フレーム更新待機時間を調べる
2410  else if ( 0 < m_nFrameWaitTime ) {
2411  // フレーム更新待機タイマがシグナル状態になるまで最大100ms待つ
2412  m_cFrameWaitTimer.Wait( 100 );
2413  }
2414 
2415  // パフォーマンスカウントを取得する
2416  LARGE_INTEGER sPerformanceCount = {};
2417  ::QueryPerformanceCounter( &sPerformanceCount );
2418 
2419  // 1フレーム経過時間を取得する
2420  LONGLONG nFrameTime = ( sPerformanceCount.QuadPart - m_nPerformanceCount );
2421 
2422  // FPS最大値を調べる
2423  if ( 0 < m_nFpsMax ) {
2424  // 積算誤差カウントを更新する
2425  m_nErrorCount += ( m_nPerformanceFreq / m_nFpsMax - nFrameTime );
2426  }
2427  else {
2428  // 積算誤差カウントをクリアする
2429  m_nErrorCount = 0;
2430  }
2431 
2432  // FPSカウントをインクリメントする
2433  ++m_nFpsCount;
2434 
2435  // 1秒待ちカウントを更新する
2436  m_nSecondCount -= nFrameTime;
2437  if ( 0 > m_nSecondCount ) {
2438  // FPS測定値を更新する
2440  m_nFpsCount = 0;
2441 
2442  // 1秒待ちカウントを設定する
2444 
2445  // FPS測定値更新フラグをセットする
2446  m_bUpdatedFpsValue = true;
2447  }
2448 
2449  // パフォーマンスカウントを更新する
2450  m_nPerformanceCount = sPerformanceCount.QuadPart;
2451 
2452  // 成功!
2453  result = true;
2454  } while ( false );
2455 
2456  // 実行結果を返す
2457  return result;
2458  }
2459 
2460  //=========================================================================
2461  // 静的公開関数
2462  //-------------------------------------------------------------------------
2463  // 静的構成情報復元関数
2464  bool CWndMain::ResumeConfigStatic( CJsonConfig& rcConfig ) noexcept {
2465  // 処理ブロック
2466  bool result = false;
2467  do {
2468  // デバッグ情報表示フラグを取得する
2469  rcConfig.Get( s_bShowDebugInfo, KEY_SHOW_DEBUG_INFO );
2470 
2471  // ダブルバッファリング描画フラグを取得する
2473 
2474  // リアルタイムパーティションサイズ変更フラグを取得する
2476 
2477  // 成功!
2478  result = true;
2479  } while ( false );
2480 
2481  // 実行結果を返す
2482  return result;
2483  }
2484 
2485  //-------------------------------------------------------------------------
2486  // 静的構成情報保存関数
2487  bool CWndMain::SaveConfigStatic( CJsonConfig& rcConfig ) noexcept {
2488  // 処理ブロック
2489  bool result = false;
2490  do {
2491  // デバッグ情報表示フラグを調べる
2492  if ( s_bShowDebugInfo ) {
2493  // デバッグ情報表示フラグを保存する
2494  if ( !rcConfig.Set( s_bShowDebugInfo, KEY_SHOW_DEBUG_INFO ) ) {
2495  // 失敗!
2496  break;
2497  }
2498  }
2499 
2500  // ダブルバッファリング描画フラグを調べる
2501  if ( s_bDrawDoubleBuffer ) {
2502  // ダブルバッファリング描画フラグを取得する
2503  if ( !rcConfig.Set( s_bDrawDoubleBuffer, KEY_DRAW_DOUBLE_BUFFER ) ) {
2504  // 失敗!
2505  break;
2506  }
2507  }
2508 
2509  // リアルタイムパーティションサイズ変更フラグを調べる
2511  // リアルタイムパーティションサイズ変更フラグを取得する
2513  // 失敗!
2514  break;
2515  }
2516  }
2517 
2518  // 成功!
2519  result = true;
2520  } while ( false );
2521 
2522  // 実行結果を返す
2523  return result;
2524  }
2525 
2526  //=========================================================================
2527  // 静的限定公開文字列定数
2528  wchar_t const* const CWndMain::PATH_ICON_IMAGE = ( _SOLUTION_DIR L"Image\\" );
2529  wchar_t const* const CWndMain::STATUSBAR_TITLE_FPS = L"FPS ";
2530  wchar_t const* const CWndMain::STATUSBAR_TITLE_ERROR = L"積算誤差 ";
2531  wchar_t const* const CWndMain::STATUSBAR_OTHERS = L"その他の情報";
2532  wchar_t const* const CWndMain::KEY_SHOW_DEBUG_INFO = L"デバッグ情報表示";
2533  wchar_t const* const CWndMain::KEY_DRAW_DOUBLE_BUFFER = L"ダブルバッファリング描画";
2534  wchar_t const* const CWndMain::KEY_RESIZE_PARTITION_REALTIME = L"リアルタイムパーティションサイズ変更";
2535  wchar_t const* const CWndMain::KEY_VIEW_TOOLBAR = L"ツールバー表示状態";
2536  wchar_t const* const CWndMain::KEY_VIEW_STATUSBAR = L"ステータスバー表示状態";
2537  wchar_t const* const CWndMain::SECTION_OVERLAP_LIST = L"オーバーラップウィンドウリスト";
2538  wchar_t const* const CWndMain::SECTION_FLOATING_LIST = L"フローティングウィンドウリスト";
2539  wchar_t const* const CWndMain::KEY_FOCUS_OVERLAP = L"オーバーラップウィンドウフォーカス有効";
2540  wchar_t const* const CWndMain::KEY_FOCUS_FLOATING = L"フローティングウィンドウフォーカス有効";
2541 
2542  //=========================================================================
2543  // テンプレートクラス明示的インスタンス生成宣言
2546 }
2547 
2548 #pragma managed( pop )
bool m_bValidToolBarSelect
ツールバーボタン選択有効フラグ
Definition: CWndMain.h:687
constexpr WORD const ID_DEBUG_REALTIME_RESIZE_PARTITION
デバッグ::リアルタイムパーティションサイズ変更
Definition: CommandIdDef.h:66
constexpr WORD const ID_FILE_RECENT_FILE
ファイル::最近使ったファイル
Definition: CommandIdDef.h:34
virtual HWND & GetHandle() noexcept
ウィンドウハンドル取得関数
Definition: CWndBase.h:69
virtual bool AppendNewFloatingWindow() noexcept
新規フローティングウィンドウ追加関数
Definition: CWndMain.cpp:1440
LIB_WINDOW_API bool GetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR &ruData) noexcept
メニューコマンドデータ取得関数
constexpr WORD const ID_TOOL_OPTION
ツール::オプション
Definition: CommandIdDef.h:46
constexpr WORD const ID_WINDOW_POS_LEFT
ウィンドウ::表示位置::左側
Definition: CommandIdDef.h:51
constexpr WORD const ID_EDIT_UNDO
編集::元に戻す
Definition: CommandIdDef.h:36
static bool SaveConfigStatic(CJsonConfig &rcConfig) noexcept
静的構成情報保存関数
Definition: CWndMain.cpp:2487
constexpr WORD const ID_DEBUG_HIDE_ALL
デバッグ::すべて隠す
Definition: CommandIdDef.h:62
virtual LRESULT WmNotifyChildSetFocus() noexcept override
ユーザ定義メッセージ処理関数
ウィンドウユーティリティライブラリヘッダファイル
constexpr WORD const ID_EDIT_CUT
編集::切り取り
Definition: CommandIdDef.h:38
#define NotifyFatalError()
致命的エラー発生通知マクロ
Definition: LibUtility.h:22
virtual LRESULT WmMouseActivate() noexcept override
Definition: CWndMain.cpp:301
constexpr WORD const ID_FILE_PRINT
ファイル::印刷
Definition: CommandIdDef.h:33
constexpr WORD const ID_WINDOW_NEW
ウィンドウ::新規ウィンドウ
Definition: CommandIdDef.h:47
static wchar_t const *const KEY_RESIZE_PARTITION_REALTIME
リアルタイムパーティションサイズ変更キー文字列
Definition: CWndMain.h:725
コマンドID定義ヘッダファイル
LONGLONG m_nFrameWaitTime
フレーム更新待機時間
Definition: CWndMain.h:694
HMENU m_hMenu
メニューハンドル
Definition: CWndMain.h:672
constexpr WORD const ID_DEBUG_SHOW_DENUG_INFO
デバッグ::デバッグ情報表示
Definition: CommandIdDef.h:64
constexpr WORD const ID_FILE_CLOSE
ファイル::閉じる
Definition: CommandIdDef.h:29
constexpr WORD const ID_DEBUG_DRAW_DOUBLE_BUFFER
デバッグ::ダブルバッファリング描画
Definition: CommandIdDef.h:65
constexpr WORD const ID_EDIT_DELETE
編集::削除
Definition: CommandIdDef.h:41
constexpr WORD const ID_TOOL_CUSTOMIZE
ツール::カスタマイズ
Definition: CommandIdDef.h:45
virtual CWndPane * GetOrderPane(int *pnOrder) noexcept override
オーダー番号ペインウィンドウ取得関数
LIB_COMMON_API int ShowMessage(wchar_t const *pszMessage, HWND hWnd=nullptr, UINT uType=(MB_OK|MB_ICONEXCLAMATION)) noexcept
メッセージ表示関数
Definition: LibUtility.cpp:144
CWndToolBar m_cToolBar
ツールバー
Definition: CWndMain.h:676
virtual bool ResumeElementListConfig(CJsonConfig &rcConfig, wchar_t const *pszElementName) noexcept
エレメントウィンドウリスト構成情報復元関数
Definition: CWndList.cpp:331
virtual bool CreateSeparator() noexcept
セパレータ作成関数
Definition: CWndMain.cpp:2206
int m_nFpsCount
FPSカウント
Definition: CWndMain.h:695
virtual CWndElement * GetElementWindow(HWND hWnd) const noexcept
エレメントウィンドウ取得関数
Definition: CWndList.cpp:234
virtual bool CreateListWindow(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept
エレメントウィンドウリスト作成関数
Definition: CWndList.cpp:73
virtual bool CreateToolBar() noexcept
ツールバー作成関数
Definition: CWndMain.cpp:1926
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
Definition: CWndMain.cpp:121
virtual CWndPane * GetOrderPane(int *pnOrder) noexcept override
オーダー番号ペインウィンドウ取得関数
Definition: CWndMain.cpp:875
virtual LRESULT WmDrawItem() noexcept override
static int const STATUSBAR_PARTS_COUNT
ステータスバーコントロール分割数
Definition: CWndMain.h:706
virtual bool AppendNewOverlapWindow() noexcept
新規オーバーラップウィンドウ追加関数
Definition: CWndMain.cpp:1409
CArray< SIconImageInfo > * m_pcIconImageList
アイコンイメージリストポインタ
Definition: CWndMain.h:680
virtual bool AppendMainMenu(HMENU hMenu) noexcept
メインメニュー追加関数
Definition: CWndMain.cpp:1660
virtual LRESULT NmClick() noexcept
Definition: CWndBase.h:1268
virtual bool CreateIconImageList() noexcept
アイコンイメージリスト作成関数
Definition: CWndMain.cpp:1988
CTimer m_cFrameWaitTimer
フレーム更新待機タイマ
Definition: CWndMain.h:693
constexpr WORD const ID_WINDOW_FLOATING
ウィンドウ::フローティング
Definition: CommandIdDef.h:48
virtual bool UpdateClientRectAll() noexcept
全ウィンドウクライアント領域更新関数
Definition: CWndPane.cpp:757
virtual bool EndFrame() noexcept
フレーム終了関数
Definition: CWndMain.cpp:2400
constexpr WORD const ID_WINDOW_POS_RIGHT
ウィンドウ::表示位置::右側
Definition: CommandIdDef.h:52
virtual bool CreateStatusBar() noexcept
ステータスバー作成関数
Definition: CWndMain.cpp:2121
constexpr WORD const ID_EDIT_SELECT_ALL
編集::すべて選択
Definition: CommandIdDef.h:42
virtual LRESULT WmNotifyChildLButtonUp() noexcept
Definition: CWndPane.h:322
virtual HMENU CreateContextMenu() noexcept override
コンテキストメニュー作成関数
Definition: CWndMain.cpp:1219
virtual bool DeleteChildAll() noexcept override
全子ウィンドウ削除関数
static wchar_t const *const KEY_DRAW_DOUBLE_BUFFER
ダブルバッファリング描画キー文字列
Definition: CWndMain.h:724
static COLORREF const COLOR_SEPARATOR
タブ項目境界色
Definition: CWndMain.h:705
virtual bool UpdateClientRectAll() noexcept override
全ウィンドウクライアント領域更新関数
virtual LRESULT WmNotifyChildLButtonUp() noexcept override
Definition: CWndMain.cpp:602
virtual bool DockingToFloating(HWND hWnd) noexcept
ドッキングウィンドウフローティング表示関数
Definition: CWndMain.cpp:1471
int m_nFpsValue
FPS測定値
Definition: CWndMain.h:696
virtual bool Wait(DWORD dwTime=INFINITE) noexcept override
ウェイト関数
Definition: CTimer.cpp:71
virtual int GetHideChildCount() noexcept
非表示状態子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:619
virtual bool SetNano100(LONGLONG llWait, LONG nPeriod=0, PTIMERAPCROUTINE pfnCallBack=nullptr, LPVOID lpParam=nullptr, bool bResume=false) noexcept
100ナノタイマ設定関数
Definition: CTimer.cpp:218
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
Definition: CWndOverlap.cpp:88
CString m_cOtherInfo
その他の情報文字列
Definition: CWndMain.h:699
int m_nFpsMax
FPS最大値
Definition: CWndMain.h:697
constexpr WORD const ID_DEBUG_SHOW_ALL
デバッグ::すべて表示
Definition: CommandIdDef.h:61
virtual bool AppendDebugMenu(HMENU hMenu) noexcept override
デバッグメニュー追加関数
LIB_WINDOW_API bool CheckMenuCommand(HMENU hMenu, UINT uId, bool bCheck) noexcept
メニューコマンドチェック状態設定関数
constexpr WORD const ID_VIEW_TOOLBAR
表示::ツールバー
Definition: CommandIdDef.h:43
virtual bool GetChildPaneInfo(SChildPaneInfo &rsChildInfo) noexcept override
子ペインウィンドウ情報取得関数
Definition: CWndMain.cpp:816
virtual int GetOrderIndex(CWndPane *pcPane=nullptr, int *pnOrder=nullptr) noexcept override
ペインウィンドウオーダー番号取得関数
virtual bool Append(CArray const &rcInstance) noexcept
追加関数
Definition: CArray.hpp:393
constexpr WORD const ID_WINDOW_POS_BOTTOM
ウィンドウ::表示位置::下側
Definition: CommandIdDef.h:54
virtual bool StartFrame() noexcept
フレーム開始関数
Definition: CWndMain.cpp:2368
オーバーラップウィンドウクラス
Definition: CWndOverlap.h:32
virtual LRESULT WmMenuSelect() noexcept
Definition: CWndBase.h:672
配列クラス
Definition: CArray.h:33
配列クラス実装ヘッダファイル
LIB_WINDOW_API int GetEnableMenuCommandCount(HMENU hMenu) noexcept
メニューコマンド有効数取得関数
constexpr WORD const ID_FILE_NEW
ファイル::新規作成
Definition: CommandIdDef.h:27
virtual bool SubtractChildRect(HWND hChild, RECT &rsRect) noexcept
子ウィンドウ表示領域減算関数
Definition: CWndBase.cpp:1425
LIB_WINDOW_API bool IsEnableMenuCommand(HMENU hMenu, UINT uId) noexcept
メニューコマンド有効状態取得関数
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept
メニューコマンド実行関数
Definition: CWndPane.cpp:938
static wchar_t const *const PATH_ICON_IMAGE
アイコンイメージファイルディレクトリ文字列
Definition: CWndMain.h:719
constexpr WORD const ID_FILE_SAVE_ALL
ファイル::すべて保存
Definition: CommandIdDef.h:32
virtual bool UpdateClientRectAll() noexcept override
全ウィンドウクライアント領域更新関数
Definition: CWndMain.cpp:1349
virtual bool DrawSeparator(LPDRAWITEMSTRUCT lpDraw) noexcept
セパレータ描画関数
Definition: CWndMain.cpp:2228
virtual int GetShowChildCount() noexcept
表示状態子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:598
static HMENU s_hContextMenu
コンテキストメニューハンドル
Definition: CWndPane.h:696
virtual LRESULT WmExitMenuLoop() noexcept
Definition: CWndBase.h:707
virtual LRESULT WmNotifyChildSetFocus() noexcept override
ユーザ定義メッセージ処理関数
Definition: CWndMain.cpp:559
virtual bool InitConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報初期化関数
bool m_bPerformanceTimer
高精度タイマ有効フラグ
Definition: CWndMain.h:688
#define LIB_WINDOW_API
ダイナミックライブラリインポート宣言
Definition: LibWindowDef.h:30
static CWndElement * CreateFloatingWindow() noexcept
フローティングウィンドウ作成関数
Definition: CWndMain.h:651
constexpr WORD const ID_EDIT_REDO
編集::やり直し
Definition: CommandIdDef.h:37
constexpr WORD const ID_FILE_EXIT
ファイル::終了
Definition: CommandIdDef.h:35
virtual CWndPane * GetElementListOrderPane(int *pnOrder) noexcept
エレメントウィンドウリストオーダー番号ペインウィンドウ取得関数
Definition: CWndList.cpp:537
HWND m_hWnd
ウィンドウハンドル
Definition: CWndBase.h:1539
パーティションウィンドウクラス
Definition: CWndPartition.h:31
static wchar_t const *const KEY_FOCUS_OVERLAP
オーバーラップウィンドウフォーカス有効状態キー文字列
Definition: CWndMain.h:730
JSON構成情報クラス
Definition: CJsonConfig.h:31
virtual ~CWndMain() noexcept
デストラクタ
Definition: CWndMain.cpp:103
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
Definition: CWndOverlap.cpp:43
virtual bool GetChildElementListInfo(CWndPane *pcParent, SChildPaneInfo &rsChildInfo) noexcept
子エレメントウィンドウリスト情報取得関数
Definition: CWndList.cpp:449
constexpr WORD const ID_WINDOW_POS_FULL
ウィンドウ::表示位置::フルサイズ
Definition: CommandIdDef.h:55
#define _SOLUTION_DIR
ソリューションディレクトリパス
Definition: LibCommonDef.h:54
virtual LRESULT NmClick() noexcept override
Definition: CWndMain.cpp:440
virtual LRESULT WmSize() noexcept override
各種メッセージ処理関数
virtual bool ShowChildAll(bool bShow) noexcept override
全子ウィンドウ表示関数
Definition: CWndMain.cpp:964
constexpr WORD const ID_DEBUG_NEW_FLOATING
デバッグ::新規フローティングウィンドウ
Definition: CommandIdDef.h:75
constexpr WORD const ID_WINDOW_DOCKING
ウィンドウ::ドッキング
Definition: CommandIdDef.h:49
static bool s_bShowDebugInfo
デバッグ情報表示フラグ
Definition: CWndPane.h:693
static HWND s_hFocus
フォーカスウィンドウ保存ハンドル
Definition: CWndPane.h:697
static int const STATUSBAR_INDEX_FPS_VALUE
FPS測定値表示インデックス
Definition: CWndMain.h:708
virtual bool AppendElementWindow(HWND hParent, CWndElement *pcElement) noexcept
エレメントウィンドウ追加関数
Definition: CWndList.cpp:647
LONGLONG m_nPerformanceCount
パフォーマンスカウント
Definition: CWndMain.h:690
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
constexpr WORD const ID_FILE_SAVE_AS
ファイル::名前を付けて保存
Definition: CommandIdDef.h:31
static bool s_bResizePartitionRealTime
リアルタイムパーティションサイズ変更フラグ
Definition: CWndPane.h:695
constexpr WORD const ID_DEBUG_NEW_OVERLAP
デバッグ::新規オーバーラップウィンドウ
Definition: CommandIdDef.h:74
HWND m_hSeparator
セパレータコントロールハンドル
Definition: CWndMain.h:675
virtual bool AppendDebugMenu(HMENU hMenu) noexcept override
デバッグメニュー追加関数
Definition: CWndMain.cpp:1268
virtual bool CreateAccel() noexcept
アクセラレータテーブル作成関数
Definition: CWndMain.cpp:1887
ドッキングウィンドウクラス
Definition: CWndDocking.h:31
constexpr WORD const ID_WINDOW_POS_MAXIMIZE
ウィンドウ::表示位置::最大化
Definition: CommandIdDef.h:56
static wchar_t const *const STATUSBAR_OTHERS
ステータスバーその他の情報初期値文字列
Definition: CWndMain.h:722
static CWndElement * CreateOverlapWindow() noexcept
オーバーラップウィンドウ作成関数
Definition: CWndMain.h:640
LONGLONG m_nErrorCount
積算誤差カウント
Definition: CWndMain.h:692
virtual Type * GetBuffer() noexcept
配列要素バッファ取得関数
Definition: CArray.h:127
virtual LRESULT WmSetFocus() noexcept override
各種メッセージ処理関数
constexpr WORD const ID_EDIT_PASTE
編集::貼り付け
Definition: CommandIdDef.h:40
virtual wchar_t const * Format(wchar_t const *pszFormat,...) noexcept
書式設定文字列代入関数
Definition: CString.cpp:930
static wchar_t const *const KEY_SHOW_DEBUG_INFO
デバッグ情報表示キー文字列
Definition: CWndMain.h:723
virtual LRESULT WmDrawItem() noexcept override
Definition: CWndMain.cpp:476
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept override
メニューコマンド実行関数
Definition: CWndMain.cpp:1019
virtual bool DeleteChildWindow(CWndPane *pcChild) noexcept override
子ウィンドウ削除関数
constexpr WORD const ID_EDIT_COPY
編集::コピー
Definition: CommandIdDef.h:39
static int const STATUSBAR_INDEX_FPS_WIDTH
FPS測定値表示幅
Definition: CWndMain.h:712
HACCEL m_hAccel
アクセラレータテーブルハンドル
Definition: CWndMain.h:673
virtual LRESULT WmCommand() noexcept override
Definition: CWndMain.cpp:502
CWndMain() noexcept
コンストラクタ
Definition: CWndMain.cpp:37
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
Definition: CWndMain.cpp:685
virtual bool InitFrame() noexcept
フレーム管理初期化関数
Definition: CWndMain.cpp:2330
virtual bool RemoveElementWindow(CWndElement *pcElement) noexcept
エレメントウィンドウ削除関数
Definition: CWndList.h:196
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
virtual bool DeleteChildWindow(CWndPane *pcChild) noexcept override
子ウィンドウ削除関数
Definition: CWndMain.cpp:904
virtual int GetDeletableChildCount() noexcept
削除可能子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:661
bool m_bToolBarMouseActivate
ツールバーマウスアクティベートフラグ
Definition: CWndMain.h:686
virtual CWndList * GetElementList() noexcept
エレメントウィンドウリスト取得関数
Definition: CWndContainer.h:81
static wchar_t const *const KEY_FOCUS_ORDER
フォーカスウィンドウオーダー番号キー文字列
Definition: CWndPane.h:710
virtual bool FloatingToDocking(HWND hWnd) noexcept
フローティングウィンドウドッキング表示関数
Definition: CWndMain.cpp:1553
virtual LRESULT WmNotifyChildCommand() noexcept
Definition: CWndPane.cpp:377
constexpr WORD const ID_DEBUG_DELETE_ALL
デバッグ::すべて削除
Definition: CommandIdDef.h:63
static int const STATUSBAR_INDEX_ERROR_TITLE
積算誤差タイトル表示インデックス
Definition: CWndMain.h:709
virtual LRESULT WmSize() noexcept override
各種メッセージ処理関数
Definition: CWndMain.cpp:185
virtual bool InitConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報初期化関数
Definition: CWndMain.cpp:649
ウィンドウリストクラス
Definition: CWndList.h:35
文字列クラス
Definition: CString.h:31
LPARAM m_lParam
メッセージ第2引数
Definition: CWndBase.h:1542
LIB_WINDOW_API bool EnableMenuCommand(HMENU hMenu, UINT uId, bool bEnable) noexcept
メニューコマンド有効状態設定関数
virtual bool AppendElementListDebugSubMenu(HMENU hMenu, CWndPane *pcParent, wchar_t const *pszElementName, WORD wIdNew) noexcept
エレメントウィンドウリストデバッグサブメニュー追加関数
Definition: CWndList.cpp:720
virtual bool GetPartitionClientRect(RECT &rsRect) noexcept override
パーティション表示クライアント領域取得関数
Definition: CWndMain.cpp:1298
CWndList m_cOverlapList
オーバーラップウィンドウリスト
Definition: CWndMain.h:677
virtual bool Run() noexcept
ウィンドウアプリケーション実行関数
Definition: CWndMain.cpp:2251
static bool s_bDrawDoubleBuffer
ダブルバッファリング描画フラグ
Definition: CWndPane.h:694
static wchar_t const *const STATUSBAR_TITLE_FPS
ステータスバーFPSタイトル文字列
Definition: CWndMain.h:720
constexpr WORD const ID_VIEW_STATUSBAR
表示::ステータスバー
Definition: CommandIdDef.h:44
virtual int GetChildCount() noexcept
子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:577
virtual bool DeleteChildAll() noexcept override
全子ウィンドウ削除関数
Definition: CWndMain.cpp:994
CWndList m_cFloatingList
フローティングウィンドウリスト
Definition: CWndMain.h:678
virtual bool CreateToolBarButtonList() noexcept
ツールバーボタンリスト作成関数
Definition: CWndMain.cpp:2066
bool m_bFocusFloating
フローティングウィンドウフォーカス有効フラグ
Definition: CWndMain.h:683
virtual bool ShowElementListAll(CWndPane *pcParent, bool bShow) noexcept
全エレメントウィンドウリスト表示関数
Definition: CWndList.cpp:563
virtual LRESULT WmNotifyChildCommand() noexcept override
Definition: CWndMain.cpp:632
static int const SEPARATOR_HEIGHT
セパレータコントロール垂直サイズ
Definition: CWndMain.h:704
virtual LRESULT WmDestroy() noexcept override
各種メッセージ処理関数
Definition: CWndMain.cpp:171
static wchar_t const *const KEY_VIEW_TOOLBAR
ツールバー表示状態キー文字列
Definition: CWndMain.h:726
static int const STATUSBAR_INDEX_OTHERS
その他の表示インデックス
Definition: CWndMain.h:711
virtual LRESULT WmSetFocus() noexcept override
各種メッセージ処理関数
Definition: CWndMain.cpp:244
constexpr WORD const ID_WINDOW_LIST
ウィンドウ::ウィンドウ(リスト)
Definition: CommandIdDef.h:50
virtual int GetHideableChildCount() noexcept
非表示可能子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:640
virtual int GetElementListOrderIndex(CWndPane *pcPane, int *pnOrder) noexcept
エレメントウィンドウリストオーダー番号取得関数
Definition: CWndList.cpp:511
virtual bool AppendCommonDebugMenu(HMENU hMenu) noexcept
共通デバッグメニュー追加関数
Definition: CWndMain.cpp:1565
virtual CWndElement * GetCurrentElement() const noexcept
カレントエレメントウィンドウ取得関数
Definition: CWndList.cpp:213
LIB_WINDOW_API bool SetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR uData) noexcept
メニューコマンドデータ設定関数
HWND m_hStatusBar
ステータスバーコントロールハンドル
Definition: CWndMain.h:674
virtual bool ShowDebugInfo() noexcept
デバッグ情報表示関数
Definition: CWndMain.cpp:1389
static bool ResumeConfigStatic(CJsonConfig &rcConfig) noexcept
静的構成情報復元関数
Definition: CWndMain.cpp:2464
virtual CWndPane * GetPaneWindow(HWND hWnd) const noexcept
表示フラグ取得関数
Definition: CWndPane.h:178
constexpr WORD const ID_HELP_ABOUT
ヘルプ::バージョン情報
Definition: CommandIdDef.h:57
static wchar_t const *const STATUSBAR_TITLE_ERROR
ステータスバー積算誤差タイトル文字列
Definition: CWndMain.h:721
virtual bool DeleteElementListAll(CWndPane *pcParent) noexcept
全エレメントウィンドウリスト削除関数
Definition: CWndList.cpp:605
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CTimer.cpp:103
フローティングウィンドウクラス
Definition: CWndFloating.h:30
ペインウィンドウクラス
Definition: CWndPane.h:74
virtual LRESULT WmExitMenuLoop() noexcept override
Definition: CWndMain.cpp:405
virtual bool GetChildPaneInfo(SChildPaneInfo &rsChildInfo) noexcept override
子ペインウィンドウ情報取得関数
virtual CWndElement * AppendNewElementWindow(HWND hParent, CWndElement *(*pfnCreateElement)()) noexcept
新規エレメントウィンドウ追加関数
Definition: CWndList.cpp:682
constexpr WORD const ID_FILE_SAVE
ファイル::保存
Definition: CommandIdDef.h:30
LONGLONG m_nPerformanceFreq
パフォーマンス周波数
Definition: CWndMain.h:689
bool m_bValidMenuSelect
メニュー項目選択有効フラグ
Definition: CWndMain.h:685
virtual bool SetCurrentElement(CWndElement *pcElement) noexcept
カレントエレメントウィンドウ設定関数
Definition: CWndList.h:172
bool m_bUpdatedFpsValue
FPS測定値更新フラグ
Definition: CWndMain.h:698
virtual bool UpdateToolBar() noexcept
ツールバー更新関数
Definition: CWndMain.cpp:1964
virtual bool UpdateMenuBar() noexcept
メニューバー更新関数
Definition: CWndMain.cpp:1628
virtual bool Create(HWND hParent, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
Definition: CWndToolBar.cpp:38
CArray< TBBUTTON > * m_pcToolBarButtonList
ツールバーボタンリストポインタ
Definition: CWndMain.h:681
constexpr WORD const ID_FILE_OPEN
ファイル::開く
Definition: CommandIdDef.h:28
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept override
メニューコマンド実行関数
bool m_bMenuMouseActivate
メニューマウスアクティベートフラグ
Definition: CWndMain.h:684
virtual LRESULT WmCommand() noexcept override
Definition: CWndPane.cpp:289
メインウィンドウクラスヘッダファイル
WPARAM m_wParam
メッセージ第1引数
Definition: CWndBase.h:1541
virtual bool SaveElementListConfig(CJsonConfig &rcConfig, wchar_t const *pszElementName) noexcept
エレメントウィンドウリスト構成情報保存関数
Definition: CWndList.cpp:383
static int const STATUSBAR_INDEX_ERROR_VALUE
積算誤差表示インデックス
Definition: CWndMain.h:710
LIB_COMMON_API bool SetWindowPosition(HWND hWnd, EWindowPosition ePos) noexcept
ウィンドウ表示位置設定関数
Definition: LibUtility.cpp:452
ユーティリティライブラリヘッダファイル
virtual LRESULT WmMenuSelect() noexcept override
Definition: CWndMain.cpp:381
virtual wchar_t const * GetBuffer() const noexcept
文字列バッファ取得関数
Definition: CString.h:159
bool m_bFocusOverlap
オーバーラップウィンドウフォーカス有効フラグ
Definition: CWndMain.h:682
static int const STATUSBAR_INDEX_ERROR_WIDTH
積算誤差表示幅
Definition: CWndMain.h:713
JSON構成情報自動セクションブロッククラスヘッダファイル
static int const STATUSBAR_INDEX_FPS_TITLE
FPS測定値タイトル表示インデックス
Definition: CWndMain.h:707
HIMAGELIST m_hIconImageList
アイコンイメージリストハンドル
Definition: CWndMain.h:679
子ペインウィンドウ情報構造体
Definition: CWndPane.h:43
constexpr WORD const ID_WINDOW_POS_TOP
ウィンドウ::表示位置::上側
Definition: CommandIdDef.h:53
static wchar_t const *const SECTION_OVERLAP_LIST
オーバーラップウィンドウリストセクション文字列
Definition: CWndMain.h:728
アイコンイメージ情報構造体
Definition: CWndMain.h:663
static wchar_t const *const KEY_FOCUS_FLOATING
フローティングウィンドウフォーカス有効状態キー文字列
Definition: CWndMain.h:731
virtual bool InitElementListConfig(CJsonConfig &rcConfig, CWndElement *(*pfnCreateElement)(), wchar_t const *pszElementName) noexcept
エレメントウィンドウリスト構成情報初期化関数
Definition: CWndList.cpp:259
virtual int GetCount() const noexcept
配列要素数取得関数
Definition: CArray.h:149
LONGLONG m_nSecondCount
1秒待ちカウント
Definition: CWndMain.h:691
virtual bool ShowChildAll(bool bShow) noexcept override
全子ウィンドウ表示関数
virtual bool IdleCallBackProc() noexcept
アイドル処理コールバック関数
Definition: CWndMain.h:600
LIB_WINDOW_API bool IsOwnOrChild(HWND hWnd, HWND hChild) noexcept
自分または子ウィンドウ判定関数
virtual bool UpdateStatusBar() noexcept
ステータスバー更新関数
Definition: CWndMain.cpp:2176
static wchar_t const *const SECTION_FLOATING_LIST
フローティングウィンドウリストセクション文字列
Definition: CWndMain.h:729
static wchar_t const *const KEY_VIEW_STATUSBAR
ステータスバー表示状態キー文字列
Definition: CWndMain.h:727
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
Definition: CWndMain.cpp:736
virtual int GetOrderIndex(CWndPane *pcPane=nullptr, int *pnOrder=nullptr) noexcept
ペインウィンドウオーダー番号取得関数
Definition: CWndPane.cpp:511
virtual int GetOrderIndex(CWndPane *pcPane=nullptr, int *pnOrder=nullptr) noexcept override
ペインウィンドウオーダー番号取得関数
Definition: CWndMain.cpp:846