// // ExView.cpp : インプリメンテーション ファイル // #include "ExTextView.h" using namespace jbxl; using namespace jbxwl; ///////////////////////////////////////////////////////////////////////////// // CExTextView 画像データ用 IMPLEMENT_DYNCREATE(CExTextView, CScrollView) CExTextView::CExTextView() { pDoc = NULL; //(CExDocument*)GetDocument(); pFrame = NULL; pApp = NULL; Title = _T(""); // ウィンドウタイトル sizeXYRate = 1.0; clientRate = 1.0; xsize = 0; ysize = 0; origXSize = 0; origYSize = 0; initXSize = 0; initYSize = 0; prevXSize = 0; prevYSize = 0; cnstSize = false; cnstXSize = false; cnstYSize = false; cnstXYRate = false; maxXSize = SINTMAX; maxYSize = SINTMAX; doReSize = false; activeWin = false; clientRect.bottom = 0; clientRect.top = 0; clientRect.left = 0; clientRect.right = 0; } CExTextView::~CExTextView() { DEBUG_INFO("DESTRUCTOR: CExTextView: START\n"); if (pApp!=NULL) { DEBUG_INFO("Call Application ViewDestructor()\n"); pApp->ViewDestructor(this); // 上位アプリケーションに通知 } if (!isNull(pFrame)) pFrame->pView = NULL; pDoc = NULL; pFrame = NULL; DEBUG_INFO("DESTRUCTOR: CExTextView: END\n"); } BEGIN_MESSAGE_MAP(CExTextView, CScrollView) //{{AFX_MSG_MAP(CExTextView) ON_WM_SIZE() //}}AFX_MSG_MAP ON_WM_ERASEBKGND() END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Window サイズ // // クライアントサイズを指定して,ウィンドを配置する // // cxsize --- クライアント領域の Xサイズ // cysize --- クライアント領域の Yサイズ // // sizeXYRate は下位クラスで定義されている必要がある. // POINT CExTextView::SetWindowSize(int cxs, int cys, BOOL first) { POINT pc = {-1, -1}; if (cxs<0 || cys<0) return pc; pc.x = cxs; pc.y = cys; POINT pt = GetWindowSize(pc); pFrame->SetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE); GetClientRect(&clientRect); // サイズが合わない場合 if (clientRect.right!=pc.x || clientRect.bottom!=pc.y) { if (first) { double srate = (double)clientRect.bottom/(double)clientRect.right; if (sizeXYRateSetWindowPos((CWnd*)&wndTop, 0, 0, pt.x, pt.y, SWP_NOMOVE); GetClientRect(&clientRect); } pc.x = prevXSize = clientRect.right; pc.y = prevYSize = clientRect.bottom; clientRate = (double)clientRect.right/(double)origXSize; if (first) { initXSize = clientRect.right; initYSize = clientRect.bottom; } return pc; } // // クライアント領域のサイズからウインドウ領域のサイズを計算する. // POINT CExTextView::GetWindowSize(POINT pt) { RECT frect, crect; POINT pc; pFrame->GetWindowRect(&frect); GetClientRect(&crect); pc.x = pt.x + (frect.right -frect.left) - (crect.right -crect.left); pc.y = pt.y + (frect.bottom-frect.top) - (crect.bottom-crect.top); return pc; } // // ウインドウ領域のサイズからクライアント領域のサイズを計算する. // POINT CExTextView::GetClientSize(POINT pt) { RECT frect, crect; POINT pc; pFrame->GetWindowRect(&frect); GetClientRect(&crect); pc.x = pt.x - (frect.right -frect.left) + (crect.right -crect.left); pc.y = pt.y - (frect.bottom-frect.top) + (crect.bottom-crect.top); return pc; } // POINT CExTextView::GetWindowReSize(POINT pt) { int minxs = GetSystemMetrics(SM_CXMINTRACK); int minys = GetSystemMetrics(SM_CYMINTRACK); if (pt.xTitle = title; pFrame->Title = title; pFrame->SetTitle(title); // ルート&カレントウィンドウ pFrame->SetWindowText(title); // カレントウィンドウ pDoc->SetTitle(title); // ? return; } ///////////////////////////////////////////////////////////////////////////// // CExTextView メッセージ ハンドラ void CExTextView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); if ((cnstXSize&&cnstYSize) || (cnstXSize&&cnstXYRate) || (cnstYSize&&cnstXYRate )) { cnstSize = true; cnstXSize = cnstYSize = cnstXYRate = false; } } // void CExTextView::OnDraw(CDC* pDC) { ExecWindowReSize(clientRect.right, clientRect.bottom); } // void CExTextView::OnActivateView(BOOL bActivate, CScrollView* pActivateView, CScrollView* pDeactiveView) { activeWin = false; if (bActivate && pActivateView==this) { activeWin = true; } CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); } // void CExTextView::OnSize(UINT nType, int cx, int cy) { CScrollView::OnSize(nType, cx, cy); doReSize = true; if (pFrame!=NULL) GetClientRect(&clientRect); } // BOOL CExTextView::OnEraseBkgnd(CDC* pDC) { return CScrollView::OnEraseBkgnd(pDC); }