📄 imageview.cpp
字号:
// imageView.cpp : implementation of the CImageView class
//
#include "stdafx.h"
#include "image.h"
#include "imageDoc.h"
#include "imageView.h"
#include "bitmapfile.h"
#include "drawshape.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CImageView
IMPLEMENT_DYNCREATE(CImageView, CScrollView)
BEGIN_MESSAGE_MAP(CImageView, CScrollView)
//{{AFX_MSG_MAP(CImageView)
ON_COMMAND(ID_DRAW_CIRCLE, OnDrawCircle)
ON_UPDATE_COMMAND_UI(ID_DRAW_CIRCLE, OnUpdateDrawCircle)
ON_COMMAND(ID_DRAW_LINE, OnDrawLine)
ON_UPDATE_COMMAND_UI(ID_DRAW_LINE, OnUpdateDrawLine)
ON_COMMAND(ID_DRAW_RECTANCLE, OnDrawRectancle)
ON_UPDATE_COMMAND_UI(ID_DRAW_RECTANCLE, OnUpdateDrawRectancle)
ON_COMMAND(ID_DRAW_TEXT, OnDrawText)
ON_UPDATE_COMMAND_UI(ID_DRAW_TEXT, OnUpdateDrawText)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_ZOOM_IN2, OnZoomIn2)
ON_COMMAND(ID_ZOOM_IN4, OnZoomIn4)
ON_COMMAND(ID_ZOOM_NORMAL, OnZoomNormal)
ON_COMMAND(ID_ZOOM_OUT2, OnZoomOut2)
ON_COMMAND(ID_ZOOM_OUT4, OnZoomOut4)
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageView construction/destruction
CImageView::CImageView()
{
// TODO: add construction code here
m_pEdit = NULL;
m_pPreText = NULL;
m_fScale = 1;
}
CImageView::~CImageView()
{
delete m_pEdit;
}
BOOL CImageView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CImageView drawing
void CImageView::OnDraw(CDC* pDC)
{
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC memDC;
memDC.CreateCompatibleDC( pDC );
CGdiObject* oldGdi = memDC.SelectObject(pDoc->m_pBitmap);
CGdiObject* pOldBrush = memDC.SelectStockObject(NULL_BRUSH);
CTypedPtrList<CObList, CShape*>& shapeList=pDoc->m_ShapeList;
POSITION pos=shapeList.GetHeadPosition();
while(pos)
{
CShape *pShape=shapeList.GetNext(pos);
pShape->Draw(&memDC);
}
memDC.SelectObject(pOldBrush);
int w=pDoc->m_pBitmap->GetWidth();
int h=pDoc->m_pBitmap->GetHeight();
//render the bmp file
pDC->StretchBlt(0, 0, (int)(w*m_fScale), (int)(h*m_fScale), &memDC, 0, 0, w, h, SRCCOPY);
memDC.SelectObject(oldGdi);
// TODO: add draw code for native data here
}
void CImageView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: calculate the total size of this view
CSize sizeTotal;
sizeTotal.cx = (long)(pDoc->m_pBitmap->GetWidth()*m_fScale);
sizeTotal.cy = (long)(pDoc->m_pBitmap->GetHeight()*m_fScale);
CSize sizePage = (sizeTotal.cx/2, sizeTotal.cy/2);
CSize sizeLine = (sizeTotal.cx/50, sizeTotal.cy/50);
SetScrollSizes(MM_TEXT, sizeTotal, sizePage, sizeLine);
}
/////////////////////////////////////////////////////////////////////////////
// CImageView printing
BOOL CImageView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CImageView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CImageView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CImageView diagnostics
#ifdef _DEBUG
void CImageView::AssertValid() const
{
CScrollView::AssertValid();
}
void CImageView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CImageDoc* CImageView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageDoc)));
return (CImageDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImageView message handlers
void CImageView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
}
void CImageView::OnDrawCircle()
{
// TODO: Add your command handler code here
type=CIRCLE;
}
void CImageView::OnUpdateDrawCircle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
InvalidateDrawMenu(pCmdUI);
pCmdUI->SetCheck(type==CIRCLE);
}
void CImageView::OnDrawLine()
{
// TODO: Add your command handler code here
type=LINE;
}
void CImageView::OnUpdateDrawLine(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
InvalidateDrawMenu(pCmdUI);
pCmdUI->SetCheck(type==LINE);
}
void CImageView::OnDrawRectancle()
{
// TODO: Add your command handler code here
type=RECTANCLE;
}
void CImageView::OnUpdateDrawRectancle(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
InvalidateDrawMenu(pCmdUI);
pCmdUI->SetCheck(type==RECTANCLE);
}
void CImageView::OnDrawText()
{
// TODO: Add your command handler code here
type=TEXT;
}
void CImageView::OnUpdateDrawText(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
InvalidateDrawMenu(pCmdUI);
pCmdUI->SetCheck(type==TEXT);
}
void CImageView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if ( m_pEdit )
{
if( m_pPreText )
{
//get the last text value
m_pEdit->GetWindowText( m_pPreText->m_strText );
}
delete m_pEdit;
m_pEdit = NULL;
}
switch(type)
{
case LINE:
m_pShapeCur=new CLine();
break;
case CIRCLE:
m_pShapeCur=new CCircle();
break;
case RECTANCLE:
m_pShapeCur=new CRectangle();
break;
case TEXT:
m_pPreText=new CText();
m_pShapeCur=m_pPreText ;
m_pEdit = new CEdit;
m_pEdit->Create( WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
CRect(point.x, point.y, point.x+200, point.y+50), this, 1);
break;
default:
// AfxMessageBox("Unkown type!");
return ;
}
GetDocument()->SetModifiedFlag();
// GetDocument()->m_ShapeList.AddTail(m_pShapeCur);
SetCapture();
m_pDC = new CClientDC(this);
OnPrepareDC(m_pDC);
m_pDC->DPtoLP(&point);
m_ptCurrent = point;
m_ptPrev = m_ptCurrent;
m_pShapeCur->SetStart(point);
m_pShapeCur->SetWidth(GetDocument()->GetCurPenWidth());
m_pShapeCur->SetColor(GetDocument()->GetCurColor());
// pDC = new CDC();
// pDC->CreateCompatibleDC(NULL);
// pDC->SelectObject(GetDocument()->pBitmap);
m_pDC->SelectObject(GetDocument()->GetPen());
m_pDC->SelectStockObject(NULL_BRUSH);
m_pDC->MoveTo(m_ptCurrent);
CScrollView::OnLButtonDown(nFlags, point);
}
void CImageView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(GetCapture()!=this)
return;
m_pDC->DPtoLP(&point);
m_pShapeCur->SetEnd(point);
GetDocument()->m_ShapeList.AddTail(m_pShapeCur);
m_pShapeCur->Draw(m_pDC);
InvalidateRect(&CRect(m_ptCurrent, m_ptPrev));
delete m_pDC;
ReleaseCapture();
CScrollView::OnLButtonUp(nFlags, point);
}
void CImageView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar *pStatus = &(pFrame->m_wndStatusBar);
//set mouse coordinate as the second statusbar text
if(pStatus)
{
str.Format("(%d , %d)", point.x, point.y);
pStatus->SetPaneText(1, str);
}
if(GetCapture()!=this)
return;
m_pDC->DPtoLP(&point);
int oldMod = m_pDC->SetROP2( R2_NOTXORPEN );
m_pShapeCur->SetEnd(m_ptPrev);
m_pShapeCur->Draw(m_pDC);
m_pDC->SetROP2(oldMod);
m_pShapeCur->SetEnd(point);
m_pShapeCur->Draw(m_pDC);
// InvalidateRect(&CRect(m_ptCurrent, m_ptPrev));
m_ptPrev = point;
CView::OnMouseMove(nFlags, point);
}
void CImageView::OnZoomIn2()
{
// TODO: Add your command handler code here
m_fScale = 2;
type=DISENABLE;
OnInitialUpdate();
InvalidateRect(NULL);
}
void CImageView::OnZoomIn4()
{
// TODO: Add your command handler code here
m_fScale = 4;
type=DISENABLE;
OnInitialUpdate();
InvalidateRect(NULL);
}
void CImageView::OnZoomNormal()
{
// TODO: Add your command handler code here
m_fScale = 1;
OnInitialUpdate();
InvalidateRect(NULL);
}
void CImageView::OnZoomOut2()
{
// TODO: Add your command handler code here
m_fScale = 0.5;
type=DISENABLE;
OnInitialUpdate();
InvalidateRect(NULL);
}
void CImageView::OnZoomOut4()
{
// TODO: Add your command handler code here
m_fScale = 0.25;
type=DISENABLE;
OnInitialUpdate();
InvalidateRect(NULL);
}
void CImageView::SetScale(float scale)
{
m_fScale = scale;
}
void CImageView::InvalidateDrawMenu(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_fScale==1);
}
BOOL CImageView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// CRect rcClip;
// pDC->GetClipBox(&rcClip);
// pDC->PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height( ) , PATCOPY );
return CScrollView::OnEraseBkgnd(pDC);
// OnDraw(pDC);
// return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -