JunkBox_Win_Lib 1.5.3
Loading...
Searching...
No Matches
ExTextView.cpp
Go to the documentation of this file.
1//
2// ExView.cpp : インプリメンテーション ファイル
3//
4
5
6#include "ExTextView.h"
7
8
9using namespace jbxl;
10using namespace jbxwl;
11
12
14// CExTextView 画像データ用
15
16IMPLEMENT_DYNCREATE(CExTextView, CScrollView)
17
18
20{
21 pDoc = NULL; //(CExDocument*)GetDocument();
22 pFrame = NULL;
23 pApp = NULL;
24
25 Title = _T(""); // ウィンドウタイトル
26
27 sizeXYRate = 1.0;
28 clientRate = 1.0;
29
30 xsize = 0;
31 ysize = 0;
32
33 origXSize = 0;
34 origYSize = 0;
35 initXSize = 0;
36 initYSize = 0;
37 prevXSize = 0;
38 prevYSize = 0;
39
40 cnstSize = false;
41 cnstXSize = false;
42 cnstYSize = false;
43 cnstXYRate = false;
44 maxXSize = SINTMAX;
45 maxYSize = SINTMAX;
46
47 doReSize = false;
48 activeWin = false;
49
50 clientRect.bottom = 0;
51 clientRect.top = 0;
52 clientRect.left = 0;
53 clientRect.right = 0;
54}
55
56
57
59{
60 DEBUG_INFO("DESTRUCTOR: CExTextView: START\n");
61
62 if (pApp!=NULL) {
63 DEBUG_INFO("Call Application ViewDestructor()\n");
64 pApp->ViewDestructor(this); // 上位アプリケーションに通知
65 }
66
67 if (!isNull(pFrame)) pFrame->pView = NULL;
68 pDoc = NULL;
69 pFrame = NULL;
70
71 DEBUG_INFO("DESTRUCTOR: CExTextView: END\n");
72}
73
74
75
76BEGIN_MESSAGE_MAP(CExTextView, CScrollView)
77 //{{AFX_MSG_MAP(CExTextView)
78 ON_WM_SIZE()
79 //}}AFX_MSG_MAP
80 ON_WM_ERASEBKGND()
81END_MESSAGE_MAP()
82
83
84
86// Window サイズ
87
88//
89// クライアントサイズを指定して,ウィンドを配置する
90//
91// cxsize --- クライアント領域の Xサイズ
92// cysize --- クライアント領域の Yサイズ
93//
94// sizeXYRate は下位クラスで定義されている必要がある.
95//
96POINT CExTextView::SetWindowSize(int cxs, int cys, BOOL first)
97{
98 POINT pc = {-1, -1};
99
100 if (cxs<0 || cys<0) return pc;
101 pc.x = cxs;
102 pc.y = cys;
103
104 POINT pt = GetWindowSize(pc);
105 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
106 GetClientRect(&clientRect);
107
108 // サイズが合わない場合
109 if (clientRect.right!=pc.x || clientRect.bottom!=pc.y) {
110 if (first) {
111 double srate = (double)clientRect.bottom/(double)clientRect.right;
112 if (sizeXYRate<srate) {
113 pc.x = clientRect.right;
114 pc.y = (int)(pc.x*sizeXYRate+0.5);
115 }
116 else {
117 pc.y = clientRect.bottom;
118 pc.x = (int)(pc.y/sizeXYRate+0.5);
119 }
120 }
121 else {
122 pc.x = prevXSize;
123 pc.y = prevYSize;
124 }
125 pt = GetWindowSize(pc);
126 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
127 GetClientRect(&clientRect);
128 }
129
130 pc.x = prevXSize = clientRect.right;
131 pc.y = prevYSize = clientRect.bottom;
132 clientRate = (double)clientRect.right/(double)origXSize;
133
134 if (first) {
135 initXSize = clientRect.right;
136 initYSize = clientRect.bottom;
137 }
138 return pc;
139}
140
141
142//
143// クライアント領域のサイズからウインドウ領域のサイズを計算する.
144//
146{
147 RECT frect, crect;
148 POINT pc;
149
150 pFrame->GetWindowRect(&frect);
151 GetClientRect(&crect);
152
153 pc.x = pt.x + (frect.right -frect.left) - (crect.right -crect.left);
154 pc.y = pt.y + (frect.bottom-frect.top) - (crect.bottom-crect.top);
155 return pc;
156}
157
158
159//
160// ウインドウ領域のサイズからクライアント領域のサイズを計算する.
161//
163{
164 RECT frect, crect;
165 POINT pc;
166
167 pFrame->GetWindowRect(&frect);
168 GetClientRect(&crect);
169
170 pc.x = pt.x - (frect.right -frect.left) + (crect.right -crect.left);
171 pc.y = pt.y - (frect.bottom-frect.top) + (crect.bottom-crect.top);
172 return pc;
173}
174
175
176//
178{
179 int minxs = GetSystemMetrics(SM_CXMINTRACK);
180 int minys = GetSystemMetrics(SM_CYMINTRACK);
181
182 if (pt.x<minxs) pt.x = minxs;
183 if (pt.y<minys) pt.y = minys;
184
185
186 if (cnstSize) {
187 pt.x = initXSize;
188 pt.y = initYSize;
189 }
190 else if (cnstXSize || cnstYSize || cnstXYRate) {
191 if (cnstXSize && !cnstYSize) { // Xサイズ固定
192 pt.x = initXSize;
193 pt.y = Min(pt.y, maxYSize);
194 }
195 else if (!cnstXSize && cnstYSize) { // Yサイズ固定
196 pt.x = Min(pt.x, maxXSize);
197 pt.y = initYSize;
198 }
199 else if (cnstXYRate) { // 縦横比固定
200 TCHAR* cur = GetMouseCursorType();
201 if (cur==IDC_SIZENS) {
202 pt.y = Min(pt.y, maxYSize);
203 pt.x = (int)(pt.y/sizeXYRate + 0.5);
204 }
205 else {
206 pt.x = Min(pt.x, maxXSize);
207 pt.y = (int)(pt.x*sizeXYRate + 0.5);
208 }
209 }
210 }
211
212 return pt;
213}
214
215
216//
217POINT CExTextView::ExecWindowReSize(int cxsize, int cysize)
218{
219 POINT pt;
220 pt.x = cxsize;
221 pt.y = cysize;
222
223 if (doReSize) {
224 pt = GetWindowReSize(pt);
225 if (!cnstSize && (cnstXSize || cnstYSize || cnstXYRate)) {
226 pt = SetWindowSize(pt.x, pt.y, FALSE);
227 }
228 }
229
230 doReSize = false;
231 return pt;
232}
233
234
235
236
238// CExTextView ツール
239
240void CExTextView::SetTitle(LPCTSTR title)
241{
242 this->Title = title;
243 pFrame->Title = title;
244 pFrame->SetTitle(title); // ルート&カレントウィンドウ
245 pFrame->SetWindowText(title); // カレントウィンドウ
246 pDoc->SetTitle(title); // ?
247
248 return;
249}
250
251
252
253
255// CExTextView メッセージ ハンドラ
256
258{
259 CScrollView::OnInitialUpdate();
260
262 cnstSize = true;
263 cnstXSize = cnstYSize = cnstXYRate = false;
264 }
265}
266
267
268//
270{
272}
273
274
275//
276void CExTextView::OnActivateView(BOOL bActivate, CScrollView* pActivateView, CScrollView* pDeactiveView)
277{
278 activeWin = false;
279 if (bActivate && pActivateView==this) {
280 activeWin = true;
281 }
282
283 CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
284}
285
286
287//
288void CExTextView::OnSize(UINT nType, int cx, int cy)
289{
290 CScrollView::OnSize(nType, cx, cy);
291
292 doReSize = true;
293 if (pFrame!=NULL) GetClientRect(&clientRect);
294}
295
296
297//
299{
300 return CScrollView::OnEraseBkgnd(pDC);
301}
302
303
virtual void ViewDestructor(CExView *vw)
Definition ExClass.h:62
CExTextView * pView
Definition ExTextFrame.h:41
virtual void OnActivateView(BOOL bActivate, CScrollView *pActivateView, CScrollView *pDeactiveView)
virtual void OnDraw(CDC *pDC)
virtual void OnInitialUpdate()
POINT ExecWindowReSize(int xs, int ys)
POINT GetWindowReSize(POINT pt)
virtual ~CExTextView()
CExTextFrame * pFrame
Definition ExTextView.h:35
afx_msg void OnSize(UINT nType, int cx, int cy)
POINT GetWindowSize(POINT pt)
CAppCallBack * pApp
Definition ExTextView.h:36
void SetTitle(LPCTSTR title)
POINT GetClientSize(POINT pt)
CDocument * pDoc
Definition ExTextView.h:34
POINT SetWindowSize(int xs, int ys, BOOL first=TRUE)
afx_msg BOOL OnEraseBkgnd(CDC *pDC)
TCHAR * GetMouseCursorType(void)
Definition WinTools.cpp:749