Solution46
CWndPane.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// ペインウィンドウクラス実装ファイル
4 ///
5 /// ペインウィンドウクラス実装ファイルです。
6 ///
7 /// $Id: CWndPane.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 <CWndPane.h>
18 #include <CommandIdDef.h>
19 #include <LibWindowUtility.h>
20 
21 //=============================================================================
22 // ウィンドウライブラリ名前空間
23 namespace LibWindow {
24  //=========================================================================
25  // ペインウィンドウクラス
26  //=========================================================================
27  // 構築子と解体子
28  //-------------------------------------------------------------------------
29  // コンストラクタ
30  CWndPane::CWndPane() noexcept
31  // 基底クラスコンストラクタ
32  : CWndBase()
33  // メンバ変数初期化
34  , m_bShow( true )
35  {}
36 
37  //-------------------------------------------------------------------------
38  // ムーブコンストラクタ
39  CWndPane::CWndPane( CWndPane&& rcInstance ) noexcept
40  // 基底クラスコンストラクタ
41  : CWndBase()
42  // メンバ変数初期化
43  , m_bShow( rcInstance.m_bShow )
44  {}
45 
46  //=========================================================================
47  // 公開関数
48  //-------------------------------------------------------------------------
49  // ウィンドウ作成関数
50  bool CWndPane::Create( HWND hParent, HMENU hMenu ) noexcept {
51  // 処理ブロック
52  bool result = false;
53  do {
54  // 基底クラスの関数を実行する
55  if ( !CWndBase::Create( hParent, hMenu ) ) {
56  // 失敗!
57  break;
58  }
59 
60  // ペインウィンドウオーダー番号を取得する
61  int nOrder = GetOrderIndex();
62 
63  // ウィンドウタイトルを設定する
64  CString cString;
65  cString.Format( L"%s#%d", GetSectionName(), nOrder );
66  ::SetWindowTextW( m_hWnd, cString.GetBuffer() );
67 
68  // 成功!
69  result = true;
70  } while ( false );
71 
72  // 実行結果を返す
73  return result;
74  }
75 
76  //-------------------------------------------------------------------------
77  // WM_APPメッセージ処理関数
78  LRESULT CWndPane::WmApp() noexcept {
79  // 処理ブロック
80  LRESULT result = 0;
81  do {
82  // メッセージIDを調べる
83  switch ( m_uMsg ) {
84  case WM_NOTIFY_CHILD_SET_FOCUS: // 子ウィンドウフォーカス取得通知
85  result = WmNotifyChildSetFocus();
86  break;
87  case WM_NOTIFY_CHILD_KILL_FOCUS: // 子ウィンドウフォーカス喪失通知
88  result = WmNotifyChildKillFocus();
89  break;
90  case WM_NOTIFY_CHILD_LBUTTONDOWN: // 子ウィンドウ左ボタンダウン通知
91  result = WmNotifyChildLButtonDown();
92  break;
93  case WM_NOTIFY_CHILD_LBUTTONUP: // 子ウィンドウ左ボタンアップ通知
94  result = WmNotifyChildLButtonUp();
95  break;
96  case WM_NOTIFY_CHILD_COMMAND: // 子ウィンドウコマンド実行通知
97  result = WmNotifyChildCommand();
98  break;
99  }
100  } while ( false );
101 
102  // 実行結果を返す
103  return result;
104  }
105 
106  //-------------------------------------------------------------------------
107  // WM_PAINTメッセージ処理関数
108  LRESULT CWndPane::WmPaint() noexcept {
109  // 処理ブロック
110  LRESULT result = 0;
111  do {
112  // ペイントを開始する
113  PAINTSTRUCT sPaint;
114  HDC hDc = ::BeginPaint( m_hWnd, &sPaint );
115 
116  // クライアント描画領域を取得する
117  RECT sPaintRect;
118  if ( GetPaintRect( sPaintRect ) ) {
119  // 矩形領域を調べる
120  if ( 0 == ::IsRectEmpty( &sPaintRect ) ) {
121  // ダブルバッファリング描画フラグを調べる
122  if ( !s_bDrawDoubleBuffer ) {
123  // クライアント領域を描画する
124  DrawPaintRect( hDc, sPaintRect );
125  }
126  else {
127  // デバイスコンテキストをコピーする
128  HDC hDc2 = ::CreateCompatibleDC( hDc );
129 
130  // クライアント描画領域をゼロ基点描画領域に変換する
131  int nLeft = sPaintRect.left;
132  int nTop = sPaintRect.top;
133  int nWidth = ( sPaintRect.right - nLeft );
134  int nHeight = ( sPaintRect.bottom - nTop );
135  sPaintRect.left = 0;
136  sPaintRect.top = 0;
137  sPaintRect.right = nWidth;
138  sPaintRect.bottom = nHeight;
139 
140  // ビットマップを作成する
141  HBITMAP hBitMap = ::CreateCompatibleBitmap( hDc, nWidth, nHeight );
142 
143  // ビットマップを選択する
144  ::SelectObject( hDc2, hBitMap );
145 
146  // クライアント描画領域を描画する
147  DrawPaintRect( hDc2, sPaintRect );
148 
149  // ビットマップをコピーする
150  ::BitBlt( hDc, nLeft, nTop, nWidth, nHeight, hDc2, 0, 0, SRCCOPY );
151 
152  // ビットマップを削除する
153  ::DeleteObject( hBitMap );
154 
155  // デバイスコンテキストを削除する
156  ::DeleteDC( hDc2 );
157  }
158  }
159  }
160 
161  // ペイントを終了する
162  ::EndPaint( m_hWnd, &sPaint );
163  } while ( false );
164 
165  // 実行結果を返す
166  return result;
167  }
168 
169  //-------------------------------------------------------------------------
170  // WM_SETFOCUSメッセージ処理関数
171  LRESULT CWndPane::WmSetFocus() noexcept {
172  // 処理ブロック
173  LRESULT result = 0;
174  do {
175  // フォーカスウィンドウ保存ハンドルを更新する
176  s_hFocus = m_hWnd;
177 
178  // クライアント領域を更新する
180 
181  // 親またはオーナーウィンドウを取得する
182  HWND hParent = GetParentOrOwner( m_hWnd );
183  if ( nullptr != hParent ) {
184  // WM_NOTIFY_CHILD_SET_FOCUSメッセージを送信する
185  ::SendMessageW( hParent, WM_NOTIFY_CHILD_SET_FOCUS, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
186  }
187  } while ( false );
188 
189  // 実行結果を返す
190  return result;
191  }
192 
193  //-------------------------------------------------------------------------
194  // WM_KILLFOCUSメッセージ処理関数
195  LRESULT CWndPane::WmKillFocus() noexcept {
196  // 処理ブロック
197  LRESULT result = 0;
198  do {
199  // クライアント領域を更新する
201 
202  // 親またはオーナーウィンドウを取得する
203  HWND hParent = GetParentOrOwner( m_hWnd );
204  if ( nullptr != hParent ) {
205  // WM_NOTIFY_CHILD_KILL_FOCUSメッセージを送信する
206  ::SendMessageW( hParent, WM_NOTIFY_CHILD_KILL_FOCUS, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
207  }
208  } while ( false );
209 
210  // 実行結果を返す
211  return result;
212  }
213 
214  //-------------------------------------------------------------------------
215  // WM_LBUTTONDOWNメッセージ処理関数
216  LRESULT CWndPane::WmLButtonDown() noexcept {
217  // 処理ブロック
218  LRESULT result = 0;
219  do {
220  // フォーカスウィンドウを設定する
221  ::SetFocus( m_hWnd );
222  } while ( false );
223 
224  // 実行結果を返す
225  return result;
226  }
227 
228  //-------------------------------------------------------------------------
229  // WM_CONTEXTMENUメッセージ処理関数
230  LRESULT CWndPane::WmContextMenu() noexcept {
231  // 処理ブロック
232  LRESULT result = 0;
233  do {
234  // シフトキー押下状態を調べる
235  CWndPane* pcPane = this;
236  SHORT nState = ::GetKeyState( VK_SHIFT );
237  if ( 0x8000 == ( 0x8000 & nState ) ) {
238  // 最上位ペインウィンドウを取得する
239  pcPane = GetTopLevelPane();
240  if ( nullptr == pcPane ) {
241  // 失敗!
242  break;
243  }
244  }
245 
246  // コンテキストメニューを作成する
247  s_hContextMenu = pcPane->CreateContextMenu();
248  if ( nullptr == s_hContextMenu ) {
249  // 失敗!
250  break;
251  }
252 
253  // ショートカットメニューを表示する
254  int xPos = LOWORD( m_lParam );
255  int yPos = HIWORD( m_lParam );
256  UINT uId = ::TrackPopupMenu( s_hContextMenu, ( TPM_NONOTIFY | TPM_RETURNCMD ), xPos, yPos, 0, pcPane->GetHandle(), nullptr );
257  if ( 0 != uId ) {
258  // メニューコマンドデータを取得する
259  ULONG_PTR uData = 0;
260  GetMenuCommandData( s_hContextMenu, uId, uData );
261 
262  // コマンドIDを調べる
263  WORD wId = LOWORD( uId );
264  if ( ( ID_DEBUG_PARENT_MENU <= wId ) && ( ID_DEBUG_PARENT_MENU_END >= wId ) ) {
265  // ペインウィンドウを取得する
266  pcPane = GetPaneWindow( reinterpret_cast< HWND >( uData ) );
267  if ( nullptr != pcPane ) {
268  // WM_CONTEXTMENUメッセージを送信する
269  ::SendMessageW( pcPane->GetHandle(), WM_CONTEXTMENU, m_wParam, m_lParam );
270  }
271  }
272  else {
273  // WM_COMMANDメッセージを送信する
274  ::SendMessageW( pcPane->GetHandle(), WM_COMMAND, uId, static_cast< LPARAM >( uData ) );
275  }
276  }
277 
278  // コンテキストメニューを破棄する
279  ::DestroyMenu( s_hContextMenu );
280  s_hContextMenu = nullptr;
281  } while ( false );
282 
283  // 実行結果を返す
284  return result;
285  }
286 
287  //-------------------------------------------------------------------------
288  // WM_COMMANDメッセージ処理関数
289  LRESULT CWndPane::WmCommand() noexcept {
290  // 処理ブロック
291  LRESULT result = 0;
292  do {
293  // コマンドIDを取得する
294  WORD wId = LOWORD( m_wParam );
295  if ( 0 != wId ) {
296  // 通知コードを取得する
297  WORD wCode = HIWORD( m_wParam );
298 
299  // メニューコマンドデータを取得する
300  HWND hCtrl = nullptr;
301  ULONG_PTR uData;
302  if ( GetMenuCommandData( s_hContextMenu, static_cast< UINT >( m_wParam ), uData ) ) {
303  // コントロールハンドルを取得する
304  hCtrl = reinterpret_cast< HWND >( uData );
305  if ( nullptr != hCtrl ) {
306  // ペインウィンドウポインタを取得する
307  CWndPane* pcPane = GetPaneWindow( hCtrl );
308  if ( nullptr != pcPane ) {
309  // メニューコマンドを実行する
310  pcPane->ExecMenuCommand( wId, wCode, hCtrl );
311 
312  // 終了!
313  break;
314  }
315  }
316  }
317 
318  // メニューコマンドを実行する
319  ExecMenuCommand( wId, wCode, hCtrl );
320 
321  // 終了!
322  break;
323  }
324 
325  // 基底クラスの関数を実行する
326  result = CWndBase::WmCommand();
327  } while ( false );
328 
329  // 実行結果を返す
330  return result;
331  }
332 
333  //-------------------------------------------------------------------------
334  // WM_NOTIFY_CHILD_SET_FOCUSメッセージ処理関数
335  LRESULT CWndPane::WmNotifyChildSetFocus() noexcept {
336  // 処理ブロック
337  LRESULT result = 0;
338  do {
339  // クライアント領域を更新する
341 
342  // 親またはオーナーウィンドウを取得する
343  HWND hParent = GetParentOrOwner( m_hWnd );
344  if ( nullptr != hParent ) {
345  // WM_NOTIFY_CHILD_SET_FOCUSメッセージを送信する
346  ::SendMessageW( hParent, WM_NOTIFY_CHILD_SET_FOCUS, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
347  }
348  } while ( false );
349 
350  // 実行結果を返す
351  return result;
352  }
353 
354  //-------------------------------------------------------------------------
355  // WM_NOTIFY_CHILD_KILL_FOCUSメッセージ処理関数
356  LRESULT CWndPane::WmNotifyChildKillFocus() noexcept {
357  // 処理ブロック
358  LRESULT result = 0;
359  do {
360  // クライアント領域を更新する
362 
363  // 親またはオーナーウィンドウを取得する
364  HWND hParent = GetParentOrOwner( m_hWnd );
365  if ( nullptr != hParent ) {
366  // WM_NOTIFY_CHILD_KILL_FOCUSメッセージを送信する
367  ::SendMessageW( hParent, WM_NOTIFY_CHILD_KILL_FOCUS, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
368  }
369  } while ( false );
370 
371  // 実行結果を返す
372  return result;
373  }
374 
375  //-------------------------------------------------------------------------
376  // WM_NOTIFY_CHILD_COMMANDメッセージ処理関数
377  LRESULT CWndPane::WmNotifyChildCommand() noexcept {
378  // 処理ブロック
379  LRESULT result = 0;
380  do {
381  // 親またはオーナーウィンドウを取得する
382  HWND hParent = GetParentOrOwner( m_hWnd );
383  if ( nullptr != hParent ) {
384  // WM_NOTIFY_CHILD_COMMANDメッセージを送信する
385  ::SendMessageW( hParent, WM_NOTIFY_CHILD_COMMAND, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
386  }
387  } while ( false );
388 
389  // 実行結果を返す
390  return result;
391  }
392 
393  //-------------------------------------------------------------------------
394  // ウィンドウ構成情報復元関数
395  bool CWndPane::ResumeConfig( CJsonConfig& rcConfig ) noexcept {
396  // 処理ブロック
397  bool result = false;
398  do {
399  // ウィンドウタイトルを取得する
400  CString cString;
401  if ( rcConfig.Get( cString, KEY_WINDOW_TITLE ) ) {
402  // ウィンドウタイトルを設定する
403  ::SetWindowTextW( m_hWnd, cString );
404  }
405 
406  // ウィンドウ表示フラグを取得する
407  rcConfig.Get( m_bShow, KEY_SHOW );
408 
409  // 成功!
410  result = true;
411  } while ( false );
412 
413  // 実行結果を返す
414  return result;
415  }
416 
417  //-------------------------------------------------------------------------
418  // ウィンドウ構成情報保存関数
419  bool CWndPane::SaveConfig( CJsonConfig& rcConfig ) noexcept {
420  // 処理ブロック
421  bool result = false;
422  do {
423  // ウィンドウタイトルを取得する
424  wchar_t szBuffer[ MAX_PATH ];
425  ::GetWindowTextW( m_hWnd, szBuffer, MAX_PATH );
426 
427  // ウィンドウタイトルを保存する
428  if ( !rcConfig.Set( szBuffer, KEY_WINDOW_TITLE ) ) {
429  // 失敗!
430  break;
431  }
432  // ウィンドウ表示フラグを保存する
433  else if ( !rcConfig.Set( m_bShow, KEY_SHOW ) ) {
434  // 失敗!
435  break;
436  }
437 
438  // 成功!
439  result = true;
440  } while ( false );
441 
442  // 実行結果を返す
443  return result;
444  }
445 
446  //-------------------------------------------------------------------------
447  // 親ペインウィンドウ取得関数
449  // 処理ブロック
450  CWndPane* result = nullptr;
451  do {
452  // 親またはオーナーウィンドウを取得する
453  HWND hParent = GetParentOrOwner( m_hWnd );
454 
455  // 親またはオーナーペインウィンドウを取得する
456  CWndPane* pcParent = GetPaneWindow( hParent );
457  if ( nullptr == pcParent ) {
458  // 失敗!
459  break;
460  }
461 
462  // 成功!
463  result = pcParent;
464  } while ( false );
465 
466  // 実行結果を返す
467  return result;
468  }
469 
470  //-------------------------------------------------------------------------
471  // 最上位ペインウィンドウ取得関数
473  // 処理ブロック
474  CWndPane* result = nullptr;
475  do {
476  // 巡回する
477  for ( CWndPane* pcPane = this;; ) {
478  // 親ペインウィンドウを取得する
479  CWndPane* pcParent = pcPane->GetParentPane();
480  if ( nullptr == pcParent ) {
481  // 成功!
482  result = pcPane;
483  break;
484  }
485 
486  // ペインウィンドウポインタを更新する
487  pcPane = pcParent;
488  }
489  } while ( false );
490 
491  // 実行結果を返す
492  return result;
493  }
494 
495  //-------------------------------------------------------------------------
496  // 子ペインウィンドウ情報取得関数
497  bool CWndPane::GetChildPaneInfo( SChildPaneInfo& rsChildInfo ) noexcept {
498  // 処理ブロック
499  bool result = false;
500  do {
501  // 成功!
502  result = true;
503  } while ( false );
504 
505  // 実行結果を返す
506  return result;
507  }
508 
509  //-------------------------------------------------------------------------
510  // ペインウィンドウオーダー番号取得関数
511  int CWndPane::GetOrderIndex( CWndPane* pcPane, int* pnOrder ) noexcept {
512  // 処理ブロック
513  int result = -1;
514  do {
515  // ペインウィンドウポインタを調べる
516  if ( nullptr == pcPane ) {
517  // 最上位ペインウィンドウを取得する
518  CWndPane* pcTopLevel = GetTopLevelPane();
519  if ( nullptr == pcTopLevel ) {
520  // 失敗!
521  break;
522  }
523 
524  // ペインウィンドウオーダー番号を取得する
525  int nOrder = 0;
526  result = pcTopLevel->GetOrderIndex( this, &nOrder );
527  break;
528  }
529  // オーダー番号ポインタを調べる
530  else if ( nullptr == pnOrder ) {
531  // 失敗!
532  break;
533  }
534  // ペインウィンドウポインタを調べる
535  else if ( this == pcPane ) {
536  // 成功!
537  result = *pnOrder;
538  break;
539  }
540 
541  // オーダー番号をインクリメントする
542  ++*pnOrder;
543  } while ( false );
544 
545  // 実行結果を返す
546  return result;
547  }
548 
549  //-------------------------------------------------------------------------
550  // オーダー番号ペインウィンドウ取得関数
551  CWndPane* CWndPane::GetOrderPane( int* pnOrder ) noexcept {
552  // 処理ブロック
553  CWndPane* result = nullptr;
554  do {
555  // オーダー番号ポインタを調べる
556  if ( nullptr == pnOrder ) {
557  // 失敗!
558  break;
559  }
560  // オーダー番号を調べる
561  else if ( 0 == *pnOrder ) {
562  // 成功!
563  result = this;
564  break;
565  }
566 
567  // オーダー番号をデクリメントする
568  --*pnOrder;
569  } while ( false );
570 
571  // 実行結果を返す
572  return result;
573  }
574 
575  //-------------------------------------------------------------------------
576  // 子ペインウィンドウ数取得関数
577  int CWndPane::GetChildCount() noexcept {
578  // 処理ブロック
579  int result = 0;
580  do {
581  // 子ペインウィンドウ情報を取得する
582  SChildPaneInfo sChildInfo = {};
583  if ( !GetChildPaneInfo( sChildInfo ) ) {
584  // 失敗!
585  break;
586  }
587 
588  // 成功!
589  result = sChildInfo.m_nCount;
590  } while ( false );
591 
592  // 実行結果を返す
593  return result;
594  }
595 
596  //-------------------------------------------------------------------------
597  // 表示状態子ペインウィンドウ数取得関数
599  // 処理ブロック
600  int result = 0;
601  do {
602  // 子ペインウィンドウ情報を取得する
603  SChildPaneInfo sChildInfo = {};
604  if ( !GetChildPaneInfo( sChildInfo ) ) {
605  // 失敗!
606  break;
607  }
608 
609  // 成功!
610  result = sChildInfo.m_nShow;
611  } while ( false );
612 
613  // 実行結果を返す
614  return result;
615  }
616 
617  //-------------------------------------------------------------------------
618  // 非表示状態子ペインウィンドウ数取得関数
620  // 処理ブロック
621  int result = 0;
622  do {
623  // 子ペインウィンドウ情報を取得する
624  SChildPaneInfo sChildInfo = {};
625  if ( !GetChildPaneInfo( sChildInfo ) ) {
626  // 失敗!
627  break;
628  }
629 
630  // 成功!
631  result = sChildInfo.m_nHide;
632  } while ( false );
633 
634  // 実行結果を返す
635  return result;
636  }
637 
638  //-------------------------------------------------------------------------
639  // 非表示可能子ペインウィンドウ数取得関数
641  // 処理ブロック
642  int result = 0;
643  do {
644  // 子ペインウィンドウ情報を取得する
645  SChildPaneInfo sChildInfo = {};
646  if ( !GetChildPaneInfo( sChildInfo ) ) {
647  // 失敗!
648  break;
649  }
650 
651  // 成功!
652  result = sChildInfo.m_nHideable;
653  } while ( false );
654 
655  // 実行結果を返す
656  return result;
657  }
658 
659  //-------------------------------------------------------------------------
660  // 削除可能子ペインウィンドウ数取得関数
662  // 処理ブロック
663  int result = 0;
664  do {
665  // 子ペインウィンドウ情報を取得する
666  SChildPaneInfo sChildInfo = {};
667  if ( !GetChildPaneInfo( sChildInfo ) ) {
668  // 失敗!
669  break;
670  }
671 
672  // 成功!
673  result = sChildInfo.m_nDeletable;
674  } while ( false );
675 
676  // 実行結果を返す
677  return result;
678  }
679 
680  //-------------------------------------------------------------------------
681  // 子ウィンドウ表示状態設定関数
682  bool CWndPane::ShowChildWindow( CWndPane* pcChild, bool bShow ) noexcept {
683  // 処理ブロック
684  bool result = false;
685  do {
686  // 子ペインウィンドウポインタを調べる
687  if ( nullptr == pcChild ) {
688  // 失敗!
689  break;
690  }
691  // 表示状態を設定する
692  else if ( !pcChild->SetShow( bShow ) ) {
693  // 失敗!
694  break;
695  }
696 
697  // ウィンドウ表示フラグを調べる
698  if ( bShow ) {
699  // ウィンドウを表示する
700  ::ShowWindow( pcChild->GetHandle(), SW_SHOWNA );
701  }
702  else {
703  // ウィンドウを隠す
704  ::ShowWindow( pcChild->GetHandle(), SW_HIDE );
705  }
706 
707  // WM_SIZEメッセージを送信する
708  ::SendMessageW( m_hWnd, WM_SIZE, 0, 0 );
709  ::UpdateWindow( m_hWnd );
710 
711  // フォーカスウィンドウ保存ハンドルを調べる
712  if ( IsOwnOrChild( m_hWnd, s_hFocus ) ) {
713  // フォーカスウィンドウをクリアする
714  ::SetFocus( nullptr );
715 
716  // フォーカスウィンドウを設定する
717  ::SetFocus( m_hWnd );
718  }
719 
720  // 成功!
721  result = true;
722  } while ( false );
723 
724  // 実行結果を返す
725  return result;
726  }
727 
728  //-------------------------------------------------------------------------
729  // クライアント領域更新関数
730  bool CWndPane::UpdateClientRect() noexcept {
731  // 処理ブロック
732  bool result = false;
733  do {
734  // クライアント描画領域を取得する
735  RECT sPaintRect;
736  if ( !GetPaintRect( sPaintRect ) ) {
737  // 失敗!
738  break;
739  }
740 
741  // クライアント描画領域を無効化する
742  ::InvalidateRect( m_hWnd, &sPaintRect, false );
743 
744  // ウィンドウを更新する
745  ::UpdateWindow( m_hWnd );
746 
747  // 成功!
748  result = true;
749  } while ( false );
750 
751  // 実行結果を返す
752  return result;
753  }
754 
755  //-------------------------------------------------------------------------
756  // 全ウィンドウクライアント領域更新関数
758  // 処理ブロック
759  bool result = false;
760  do {
761  // クライアント領域を更新する
762  if ( !UpdateClientRect() ) {
763  // 失敗!
764  break;
765  }
766 
767  // 成功!
768  result = true;
769  } while ( false );
770 
771  // 実行結果を返す
772  return result;
773  }
774 
775  //-------------------------------------------------------------------------
776  // クライアント描画領域取得関数
777  bool CWndPane::GetPaintRect( RECT& rsRect ) noexcept {
778  // 処理ブロック
779  bool result = false;
780  do {
781  // クライアント領域を取得する
782  RECT sClientRect;
783  if ( 0 == ::GetClientRect( m_hWnd, &sClientRect ) ) {
784  // 失敗!
785  break;
786  }
787 
788  // クライアント描画領域を取得する
789  rsRect = sClientRect;
790 
791  // 成功!
792  result = true;
793  } while ( false );
794 
795  // 実行結果を返す
796  return result;
797  }
798 
799  //-------------------------------------------------------------------------
800  // クライアント領域描画関数
801  bool CWndPane::DrawPaintRect( HDC hDc, RECT& rsRect ) noexcept {
802  // 処理ブロック
803  bool result = false;
804  do {
805  // クライアント描画領域背景色を取得する
806  COLORREF dwBkColor = GetBackColor();
807 
808  // 背景色ブラシを作成する
809  HBRUSH hBrush = ::CreateSolidBrush( dwBkColor );
810 
811  // 描画領域を塗りつぶす
812  ::FillRect( hDc, &rsRect, hBrush );
813 
814  // 背景色ブラシを削除する
815  ::DeleteObject( hBrush );
816 
817  // フォントを作成する
818  HFONT hFont = static_cast< HFONT >( ::GetStockObject( DEFAULT_GUI_FONT ) );
819  ::SelectObject( hDc, hFont );
820 
821  // クライアント描画領域文字色を取得する
822  COLORREF dwTextColor = GetTextColor();
823 
824  // フォーカスウィンドウ保存ハンドルを調べる
825  if ( m_hWnd == s_hFocus ) {
826  // フォーカスウィンドウを調べる
827  if ( m_hWnd == ::GetFocus() ) {
828  // フォーカス所有文字色を取得する
829  dwTextColor = GetFocusTextColor();
830  }
831  else {
832  // フォーカスウィンドウ文字色を取得する
833  dwTextColor = GetFocusWindowTextColor();
834  }
835  }
836 
837  // 文字色を設定する
838  ::SetTextColor( hDc, dwTextColor );
839 
840  // ウィンドウタイトルを取得する
841  wchar_t szBuffer[ MAX_PATH ];
842  ::GetWindowTextW( m_hWnd, szBuffer, MAX_PATH );
843 
844  // ウィンドウタイトルを表示する
845  ::SetBkMode( hDc, TRANSPARENT );
846  ::DrawTextW( hDc, szBuffer, -1, &rsRect, ( DT_CENTER | DT_VCENTER | DT_SINGLELINE ) );
847 
848  // デバッグ情報表示フラグを調べる
849  if ( s_bShowDebugInfo ) {
850  // デバッグ情報を表示する
851  CString cString;
852 
853  // ウィンドウサイズを取得する
854  RECT sWindowRect;
855  ::GetWindowRect( m_hWnd, &sWindowRect );
856  int nLeft = sWindowRect.left;
857  int nTop = sWindowRect.top;
858  int nWidth = ( sWindowRect.right - nLeft );
859  int nHeight = ( sWindowRect.bottom - nTop );
860  cString.Format( L"%d x %d", nWidth, nHeight );
861 
862  // 巡回する
863  cString += L", (";
864  for ( CWndPane* pcPane = this;; ) {
865  // 最小サイズを取得する
866  nWidth = pcPane->GetMinWidth();
867  nHeight = pcPane->GetMinHeight();
868  cString += CString().Format( L"%d x %d", nWidth, nHeight );
869 
870  // ウィンドウスタイルを調べる
871  LONG_PTR dwStyle = ::GetWindowLongPtrW( pcPane->GetHandle(), GWL_STYLE );
872  if ( WS_CHILD != ( WS_CHILD & dwStyle ) ) {
873  // 終了!
874  break;
875  }
876 
877  // 親ペインウィンドウを取得する
878  pcPane = GetPaneWindow( ::GetParent( pcPane->GetHandle() ) );
879  if ( nullptr == pcPane ) {
880  // 終了!
881  break;
882  }
883  cString += L" => ";
884  }
885  cString += L")";
886 
887  // 描画領域サイズを取得する
888  nLeft = rsRect.left;
889  nTop = rsRect.top;
890  nWidth = ( rsRect.right - nLeft );
891  nHeight = ( rsRect.bottom - nTop );
892  cString += CString().Format( L"\r\n%d x %d", nWidth, nHeight );
893 
894  // 子ペインウィンドウ数を取得する
895  int nCount = GetChildCount();
896  cString += CString().Format( L"\r\n子ウィンドウ数:%d", nCount );
897 
898  // 表示状態子ペインウィンドウ数を取得する
899  int nShow = GetShowChildCount();
900  cString += CString().Format( L"\r\n表示状態子ウィンドウ数:%d", nShow );
901 
902  // 非表示状態子ペインウィンドウ数を取得する
903  int nHide = GetHideChildCount();
904  cString += CString().Format( L"\r\n非表示状態子ウィンドウ数:%d", nHide );
905 
906  // 非表示可能子ペインウィンドウ数を取得する
907  int nHideable = GetHideableChildCount();
908  cString += CString().Format( L"\r\n非表示可能子ウィンドウ数:%d", nHideable );
909 
910  // 削除可能子ペインウィンドウ数を取得する
911  int nDeletable = GetDeletableChildCount();
912  cString += CString().Format( L"\r\n削除可能子ウィンドウ数:%d", nDeletable );
913 
914  // 文字色を取得する
915  COLORREF dwTextColor = GetTextColor();
916 
917  // 文字色を設定する
918  ::SetTextColor( hDc, dwTextColor );
919 
920  // 文字列を描画する
921  wchar_t const* pszBuffer = cString.GetBuffer();
922  ::DrawTextW( hDc, pszBuffer, -1, &rsRect, ( DT_LEFT | DT_TOP ) );
923  }
924 
925  // フォントを削除する
926  ::DeleteObject( hFont );
927 
928  // 成功!
929  result = true;
930  } while ( false );
931 
932  // 実行結果を返す
933  return result;
934  }
935 
936  //-------------------------------------------------------------------------
937  // メニューコマンド実行関数
938  bool CWndPane::ExecMenuCommand( WORD wId, WORD wCode, HWND hCtrl ) noexcept {
939  // 処理ブロック
940  bool result = false;
941  do {
942  // 親またはオーナーウィンドウを取得する
943  HWND hParent = GetParentOrOwner( m_hWnd );
944 
945  // ペインウィンドウを取得する
946  CWndPane* pcParent = GetPaneWindow( hParent );
947  if ( nullptr != pcParent ) {
948  // コマンドIDを調べる
949  switch ( wId ) {
950  case ID_DEBUG_SHOW: // デバッグ::表示
951  // 子ウィンドウ表示状態を設定する
952  pcParent->ShowChildWindow( this, true );
953 
954  // 成功!
955  result = true;
956  break;
957  case ID_DEBUG_HIDE: // デバッグ::非表示
958  // 子ウィンドウ表示状態を設定する
959  pcParent->ShowChildWindow( this, false );
960 
961  // 成功!
962  result = true;
963  break;
964  case ID_DEBUG_DELETE: // デバッグ::削除
965  // 子ウィンドウを削除する
966  pcParent->DeleteChildWindow( this );
967 
968  // 成功!
969  result = true;
970  break;
971  default:
972  // 親またはオーナーウィンドウにWM_COMMANDメッセージを送信する
973  ::SendMessageW( pcParent->GetHandle(), WM_COMMAND, m_wParam, m_lParam );
974  break;
975  }
976 
977  // 実行結果を調べる
978  if ( result ) {
979  // WM_NOTIFY_CHILD_COMMANDメッセージを送信する
980  ::SendMessageW( hParent, WM_NOTIFY_CHILD_COMMAND, 0, reinterpret_cast< LPARAM >( m_hWnd ) );
981  }
982  }
983  } while ( false );
984 
985  // 実行結果を返す
986  return result;
987  }
988 
989  //-------------------------------------------------------------------------
990  // コンテキストメニュー作成関数
991  HMENU CWndPane::CreateContextMenu() noexcept {
992  // 処理ブロック
993  HMENU result = nullptr;
994  do {
995  // ポップアップメニューを作成する
996  HMENU hMenu = ::CreatePopupMenu();
997  if ( nullptr == hMenu ) {
998  // 失敗!
999  break;
1000  }
1001 
1002  // ウィンドウタイトルを取得する
1003  wchar_t szBuffer[ MAX_PATH ];
1004  ::GetWindowTextW( m_hWnd, szBuffer, MAX_PATH );
1005 
1006  // メニュー見出しを追加する
1007  ::AppendMenuW( hMenu, MF_STRING, 0, szBuffer );
1008  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_GRAYED ) );
1009 
1010  // デバッグメニューを追加する
1011  AppendDebugMenu( hMenu );
1012 
1013  // 親またはオーナーペインウィンドウを取得する
1014  CWndPane* pcParent = GetPaneWindow( GetParentOrOwner( m_hWnd ) );
1015  if ( nullptr != pcParent ) {
1016  // メニュー項目数を調べる
1017  if ( 0 < ::GetMenuItemCount( hMenu ) ) {
1018  // セパレータを追加する
1019  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
1020  }
1021 
1022  // メニューコマンドを追加する
1023  ::AppendMenuW ( hMenu, MF_STRING, 0, L"親ウィンドウリスト" );
1024  ::EnableMenuItem( hMenu, ( ::GetMenuItemCount( hMenu ) - 1 ), ( MF_BYPOSITION | MFS_DISABLED ) );
1025  ::AppendMenuW ( hMenu, MF_SEPARATOR, 0, nullptr );
1026 
1027  // 巡回する
1028  for ( int nIndex = 0; ( nullptr != pcParent ) && ( 256 > nIndex ); ++nIndex ) {
1029  // ウィンドウタイトルを取得する
1030  wchar_t szBuffer[ MAX_PATH ];
1031  ::GetWindowTextW( pcParent->GetHandle(), szBuffer, MAX_PATH );
1032 
1033  // メニューコマンドIDを取得する
1034  UINT uId = MAKELONG( ( ID_DEBUG_PARENT_MENU + nIndex ), 0 );
1035 
1036  // メニューコマンドを追加する
1037  ::AppendMenuW ( hMenu, MF_STRING, uId, szBuffer );
1038  SetMenuCommandData( hMenu, uId, reinterpret_cast< ULONG_PTR >( pcParent->GetHandle() ) );
1039 
1040  // 親またはオーナーペインウィンドウを取得する
1041  pcParent = GetPaneWindow( GetParentOrOwner( pcParent->GetHandle() ) );
1042  }
1043  }
1044 
1045  // 成功!
1046  result = hMenu;
1047  } while ( false );
1048 
1049  // 実行結果を返す
1050  return result;
1051  }
1052 
1053  //-------------------------------------------------------------------------
1054  // デバッグメニュー追加関数
1055  bool CWndPane::AppendDebugMenu( HMENU hMenu ) noexcept {
1056  // 処理ブロック
1057  bool result = false;
1058  do {
1059  // 表示削除メニューを追加する
1060  if ( !AppendShowDeleteMenu( hMenu ) ) {
1061  // 失敗!
1062  break;
1063  }
1064 
1065  // 成功!
1066  result = true;
1067  } while ( false );
1068 
1069  // 実行結果を返す
1070  return result;
1071  }
1072 
1073  //-------------------------------------------------------------------------
1074  // 表示削除メニュー追加関数
1075  bool CWndPane::AppendShowDeleteMenu( HMENU hMenu ) noexcept {
1076  // 処理ブロック
1077  bool result = false;
1078  do {
1079  // メニューハンドルを調べる
1080  if ( nullptr == hMenu ) {
1081  // 失敗!
1082  break;
1083  }
1084 
1085  // ペインウィンドウオーダー番号を取得する
1086  int nOrder = GetOrderIndex();
1087  if ( 0 > nOrder ) {
1088  // 失敗!
1089  break;
1090  }
1091 
1092  // 通知コードを取得する
1093  WORD wCode = static_cast< WORD >( nOrder );
1094 
1095  // 親またはオーナーペインウィンドウを取得する
1096  CWndPane* pcParent = GetPaneWindow( GetParentOrOwner( m_hWnd ) );
1097  bool bHide = false;
1098  bool bDelete = false;
1099  if ( nullptr != pcParent ) {
1100  // 子ウィンドウを非表示可能か親ペインに確認する
1101  bHide = pcParent->CanHideChildWindow( this );
1102 
1103  // 子ウィンドウを削除可能か親ペインに確認する
1104  bDelete = pcParent->CanDeleteChildWindow( this );
1105  }
1106 
1107  // メニュー項目数を調べる
1108  if ( 0 < ::GetMenuItemCount( hMenu ) ) {
1109  // セパレータを追加する
1110  ::AppendMenuW( hMenu, MF_SEPARATOR, 0, nullptr );
1111  }
1112 
1113  // メニューコマンドを追加する
1114  ::AppendMenuW ( hMenu, MF_STRING, MAKELONG( ID_DEBUG_SHOW, wCode ), L"表示" );
1115  ::AppendMenuW ( hMenu, MF_STRING, MAKELONG( ID_DEBUG_HIDE, wCode ), L"非表示" );
1116  ::AppendMenuW ( hMenu, MF_STRING, MAKELONG( ID_DEBUG_DELETE, wCode ), L"削除" );
1117  SetMenuCommandData( hMenu, MAKELONG( ID_DEBUG_SHOW, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1118  SetMenuCommandData( hMenu, MAKELONG( ID_DEBUG_HIDE, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1119  SetMenuCommandData( hMenu, MAKELONG( ID_DEBUG_DELETE, wCode ), reinterpret_cast< ULONG_PTR >( m_hWnd ) );
1120  EnableMenuCommand ( hMenu, MAKELONG( ID_DEBUG_SHOW, wCode ), !m_bShow );
1121  EnableMenuCommand ( hMenu, MAKELONG( ID_DEBUG_HIDE, wCode ), ( bHide && m_bShow ) );
1122  EnableMenuCommand ( hMenu, MAKELONG( ID_DEBUG_DELETE, wCode ), bDelete );
1123  CheckMenuCommand ( hMenu, MAKELONG( ID_DEBUG_SHOW, wCode ), m_bShow );
1124  CheckMenuCommand ( hMenu, MAKELONG( ID_DEBUG_HIDE, wCode ), !m_bShow );
1125 
1126  // 成功!
1127  result = true;
1128  } while ( false );
1129 
1130  // 実行結果を返す
1131  return result;
1132  }
1133 
1134  //=========================================================================
1135  // 静的限定公開変数
1136  bool CWndPane::s_bShowDebugInfo = false;
1137  bool CWndPane::s_bDrawDoubleBuffer = false;
1139  HMENU CWndPane::s_hContextMenu = nullptr;
1140  HWND CWndPane::s_hFocus = nullptr;
1141 
1142  //=========================================================================
1143  // 静的限定公開文字列定数
1144  wchar_t const* const CWndPane::KEY_WINDOW_TITLE = L"ウィンドウタイトル";
1145  wchar_t const* const CWndPane::KEY_SHOW = L"ウィンドウ表示フラグ";
1146  wchar_t const* const CWndPane::KEY_FOCUS_ORDER = L"フォーカスウィンドウオーダー番号";
1147 }
1148 
1149 #pragma managed( pop )
virtual HWND & GetHandle() noexcept
ウィンドウハンドル取得関数
Definition: CWndBase.h:69
LIB_WINDOW_API bool GetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR &ruData) noexcept
メニューコマンドデータ取得関数
constexpr WORD const ID_DEBUG_PARENT_MENU
デバッグ::親ウィンドウメニューコマンド先頭
Definition: CommandIdDef.h:82
ウィンドウユーティリティライブラリヘッダファイル
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
Definition: CWndPane.cpp:50
CWndPane() noexcept
コンストラクタ
Definition: CWndPane.cpp:30
コマンドID定義ヘッダファイル
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept
ウィンドウ作成関数
Definition: CWndBase.cpp:58
virtual wchar_t const * GetSectionName() const noexcept
セクション名取得関数
Definition: CWndPane.h:123
virtual COLORREF GetFocusTextColor() const noexcept
フォーカス所有文字色取得関数
Definition: CWndPane.h:156
virtual LRESULT WmCommand() noexcept
Definition: CWndBase.cpp:1153
static wchar_t const *const KEY_SHOW
ウィンドウ表示フラグキー文字列
Definition: CWndPane.h:709
virtual bool UpdateClientRectAll() noexcept
全ウィンドウクライアント領域更新関数
Definition: CWndPane.cpp:757
virtual LRESULT WmNotifyChildLButtonUp() noexcept
Definition: CWndPane.h:322
virtual int GetHideChildCount() noexcept
非表示状態子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:619
virtual LRESULT WmLButtonDown() noexcept override
Definition: CWndPane.cpp:216
LIB_WINDOW_API bool CheckMenuCommand(HMENU hMenu, UINT uId, bool bCheck) noexcept
メニューコマンドチェック状態設定関数
virtual bool DrawPaintRect(HDC hDc, RECT &rsRect) noexcept
クライアント領域描画関数
Definition: CWndPane.cpp:801
virtual CWndPane * GetTopLevelPane() noexcept
最上位ペインウィンドウ取得関数
Definition: CWndPane.cpp:472
virtual COLORREF GetBackColor() const noexcept
クライアント描画領域背景色取得関数
Definition: CWndPane.h:134
virtual LRESULT WmApp() noexcept override
各種メッセージ処理関数
Definition: CWndPane.cpp:78
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept
ウィンドウ構成情報復元関数
Definition: CWndPane.cpp:395
virtual bool ExecMenuCommand(WORD wId, WORD wCode, HWND hCtrl) noexcept
メニューコマンド実行関数
Definition: CWndPane.cpp:938
virtual int GetShowChildCount() noexcept
表示状態子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:598
virtual bool AppendShowDeleteMenu(HMENU hMenu) noexcept
表示削除メニュー追加関数
Definition: CWndPane.cpp:1075
static HMENU s_hContextMenu
コンテキストメニューハンドル
Definition: CWndPane.h:696
HWND m_hWnd
ウィンドウハンドル
Definition: CWndBase.h:1539
JSON構成情報クラス
Definition: CJsonConfig.h:31
constexpr WORD const ID_DEBUG_DELETE
デバッグ::削除
Definition: CommandIdDef.h:72
constexpr WORD const ID_DEBUG_SHOW
デバッグ::表示
Definition: CommandIdDef.h:70
ペインウィンドウクラスヘッダファイル
static bool s_bShowDebugInfo
デバッグ情報表示フラグ
Definition: CWndPane.h:693
constexpr UINT const WM_NOTIFY_CHILD_LBUTTONDOWN
子ウィンドウ左ボタンダウン通知
Definition: CWndPane.h:30
static HWND s_hFocus
フォーカスウィンドウ保存ハンドル
Definition: CWndPane.h:697
virtual LRESULT WmNotifyChildSetFocus() noexcept
ユーザ定義メッセージ処理関数
Definition: CWndPane.cpp:335
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
static bool s_bResizePartitionRealTime
リアルタイムパーティションサイズ変更フラグ
Definition: CWndPane.h:695
int m_nCount
子ウィンドウ数
Definition: CWndPane.h:44
virtual bool GetPaintRect(RECT &rsRect) noexcept
クライアント描画領域取得関数
Definition: CWndPane.cpp:777
virtual LRESULT WmContextMenu() noexcept override
Definition: CWndPane.cpp:230
constexpr UINT const WM_NOTIFY_CHILD_SET_FOCUS
子ウィンドウフォーカス取得通知
Definition: CWndPane.h:28
virtual LRESULT WmPaint() noexcept override
Definition: CWndPane.cpp:108
基本ウィンドウクラス
Definition: CWndBase.h:31
virtual wchar_t const * Format(wchar_t const *pszFormat,...) noexcept
書式設定文字列代入関数
Definition: CString.cpp:930
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept
ウィンドウ構成情報保存関数
Definition: CWndPane.cpp:419
bool m_bShow
ウィンドウ表示フラグ
Definition: CWndPane.h:688
virtual COLORREF GetFocusWindowTextColor() const noexcept
フォーカスウィンドウ文字色取得関数
Definition: CWndPane.h:167
LIB_WINDOW_API HWND GetParentOrOwner(HWND hWnd) noexcept
親またはオーナーウィンドウ取得関数
int m_nDeletable
削除可能子ウィンドウ数
Definition: CWndPane.h:48
virtual LRESULT WmKillFocus() noexcept override
Definition: CWndPane.cpp:195
constexpr WORD const ID_DEBUG_HIDE
デバッグ::非表示
Definition: CommandIdDef.h:71
static wchar_t const *const KEY_WINDOW_TITLE
ウィンドウタイトルキー文字列
Definition: CWndPane.h:708
virtual int GetDeletableChildCount() noexcept
削除可能子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:661
virtual LRESULT WmSetFocus() noexcept override
Definition: CWndPane.cpp:171
static wchar_t const *const KEY_FOCUS_ORDER
フォーカスウィンドウオーダー番号キー文字列
Definition: CWndPane.h:710
virtual bool UpdateClientRect() noexcept
クライアント領域更新関数
Definition: CWndPane.cpp:730
virtual LRESULT WmNotifyChildCommand() noexcept
Definition: CWndPane.cpp:377
virtual bool ShowChildWindow(CWndPane *pcChild, bool bShow) noexcept
子ウィンドウ表示状態設定関数
Definition: CWndPane.cpp:682
virtual bool AppendDebugMenu(HMENU hMenu) noexcept
デバッグメニュー追加関数
Definition: CWndPane.cpp:1055
virtual LRESULT WmNotifyChildKillFocus() noexcept
Definition: CWndPane.cpp:356
文字列クラス
Definition: CString.h:31
LPARAM m_lParam
メッセージ第2引数
Definition: CWndBase.h:1542
LIB_WINDOW_API bool EnableMenuCommand(HMENU hMenu, UINT uId, bool bEnable) noexcept
メニューコマンド有効状態設定関数
UINT m_uMsg
メッセージID
Definition: CWndBase.h:1540
virtual COLORREF GetTextColor() const noexcept
クライアント描画領域文字色取得関数
Definition: CWndPane.h:145
static bool s_bDrawDoubleBuffer
ダブルバッファリング描画フラグ
Definition: CWndPane.h:694
virtual int GetChildCount() noexcept
子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:577
virtual HMENU CreateContextMenu() noexcept
コンテキストメニュー作成関数
Definition: CWndPane.cpp:991
virtual int GetHideableChildCount() noexcept
非表示可能子ペインウィンドウ数取得関数
Definition: CWndPane.cpp:640
int m_nHide
非表示状態子ウィンドウ数
Definition: CWndPane.h:46
LIB_WINDOW_API bool SetMenuCommandData(HMENU hMenu, UINT uId, ULONG_PTR uData) noexcept
メニューコマンドデータ設定関数
virtual bool CanHideChildWindow(CWndPane *pcChild) noexcept
子ウィンドウ非表示可能状態取得関数
Definition: CWndPane.h:490
constexpr WORD const ID_DEBUG_PARENT_MENU_END
デバッグ::親ウィンドウメニューコマンド最後尾
Definition: CommandIdDef.h:83
virtual bool CanDeleteChildWindow(CWndPane *pcChild) noexcept
子ウィンドウ削除可能状態取得関数
Definition: CWndPane.h:503
int m_nHideable
非表示可能子ウィンドウ数
Definition: CWndPane.h:47
constexpr UINT const WM_NOTIFY_CHILD_KILL_FOCUS
子ウィンドウフォーカス喪失通知
Definition: CWndPane.h:29
virtual CWndPane * GetPaneWindow(HWND hWnd) const noexcept
表示フラグ取得関数
Definition: CWndPane.h:178
constexpr UINT const WM_NOTIFY_CHILD_LBUTTONUP
子ウィンドウ左ボタンアップ通知
Definition: CWndPane.h:31
virtual LRESULT WmNotifyChildLButtonDown() noexcept
Definition: CWndPane.h:321
ペインウィンドウクラス
Definition: CWndPane.h:74
int m_nShow
表示状態子ウィンドウ数
Definition: CWndPane.h:45
virtual bool GetChildPaneInfo(SChildPaneInfo &rsChildInfo) noexcept
子ペインウィンドウ情報取得関数
Definition: CWndPane.cpp:497
virtual LRESULT WmCommand() noexcept override
Definition: CWndPane.cpp:289
virtual CWndPane * GetParentPane() noexcept
親ペインウィンドウ取得関数
Definition: CWndPane.cpp:448
WPARAM m_wParam
メッセージ第1引数
Definition: CWndBase.h:1541
virtual CWndPane * GetOrderPane(int *pnOrder) noexcept
オーダー番号ペインウィンドウ取得関数
Definition: CWndPane.cpp:551
virtual wchar_t const * GetBuffer() const noexcept
文字列バッファ取得関数
Definition: CString.h:159
子ペインウィンドウ情報構造体
Definition: CWndPane.h:43
constexpr UINT const WM_NOTIFY_CHILD_COMMAND
子ウィンドウコマンド実行通知
Definition: CWndPane.h:32
LIB_WINDOW_API bool IsOwnOrChild(HWND hWnd, HWND hChild) noexcept
自分または子ウィンドウ判定関数
virtual bool DeleteChildWindow(CWndPane *pcChild) noexcept
子ウィンドウ削除関数
Definition: CWndPane.h:530
virtual int GetOrderIndex(CWndPane *pcPane=nullptr, int *pnOrder=nullptr) noexcept
ペインウィンドウオーダー番号取得関数
Definition: CWndPane.cpp:511