Solution46
CWndFloating.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// フローティングウィンドウクラス実装ファイル
4 ///
5 /// フローティングウィンドウクラス実装ファイルです。
6 ///
7 /// $Id: CWndFloating.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 <CWndFloating.h>
18 #include <algorithm>
19 
20 //=============================================================================
21 // インクルード実装ファイル
22 #include <CArray.hpp>
23 
24 //=============================================================================
25 // ウィンドウライブラリ名前空間
26 namespace LibWindow {
27  //=========================================================================
28  // フローティングウィンドウクラス
29  //=========================================================================
30  // 構築子と解体子
31  //-------------------------------------------------------------------------
32  // コンストラクタ
34  // 基底クラスコンストラクタ
35  : CWndDocking()
36  {}
37 
38  //-------------------------------------------------------------------------
39  // コンストラクタ
40  CWndFloating::CWndFloating( CWndDocking&& rcDocking ) noexcept
41  // 基底クラスコンストラクタ
42  : CWndDocking( std::move( rcDocking ) )
43  {}
44 
45  //=========================================================================
46  // 公開関数
47  //-------------------------------------------------------------------------
48  // WM_NCHITTESTメッセージ処理関数
49  LRESULT CWndFloating::WmNcHitTest() noexcept {
50  // 処理ブロック
51  LRESULT result = 0;
52  do {
53  // カーソル位置を取得する
54  POINT sPoint = { LOWORD( m_lParam ), HIWORD( m_lParam ) };
55 
56  // ウィンドウ表示領域を取得する
57  RECT sWindowRect;
58  ::GetWindowRect( m_hWnd, &sWindowRect );
59 
60  // カーソル座標を調べる
61  int nLeft = sWindowRect.left;
62  int nTop = sWindowRect.top;
63  int nRight = sWindowRect.right;
64  int nBottom = sWindowRect.bottom;
65  // 左上か調べる
66  {
67  RECT sRect = { nLeft, nTop, ( nLeft + BORDER_THICK ), ( nTop + BORDER_THICK ) };
68  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
69  // ヒットテストコードを取得する
70  result = HTTOPLEFT;
71 
72  // 終了!
73  break;
74  }
75  }
76  // 右上か調べる
77  {
78  RECT sRect = { ( nRight - BORDER_THICK ), nTop, nRight, ( nTop + BORDER_THICK ) };
79  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
80  // ヒットテストコードを取得する
81  result = HTTOPRIGHT;
82 
83  // 終了!
84  break;
85  }
86  }
87  // 左下か調べる
88  {
89  RECT sRect = { nLeft, ( nBottom - BORDER_THICK ), ( nLeft + BORDER_THICK ), nBottom };
90  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
91  // ヒットテストコードを取得する
92  result = HTBOTTOMLEFT;
93 
94  // 終了!
95  break;
96  }
97  }
98  // 右下か調べる
99  {
100  RECT sRect = { ( nRight - BORDER_THICK ), ( nBottom - BORDER_THICK ), nRight, nBottom };
101  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
102  // ヒットテストコードを取得する
103  result = HTBOTTOMRIGHT;
104 
105  // 終了!
106  break;
107  }
108  }
109  // 左側か調べる
110  {
111  RECT sRect = { nLeft, nTop, ( nLeft + BORDER_THICK ), nBottom };
112  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
113  // ヒットテストコードを取得する
114  result = HTLEFT;
115 
116  // 終了!
117  break;
118  }
119  }
120  // 上側か調べる
121  {
122  RECT sRect = { nLeft, nTop, nRight, ( nTop + BORDER_THICK ) };
123  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
124  // ヒットテストコードを取得する
125  result = HTTOP;
126 
127  // 終了!
128  break;
129  }
130  }
131  // 右側か調べる
132  {
133  RECT sRect = { ( nRight - BORDER_THICK ), nTop, nRight, nBottom };
134  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
135  // ヒットテストコードを取得する
136  result = HTRIGHT;
137 
138  // 終了!
139  break;
140  }
141  }
142  // 下側か調べる
143  {
144  RECT sRect = { nLeft, ( nBottom - BORDER_THICK ), nRight, nBottom };
145  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
146  // ヒットテストコードを取得する
147  result = HTBOTTOM;
148 
149  // 終了!
150  break;
151  }
152  }
153  // タイトルバーか調べる
154  {
155  // タイトルバー表示領域を取得する
156  RECT sRect;
157  ::GetWindowRect( m_cTitleBar.GetHandle(), &sRect );
158  if ( 0 != ::PtInRect( &sRect, sPoint ) ) {
159  // ヒットテストコードを取得する
160  result = HTCAPTION;
161 
162  // 終了!
163  break;
164  }
165  }
166 
167  // 基底クラスの関数を実行する
168  result = CWndDocking::WmNcHitTest();
169  } while ( false );
170 
171  // 実行結果を返す
172  return result;
173  }
174 
175  //-------------------------------------------------------------------------
176  // WM_GETMINMAXINFOメッセージ関数
177  LRESULT CWndFloating::WmGetMinMaxInfo() noexcept {
178  // 処理ブロック
179  LRESULT result = 0;
180  do {
181  // 最小サイズを取得する
182  int nMinWidth = GetMinWidth();
183  int nMinHeight = GetMinHeight();
184 
185  // 最小トラックサイズを設定する
186  LPMINMAXINFO lpMinMaxInfo = reinterpret_cast< LPMINMAXINFO >( m_lParam );
187  lpMinMaxInfo->ptMinTrackSize.x = min( lpMinMaxInfo->ptMaxTrackSize.x, nMinWidth );
188  lpMinMaxInfo->ptMinTrackSize.y = min( lpMinMaxInfo->ptMaxTrackSize.y, nMinHeight );
189  } while ( false );
190 
191  // 実行結果を返す
192  return result;
193  }
194 
195  //-------------------------------------------------------------------------
196  // ウィンドウ構成情報復元関数
197  bool CWndFloating::ResumeConfig( CJsonConfig& rcConfig ) noexcept {
198  // 処理ブロック
199  bool result = false;
200  do {
201  // 基底クラスの関数を実行する
202  if ( !CWndDocking::ResumeConfig( rcConfig ) ) {
203  // 失敗!
204  break;
205  }
206  // ウィンドウ表示位置を復元する
207  else if ( rcConfig.ResumeWindowPosition( m_hWnd ) ) {
208  // ウィンドウ表示状態を復元する
209  if ( rcConfig.ResumeShowWindow( m_hWnd ) ) {
210  // WM_SIZEメッセージを送信する
211  ::SendMessageW( m_hWnd, WM_SIZE, 0, 0 );
212  ::UpdateWindow( m_hWnd );
213 
214  // 成功!
215  result = true;
216  }
217  }
218  } while ( false );
219 
220  // 実行結果を返す
221  return result;
222  }
223 
224  //-------------------------------------------------------------------------
225  // ウィンドウ構成情報保存関数
226  bool CWndFloating::SaveConfig( CJsonConfig& rcConfig ) noexcept {
227  // 処理ブロック
228  bool result = false;
229  do {
230  // 基底クラスの関数を実行する
231  if ( !CWndDocking::SaveConfig( rcConfig ) ) {
232  // 失敗!
233  break;
234  }
235  // ウィンドウ表示位置を保存する
236  else if ( !rcConfig.SaveWindowPosition( m_hWnd ) ) {
237  // 失敗!
238  break;
239  }
240  // ウィンドウ表示状態を保存する
241  else if ( !rcConfig.SaveShowWindow( m_hWnd ) ) {
242  // 失敗!
243  break;
244  }
245 
246  // 成功!
247  result = true;
248  } while ( false );
249 
250  // 実行結果を返す
251  return result;
252  }
253 }
254 
255 #pragma managed( pop )
virtual int GetMinWidth() noexcept override
最小水平サイズ取得関数
virtual HWND & GetHandle() noexcept
ウィンドウハンドル取得関数
Definition: CWndBase.h:69
static int const BORDER_THICK
ボーダー太さ
Definition: CWndFloating.h:171
virtual LRESULT WmNcHitTest() noexcept override
各種メッセージ処理関数
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
virtual LRESULT WmGetMinMaxInfo() noexcept override
CWndTitleBar m_cTitleBar
タイトルバー
フローティングウィンドウクラスヘッダファイル
配列クラス実装ヘッダファイル
HWND m_hWnd
ウィンドウハンドル
Definition: CWndBase.h:1539
JSON構成情報クラス
Definition: CJsonConfig.h:31
ウィンドウライブラリ名前空間
Definition: CommandIdDef.h:22
ドッキングウィンドウクラス
Definition: CWndDocking.h:31
CWndFloating() noexcept
コンストラクタ
virtual LRESULT WmNcHitTest() noexcept
Definition: CWndBase.h:636
LPARAM m_lParam
メッセージ第2引数
Definition: CWndBase.h:1542
virtual bool ResumeConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報復元関数
virtual int GetMinHeight() noexcept override
最小垂直サイズ取得関数
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数
virtual bool SaveConfig(CJsonConfig &rcConfig) noexcept override
ウィンドウ構成情報保存関数