Solution46
CWndOverlap.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// オーバーラップウィンドウクラス実装ファイル
4 ///
5 /// オーバーラップウィンドウクラス実装ファイルです。
6 ///
7 /// $Id: CWndOverlap.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 <CWndOverlap.h>
18 
19 //=============================================================================
20 // インクルード実装ファイル
21 #include <CArray.hpp>
22 
23 //=============================================================================
24 // ウィンドウライブラリ名前空間
25 namespace LibWindow {
26  //=========================================================================
27  // オーバーラップウィンドウクラス
28  //=========================================================================
29  // 構築子と解体子
30  //-------------------------------------------------------------------------
31  // コンストラクタ
33  // 基底クラスコンストラクタ
34  : CWndPartition( &CreatePartitionWindow, L"パーティションウィンドウ" )
35  // メンバ変数初期化
36  , m_cDocumentTab()
37  {}
38 
39  //=========================================================================
40  // 公開関数
41  //-------------------------------------------------------------------------
42  // ウィンドウ作成関数
43  bool CWndOverlap::Create( HWND hParent, HMENU hMenu ) noexcept {
44  // 処理ブロック
45  bool result = false;
46  do {
47  // 基底クラスの関数を実行する
48  if ( !CWndPartition::Create( hParent, hMenu ) ) {
49  // 失敗!
50  break;
51  }
52  // ドキュメントタブウィンドウを作成する
53  else if ( !m_cDocumentTab.Create( m_hWnd ) ) {
54  // 失敗!
55  break;
56  }
57 
58  // 成功!
59  result = true;
60  } while ( false );
61 
62  // 実行結果を返す
63  return result;
64  }
65 
66  //-------------------------------------------------------------------------
67  // WM_GETMINMAXINFOメッセージ関数
68  LRESULT CWndOverlap::WmGetMinMaxInfo() noexcept {
69  // 処理ブロック
70  LRESULT result = 0;
71  do {
72  // 最小サイズを取得する
73  int nMinWidth = GetMinWidth();
74  int nMinHeight = GetMinHeight();
75 
76  // 最小トラックサイズを設定する
77  LPMINMAXINFO lpMinMaxInfo = reinterpret_cast< LPMINMAXINFO >( m_lParam );
78  lpMinMaxInfo->ptMinTrackSize.x = min( lpMinMaxInfo->ptMaxTrackSize.x, nMinWidth );
79  lpMinMaxInfo->ptMinTrackSize.y = min( lpMinMaxInfo->ptMaxTrackSize.y, nMinHeight );
80  } while ( false );
81 
82  // 実行結果を返す
83  return result;
84  }
85 
86  //-------------------------------------------------------------------------
87  // ウィンドウ構成情報復元関数
88  bool CWndOverlap::ResumeConfig( CJsonConfig& rcConfig ) noexcept {
89  // 処理ブロック
90  bool result = false;
91  do {
92  // 基底クラスの関数を実行する
93  if ( !CWndPartition::ResumeConfig( rcConfig ) ) {
94  // 失敗!
95  break;
96  }
97  // ウィンドウ表示位置を復元する
98  else if ( rcConfig.ResumeWindowPosition( m_hWnd ) ) {
99  // ウィンドウ表示状態を復元する
100  if ( rcConfig.ResumeShowWindow( m_hWnd ) ) {
101  // 成功!
102  result = true;
103  break;
104  }
105  }
106  } while ( false );
107 
108  // 実行結果を返す
109  return result;
110  }
111 
112  //-------------------------------------------------------------------------
113  // ウィンドウ構成情報保存関数
114  bool CWndOverlap::SaveConfig( CJsonConfig& rcConfig ) noexcept {
115  // 処理ブロック
116  bool result = false;
117  do {
118  // 基底クラスの関数を実行する
119  if ( !CWndPartition::SaveConfig( rcConfig ) ) {
120  // 失敗!
121  break;
122  }
123  // ウィンドウ表示位置を保存する
124  else if ( !rcConfig.SaveWindowPosition( m_hWnd ) ) {
125  // 失敗!
126  break;
127  }
128  // ウィンドウ表示状態を保存する
129  else if ( !rcConfig.SaveShowWindow( m_hWnd ) ) {
130  // 失敗!
131  break;
132  }
133 
134  // 成功!
135  result = true;
136  } while ( false );
137 
138  // 実行結果を返す
139  return result;
140  }
141 
142  //-------------------------------------------------------------------------
143  // 最小水平サイズ取得関数
144  int CWndOverlap::GetMinWidth() noexcept {
145  // 処理ブロック
146  int result = 0;
147  do {
148  // 基底クラスの関数を実行する
149  result = CWndPartition::GetMinWidth();
150 
151  // ウィンドウ表示領域水平サイズを取得する
152  RECT sWindowRect;
153  ::GetWindowRect( m_hWnd, &sWindowRect );
154  int nWindowWidth = ( sWindowRect.right - sWindowRect.left );
155 
156  // パーティション表示クライアント表示領域を取得する
157  RECT sClientRect;
158  if ( !GetPartitionClientRect( sClientRect ) ) {
159  // クライアント表示領域サイズを取得する
160  ::GetClientRect( m_hWnd, &sClientRect );
161  }
162 
163  // クライアント表示領域水平サイズを取得する
164  int nClientWidth = ( sClientRect.right - sClientRect.left );
165 
166  // フレーム水平サイズを取得する
167  int nFrameWidth = ( nWindowWidth - nClientWidth );
168 
169  // 最小水平サイズを更新する
170  result += nFrameWidth;
171  } while ( false );
172 
173  // 実行結果を返す
174  return result;
175  }
176 
177  //-------------------------------------------------------------------------
178  // 最小垂直サイズ取得関数
179  int CWndOverlap::GetMinHeight() noexcept {
180  // 処理ブロック
181  int result = 0;
182  do {
183  // 基底クラスの関数を実行する
184  result = CWndPartition::GetMinHeight();
185 
186  // ウィンドウ表示領域垂直サイズを取得する
187  RECT sWindowRect;
188  ::GetWindowRect( m_hWnd, &sWindowRect );
189  int nWindowHeight = ( sWindowRect.bottom - sWindowRect.top );
190 
191  // パーティション表示クライアント表示領域を取得する
192  RECT sClientRect;
193  if ( !GetPartitionClientRect( sClientRect ) ) {
194  // クライアント表示領域サイズを取得する
195  ::GetClientRect( m_hWnd, &sClientRect );
196  }
197 
198  // クライアント表示領域垂直サイズを取得する
199  int nClientHeight = ( sClientRect.bottom - sClientRect.top );
200 
201  // フレーム垂直サイズを取得する
202  int nFrameHeight = ( nWindowHeight - nClientHeight );
203 
204  // 最小垂直サイズを更新する
205  result += nFrameHeight;
206  } while ( false );
207 
208  // 実行結果を返す
209  return result;
210  }
211 }
212 
213 #pragma managed( pop )
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
CWndOverlap() noexcept
コンストラクタ
Definition: CWndOverlap.cpp:32
virtual bool Create(HWND hParent, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
Definition: CWndOverlap.cpp:88
配列クラス実装ヘッダファイル
virtual int GetMinWidth() noexcept override
最小水平サイズ取得関数
CWndDocumentTab m_cDocumentTab
ドキュメントタブウィンドウ
Definition: CWndOverlap.h:231
virtual int GetMinHeight() noexcept override
最小垂直サイズ取得関数
HWND m_hWnd
ウィンドウハンドル
Definition: CWndBase.h:1539
パーティションウィンドウクラス
Definition: CWndPartition.h:31
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
JSON構成情報クラス
Definition: CJsonConfig.h:31
virtual bool Create(HWND hParent=nullptr, HMENU hMenu=nullptr) noexcept override
ウィンドウ作成関数
Definition: CWndOverlap.cpp:43
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
virtual int GetMinHeight() noexcept override
最小垂直サイズ取得関数
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
virtual LRESULT WmGetMinMaxInfo() noexcept override
各種メッセージ処理関数
Definition: CWndOverlap.cpp:68
virtual int GetMinWidth() noexcept override
最小水平サイズ取得関数
LPARAM m_lParam
メッセージ第2引数
Definition: CWndBase.h:1542
オーバーラップウィンドウクラスヘッダファイル
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
virtual bool GetPartitionClientRect(RECT &rsRect) noexcept
パーティション表示クライアント領域取得関数