www.pudn.com > 44757463.rar > FullViewBtn.cpp
// FullViewBtn.cpp
//
#include "stdafx.h"
#include "GraphSoft.h"
#include "FullViewBtn.h"
#include "GraphSoftDoc.h"
#include "GraphSoftView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFullViewBtn
CFullViewBtn::CFullViewBtn()
{
m_leftbutton = FALSE ;
m_flRatio=1;
}
CFullViewBtn::~CFullViewBtn()
{
}
BEGIN_MESSAGE_MAP(CFullViewBtn, CButton)
//{{AFX_MSG_MAP(CFullViewBtn)
ON_WM_ERASEBKGND()
ON_WM_KEYDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_RBUTTONUP()
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
ON_CONTROL_REFLECT(BN_DOUBLECLICKED, OnDoubleclicked)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFullViewBtn
void CFullViewBtn::OnClicked()
{
// TODO:
}
BOOL CFullViewBtn::OnEraseBkgnd(CDC* pDC)
{
CBrush newBrush;
newBrush.CreateSolidBrush(RGB(255,255,255));
CRect rect ;
CBrush *pOldBrush = (CBrush*)pDC->SelectObject(&newBrush) ;
// pDC->GetClipBox(&rect) ;
this->GetClientRect(&rect) ;
// rect = m_size ;
rect.InflateRect(3,2);
pDC->PatBlt(rect.left,rect.top,rect.Width(),rect.Height(),PATCOPY) ;
pDC->SelectObject(pOldBrush) ;
newBrush.DeleteObject();
// pDC->SetBkColor(COLORREF(RGB(0,0,0))) ;
return TRUE ;
// return CButton::OnEraseBkgnd(pDC);
}
void CFullViewBtn::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CButton::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CFullViewBtn::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// CButton::OnLButtonDblClk(nFlags, point);
}
void CFullViewBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
// m_pt = m_viewinfo.dp2rp(&point) ;
m_leftbutton = TRUE ;
m_ptw = m_pt=point ;
SetCapture() ;
// CButton::OnLButtonDown(nFlags, point);
}
void CFullViewBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture() ;
CPoint pt;
CDC *pDC = GetDC() ;
int old_rop = pDC->SetROP2(R2_XORPEN);
CPen DragPen ;
CPen* pOldPen ;
CBrush* pOldBrush ;
DragPen.CreatePen(PS_SOLID,1,RGB(255,255,255)) ;
pOldPen = (CPen*)pDC->SelectObject(&DragPen) ;
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH) ;
CRect rect ;
rect.top = min(m_pt.y,m_ptw.y) ;
rect.bottom = max(m_pt.y,m_ptw.y) ;
rect.left = min(m_pt.x,m_ptw.x) ;
rect.right = max(m_pt.x,m_ptw.x) ;
pDC->Rectangle(&rect) ;
DragPen.DeleteObject();
DragPen.CreatePen(PS_SOLID,1,RGB(255,0,255)) ;
pDC->SelectObject(&DragPen) ;
CRect rectView;
if(m_targetrect!=m_MaxRect)//キタヨケクイクヌ
{
CRect rectTmp = m_targetrect.GetRect();
pDC->Rectangle(&rectTmp);
}
CGraphSoftView* pView=((CGraphSoftView*)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveView());
if(fabs(m_pt.x-point.x)<2||fabs(m_pt.y-point.y)<2) {
m_targetrect.OffsetRect(point.x-m_targetrect.CenterPoint().x,point.y-m_targetrect.CenterPoint().y);
}
else {
float ratiox,ratioy;
pView->GetClientRect(&rectView);
ratiox = ((float)rect.Width())/rectView.Width() ;
ratioy = ((float)rect.Height())/rectView.Height() ;
if(ratiox>ratioy) m_flRatio = ratiox ;
else m_flRatio = ratioy ;
m_targetrect.left=rect.CenterPoint().x-m_flRatio*rectView.Width()/2;
m_targetrect.right=rect.CenterPoint().x+m_flRatio*rectView.Width()/2;
m_targetrect.top=rect.CenterPoint().y-m_flRatio*rectView.Height()/2;
m_targetrect.bottom=rect.CenterPoint().y+m_flRatio*rectView.Height()/2;
//pView->DrawCut();
}
// pView->DrawCut();
CRect rectTmp = m_targetrect.GetRect();
pDC->Rectangle(&rectTmp);
float rate=((float)pView->m_rectMaxWindow.Width())/m_MaxRect.Width();
pView->m_rectTarget.left=((float)m_targetrect.left-m_MaxRect.left)*rate;
pView->m_rectTarget.right=((float)m_targetrect.right-m_MaxRect.left)*rate;
pView->m_rectTarget.top=((float)m_targetrect.top-m_MaxRect.top)*rate;
pView->m_rectTarget.bottom=((float)m_targetrect.bottom-m_MaxRect.top)*rate;
rate=((float)m_MaxRect.Width())/m_targetrect.Width();
CSize sz(pView->m_rectMaxWindow.Width()*rate,pView->m_rectMaxWindow.Height()*rate);
pView->SetScrollSizes(MM_TEXT,sz);
pView->m_rectMaxWindow.OffsetRect(-pView->m_rectMaxWindow.left,-pView->m_rectMaxWindow.top);
pView->m_flRate=rate;
rate= rate*pView->m_rectMaxWindow.Width()/m_MaxRect.Width();
pView->m_rectMaxWindow.OffsetRect(rate*(m_targetrect.left-m_MaxRect.left),rate*(m_targetrect.top-m_MaxRect.top));
pView->ScrollToPosition(pView->m_rectMaxWindow.TopLeft());
pView->Invalidate(TRUE);
m_leftbutton = FALSE ;
pDC->SetROP2(old_rop);
pDC->SelectObject(pOldPen) ;
pDC->SelectObject(pOldBrush) ;
ReleaseDC(pDC) ;
// CButton::OnLButtonUp(nFlags, point);
}
void CFullViewBtn::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_leftbutton) {
CDC *pDC = GetDC() ;
int old_rop = pDC->SetROP2(R2_XORPEN);
CPen DragPen ;
CPen* pOldPen ;
CBrush* pOldBrush ;
DragPen.CreatePen(PS_SOLID,1,RGB(255,255,255)) ;
pOldPen = (CPen*)pDC->SelectObject(&DragPen) ;
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH) ;
CRect rect ;
rect.top = min(m_pt.y,m_ptw.y) ;
rect.bottom = max(m_pt.y,m_ptw.y) ;
rect.left = min(m_pt.x,m_ptw.x) ;
rect.right = max(m_pt.x,m_ptw.x) ;
pDC->Rectangle(&rect) ;
m_ptw = point ;
rect.top = min(m_pt.y,m_ptw.y) ;
rect.bottom = max(m_pt.y,m_ptw.y) ;
rect.left = min(m_pt.x,m_ptw.x) ;
rect.right = max(m_pt.x,m_ptw.x) ;
pDC->Rectangle(&rect) ;
pDC->SelectObject(pOldPen) ;
pDC->SelectObject(pOldBrush) ;
ReleaseDC(pDC) ;
}
// CButton::OnMouseMove(nFlags, point);
}
void CFullViewBtn::OnPaint()
{
CPaintDC dc(this);
CDC* pDC = &dc ;
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd() ;
CPen DragPen ;
CPen* pOldPen ;
CBrush* pOldBrush ;
DragPen.CreatePen(PS_SOLID,1,RGB(0,255,0)) ;
pOldPen = (CPen*)pDC->SelectObject(&DragPen) ;
pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH) ;
CRect rectTmp = m_targetrect.GetRect();
pDC->Rectangle(&rectTmp);
CRect rectBtn,rectView,rectTarget;
float ratiox,ratioy;
CGraphSoftView* pView=((CGraphSoftView*)((CMainFrame*)AfxGetApp()->GetMainWnd())->GetActiveView());
GetClientRect(&rectBtn);
rectView=pView->m_rectMaxWindow;
ratiox = ((float)rectBtn.Width())/rectView.Width() ;
ratioy = ((float)rectBtn.Height())/rectView.Height() ;
if(ratioxSelectObject(&DragPen) ;
pDC->Rectangle(&rectTarget);
m_MaxRect=rectTarget;
TRACE("MAXRECt:(%d,%d)--(%d,%d)\n",m_MaxRect.left,m_MaxRect.top,m_MaxRect.right,m_MaxRect.bottom);
if(m_targetrect.Width()==0){
// int old_rop = pDC->SetROP2(R2_XORPEN);
// DragPen.DeleteObject();
// DragPen.CreatePen(PS_SOLID,1,RGB(255,0,255)) ;
// pDC->SelectObject(&DragPen) ;
// pDC->Rectangle(&rectTarget);
// pDC->SetROP2(old_rop);
m_targetrect=m_MaxRect;
}
pDC->SelectObject(pOldPen) ;
pDC->SelectObject(pOldBrush) ;
DrawGraph(pDC,rectTarget);
}
void CFullViewBtn::OnRButtonUp(UINT nFlags, CPoint point)
{
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd() ;
//ニチトサマヤハセユクヘシミホ
// m_pView->Invalidate(TRUE);
// CButton::OnRButtonUp(nFlags, point);
}
void CFullViewBtn::OnDoubleclicked()
{
//
}
int CFullViewBtn::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CButton::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
void CFullViewBtn::DrawGraph(CDC* pDC,CRect rect)
{
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd() ;
CGraphSoftView* pView = (CGraphSoftView*)(pMainFrame->GetActiveView());
CGraphSoftDoc* pDoc=pView->GetDocument();
POSITION pos;
CRect rectMax(0,0,800,650);
rectMax=pView->m_rectMaxWindow;
rectMax.OffsetRect(-rectMax.left,-rectMax.top);
pos=pDoc->m_shapeList.GetHeadPosition();
while (pos!=NULL) {
CShape* pShape=pDoc->m_shapeList.GetNext(pos);
int flag = pShape->GetDrawPointsFlag();
pShape->SetDrawPointsFlag(0);//ネォセヨハモヘシヨミイササ貊ュクィヨオ
if(pShape->IsSelected()){
pShape->DrawCutToRect(pDC,RGB(255,0,0),RGB(255,0,0),rectMax,rect);
}else{
pShape->DrawCutToRect(pDC,rectMax,rect);
}
pShape->SetDrawPointsFlag(flag);
}
}