00001
00002
00003
00004
00005 #include "ExView.h"
00006
00007
00008 #ifdef _DEBUG
00009 #define new DEBUG_NEW
00010 #undef THIS_FILE
00011 static char THIS_FILE[] = __FILE__;
00012 #endif
00013
00014
00015 using namespace jbxl;
00016 using namespace jbxwl;
00017
00018
00019 UINT jbxwl::TimerID = 1;
00020
00021
00023
00024
00025 IMPLEMENT_DYNCREATE(CExView, CView)
00026
00027
00028 CExView::CExView()
00029 {
00030
00031 cmnHead.init();
00032 msGraph.init();
00033
00034 pDoc = NULL;
00035 pFrame = NULL;
00036 pApp = NULL;
00037 anyData = NULL;
00038
00039 hasViewData = FALSE;
00040 Title = _T("");
00041
00042 timerID = -1;
00043 sizeXYRate = 1.0;
00044 clientRate = 1.0;
00045 sizeFac = 1.0;
00046
00047 xsize = 0;
00048 ysize = 0;
00049 zsize = 1;
00050
00051 origXSize = 0;
00052 origYSize = 0;
00053 initXSize = 0;
00054 initYSize = 0;
00055 prevXSize = 0;
00056 prevYSize = 0;
00057
00058 cnstSize = false;
00059 cnstXSize = false;
00060 cnstYSize = false;
00061 cnstXYRate = false;
00062 maxXSize = SINTMAX;
00063 maxYSize = SINTMAX;
00064
00065 ctrlMouse = true;
00066 doReSize = false;
00067 activeWin = false;
00068
00069 vSBpos = 0;
00070 prevSBpos = -1;
00071 vSBmax = 0;
00072 vSBntch = 3;
00073 vSBctrl = true;
00074 viewMode = VIEW_ZDIR;
00075 colorMode = GRAPH_COLOR_MONO;
00076 usePlane = false;
00077
00078 cMax = 0;
00079 cMin = 0;
00080 vMax = 0;
00081 vMin = 0;
00082
00083 clientRect.bottom = 0;
00084 clientRect.top = 0;
00085 clientRect.left = 0;
00086 clientRect.right = 0;
00087 }
00088
00089
00090
00091 CExView::~CExView()
00092 {
00093 DEBUG_INFO("DESTRUCTOR: CExView\n");
00094
00095 if (pApp!=NULL) {
00096 DEBUG_INFO("Call Application ViewDestructor()\n");
00097 pApp->ViewDestructor(this);
00098 }
00099
00100
00101 cmnHead.mfree();
00102 msGraph.mfree();
00103
00104 viewData.free();
00105
00106 if (!isNull(pDoc)) pDoc->pView = NULL;
00107 if (!isNull(pFrame)) pFrame->pView = NULL;
00108 pDoc = NULL;
00109 pFrame = NULL;
00110 }
00111
00112
00113
00114 BEGIN_MESSAGE_MAP(CExView, CView)
00115
00116 ON_WM_SIZE()
00117 ON_WM_VSCROLL()
00118 ON_WM_MOUSEWHEEL()
00119
00120
00121 ON_WM_ERASEBKGND()
00122 ON_WM_TIMER()
00123 END_MESSAGE_MAP()
00124
00125
00126
00128
00129
00130 #ifdef _DEBUG
00131 void CExView::AssertValid() const
00132 {
00133 CView::AssertValid();
00134 }
00135
00136
00137 void CExView::Dump(CDumpContext& dc) const
00138 {
00139 CView::Dump(dc);
00140 }
00141 #endif //_DEBUG
00142
00143
00144
00145
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 POINT CExView::SetWindowSize(int cxs, int cys, BOOL first)
00158 {
00159 POINT pc = {-1, -1};
00160
00161 if (cxs<0 || cys<0) return pc;
00162 pc.x = cxs;
00163 pc.y = cys;
00164
00165 POINT pt = GetWindowSize(pc);
00166 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
00167 GetClientRect(&clientRect);
00168
00169
00170 if (clientRect.right!=pc.x || clientRect.bottom!=pc.y) {
00171 if (first) {
00172 double srate = (double)clientRect.bottom/(double)clientRect.right;
00173 if (sizeXYRate<srate) {
00174 pc.x = clientRect.right;
00175 pc.y = (int)(pc.x*sizeXYRate+0.5);
00176 }
00177 else {
00178 pc.y = clientRect.bottom;
00179 pc.x = (int)(pc.y/sizeXYRate+0.5);
00180 }
00181 }
00182 else {
00183 pc.x = prevXSize;
00184 pc.y = prevYSize;
00185 }
00186 pt = GetWindowSize(pc);
00187 pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE);
00188 GetClientRect(&clientRect);
00189 }
00190
00191 pc.x = prevXSize = clientRect.right;
00192 pc.y = prevYSize = clientRect.bottom;
00193 clientRate = (double)clientRect.right/(double)origXSize;
00194
00195 if (first) {
00196 initXSize = clientRect.right;
00197 initYSize = clientRect.bottom;
00198 }
00199 return pc;
00200 }
00201
00202
00203
00204
00205
00206 POINT CExView::GetWindowSize(POINT pt)
00207 {
00208 RECT frect, crect;
00209 POINT pc;
00210
00211 pFrame->GetWindowRect(&frect);
00212 GetClientRect(&crect);
00213
00214 pc.x = pt.x + (frect.right -frect.left) - (crect.right -crect.left);
00215 pc.y = pt.y + (frect.bottom-frect.top) - (crect.bottom-crect.top);
00216 return pc;
00217 }
00218
00219
00220
00221
00222
00223 POINT CExView::GetClientSize(POINT pt)
00224 {
00225 RECT frect, crect;
00226 POINT pc;
00227
00228 pFrame->GetWindowRect(&frect);
00229 GetClientRect(&crect);
00230
00231 pc.x = pt.x - (frect.right -frect.left) + (crect.right -crect.left);
00232 pc.y = pt.y - (frect.bottom-frect.top) + (crect.bottom-crect.top);
00233 return pc;
00234 }
00235
00236
00237
00238 POINT CExView::GetWindowReSize(POINT pt)
00239 {
00240 int minxs = GetSystemMetrics(SM_CXMINTRACK);
00241 int minys = GetSystemMetrics(SM_CYMINTRACK);
00242
00243 if (pt.x<minxs) pt.x = minxs;
00244 if (pt.y<minys) pt.y = minys;
00245
00246 if (cnstSize) {
00247 pt.x = initXSize;
00248 pt.y = initYSize;
00249 }
00250 else if (cnstXSize || cnstYSize || cnstXYRate) {
00251 if (cnstXSize && !cnstYSize) {
00252 pt.x = initXSize;
00253 pt.y = Min(pt.y, maxYSize);
00254 }
00255 else if (!cnstXSize && cnstYSize) {
00256 pt.x = Min(pt.x, maxXSize);
00257 pt.y = initYSize;
00258 }
00259 else if (cnstXYRate) {
00260 TCHAR* cur = GetMouseCursorType();
00261 if (cur==IDC_SIZENS) {
00262 pt.y = Min(pt.y, maxYSize);
00263 pt.x = (int)(pt.y/sizeXYRate + 0.5);
00264 }
00265 else {
00266 pt.x = Min(pt.x, maxXSize);
00267 pt.y = (int)(pt.x*sizeXYRate + 0.5);
00268 }
00269 }
00270 }
00271
00272 return pt;
00273 }
00274
00275
00276
00277 POINT CExView::ExecWindowReSize(int cxsize, int cysize)
00278 {
00279 POINT pt;
00280 pt.x = cxsize;
00281 pt.y = cysize;
00282
00283 if (doReSize) {
00284 pt = GetWindowReSize(pt);
00285 if (!cnstSize && (cnstXSize || cnstYSize || cnstXYRate)) {
00286 pt = SetWindowSize(pt.x, pt.y, FALSE);
00287 }
00288 }
00289
00290 doReSize = false;
00291 return pt;
00292 }
00293
00294
00295
00296
00298
00299
00300
00301
00302
00303
00304 POINT CExView::GetMousePos()
00305 {
00306 POINT pt;
00307 RECT crect;
00308
00309 if (m_hWnd==NULL) {
00310 pt.x = pt.y = -1;
00311 return pt;
00312 }
00313
00314 GetCursorPos(&pt);
00315 ScreenToClient(&pt);
00316 this->GetClientRect(&crect);
00317
00318 if (crect.right-crect.left < pt.x) pt.x = -pt.x;
00319 if (crect.bottom-crect.top < pt.y) pt.y = -pt.y;
00320
00321 return pt;
00322 }
00323
00324
00325
00326 BOOL CExView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
00327 {
00328 if (vSBmax!=0 && vSBctrl) {
00329 int ovsbpos = vSBpos;
00330
00331 vSBpos = vSBpos - zDelta/30*vSBntch;
00332 if (vSBpos<0) vSBpos = 0;
00333 if (vSBpos>vSBmax) vSBpos = vSBmax;
00334 SetScrollPos(SB_VERT, vSBpos);
00335
00336 HRESULT hr = SetNewSurface(ovsbpos);
00337 OnDraw(NULL);
00338 }
00339
00340 return TRUE;
00341 }
00342
00343
00344
00345
00347
00348
00349 void CExView::SetTitle(LPCTSTR title)
00350 {
00351 this->Title = title;
00352 pFrame->Title = title;
00353 pFrame->SetTitle(title);
00354 pFrame->SetWindowText(title);
00355
00356
00357 return;
00358 }
00359
00360
00361
00362
00364
00365
00366 void CExView::OnInitialUpdate()
00367 {
00368 CView::OnInitialUpdate();
00369
00370 if (pDoc!=NULL) {
00371 cmnHead = pDoc->cmnHead;
00372 msGraph = pDoc->msGraph;
00373 xsize = cmnHead.xsize;
00374 ysize = cmnHead.ysize;
00375 zsize = cmnHead.zsize;
00376 }
00377
00378 if ((cnstXSize&&cnstYSize) || (cnstXSize&&cnstXYRate) || (cnstYSize&&cnstXYRate )) {
00379 cnstSize = true;
00380 cnstXSize = cnstYSize = cnstXYRate = false;
00381 }
00382 }
00383
00384
00385
00386 void CExView::OnDraw(CDC* pDC)
00387 {
00388 if (hasViewData && timerID==-1) {
00389 ExecWindowReSize(clientRect.right, clientRect.bottom);
00390 ExecRender();
00391 }
00392 else if (!hasViewData) DEBUG_ERROR("CExView::OnDraw(): ERROR: 表示可能なデータがありません\n");
00393 }
00394
00395
00396
00397 void CExView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
00398 {
00399 activeWin = false;
00400 ctrlMouse = false;
00401 if (bActivate && pActivateView==this) {
00402 activeWin = true;
00403 ctrlMouse = true;
00404 }
00405
00406 CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
00407 }
00408
00409
00410
00411 void CExView::OnSize(UINT nType, int cx, int cy)
00412 {
00413 CView::OnSize(nType, cx, cy);
00414
00415 doReSize = true;
00416 if (pFrame!=NULL) GetClientRect(&clientRect);
00417 }
00418
00419
00420
00421 BOOL CExView::OnEraseBkgnd(CDC* pDC)
00422 {
00423 return TRUE;
00424 }
00425
00426
00427
00428 void CExView::OnTimer(UINT_PTR nIDEvent)
00429 {
00430 if (hasViewData) {
00431 ExecWindowReSize(clientRect.right, clientRect.bottom);
00432 ExecRender();
00433 }
00434 else DEBUG_ERROR("CExView::OnTimer(): ERROR: 表示可能なデータがありません\n");
00435
00436 CView::OnTimer(nIDEvent);
00437 }
00438
00439
00440
00441 void CExView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
00442 {
00443 if (!activeWin || vSBmax==0) return;
00444 if (pScrollBar!=NULL || !vSBctrl) return;
00445
00446 int ovsbpos = vSBpos;
00447
00448 switch (nSBCode) {
00449 case SB_LINEDOWN:
00450 vSBpos += vSBntch;
00451 if (vSBpos>vSBmax) vSBpos = vSBmax;
00452 break;
00453 case SB_LINEUP:
00454 vSBpos -= vSBntch;
00455 if (vSBpos<0) vSBpos = 0;
00456 break;
00457 case SB_THUMBPOSITION:
00458 vSBpos = nPos;
00459 break;
00460 case SB_THUMBTRACK:
00461 vSBpos = nPos;
00462 break;
00463 case SB_PAGEDOWN:
00464 vSBpos += vSBntch*2;
00465 if (vSBpos>vSBmax) vSBpos = vSBmax;
00466 break;
00467 case SB_PAGEUP:
00468 vSBpos -= vSBntch*2;
00469 if (vSBpos<0) vSBpos = 0;
00470 break;
00471 }
00472 SetScrollPos(SB_VERT, vSBpos);
00473
00474 HRESULT hr = SetNewSurface(ovsbpos);
00475 OnDraw(NULL);
00476
00477 return;
00478 }
00479