📄 lwq6231view.cpp
字号:
// LWQ6231View.cpp : implementation of the CLWQ6231View class
//
#include "stdafx.h"
#include "LWQ6231.h"
#include "LWQ6231Doc.h"
#include "LWQ6231View.h"
#include "Draw.h"
#include "bitmap.h"
#include <windowsx.h>
#include "structure.h"
#include "TextDlg.h"
#define WIDTH_THIN 1
#define WIDTH_NORMAL 3
#define WIDTH_WIDE 5
#define UD_WHITE 0xffffff
#define UD_BLACK 0
#define UD_YELLOW 0x00ffff
#define UD_PINK 0xff80ff
#define UD_CYAN 0xffff00
#define UD_GRAY 0x4080
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View
IMPLEMENT_DYNCREATE(CLWQ6231View, CView)
BEGIN_MESSAGE_MAP(CLWQ6231View, CView)
//{{AFX_MSG_MAP(CLWQ6231View)
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_UPDATE_COMMAND_UI(IDT_ARROW, OnUpdateArrow)
ON_UPDATE_COMMAND_UI(IDT_LINE, OnUpdateLine)
ON_UPDATE_COMMAND_UI(IDT_RECTANGLE, OnUpdateRectangle)
ON_UPDATE_COMMAND_UI(IDT_ELLIPSE, OnUpdateEllipse)
ON_UPDATE_COMMAND_UI(IDT_CIRCLE, OnUpdateCircle)
ON_UPDATE_COMMAND_UI(IDT_PLINE, OnUpdatePline)
ON_UPDATE_COMMAND_UI(IDT_FONT, OnUpdateFont)
ON_COMMAND(IDT_LINE, OnLine)
ON_COMMAND(IDT_RECTANGLE, OnRectangle)
ON_COMMAND(IDT_ELLIPSE, OnEllipse)
ON_COMMAND(IDT_CIRCLE, OnCircle)
ON_COMMAND(IDT_FONT, OnFont)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_UPDATE_COMMAND_UI(IDT_DELETE, OnUpdateDelete)
ON_COMMAND(IDT_SELECT, OnSelect)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_COLOR_BLACK, OnColorBlack)
ON_COMMAND(ID_COLOR_CYAN, OnColorCyan)
ON_COMMAND(ID_COLOR_GRAY, OnColorGray)
ON_COMMAND(ID_COLOR_GREEN, OnColorGreen)
ON_COMMAND(ID_COLOR_PINK, OnColorPink)
ON_COMMAND(ID_COLOR_RED, OnColorRed)
ON_COMMAND(ID_COLOR_WHITE, OnColorWhite)
ON_COMMAND(ID_COLOR_YELLOW, OnColorYellow)
ON_COMMAND(ID_COLOR_BLUE, OnColorBlue)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_UPDATE_COMMAND_UI(IDT_SELECT, OnUpdateSelect)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_WM_PAINT()
ON_COMMAND(IDT_CURVE, OnCurve)
ON_COMMAND(IDT_POLY, OnPoly)
ON_WM_LBUTTONDBLCLK()
ON_COMMAND(ID_WIDTH_NORMAL, OnWidthNormal)
ON_COMMAND(ID_WIDTH_THIN, OnWidthThin)
ON_COMMAND(ID_WIDTH_WIDE, OnWidthWide)
ON_COMMAND(ID_FILL_FALSE, OnFillFalse)
ON_COMMAND(ID_FILL_TRUE, OnFillTrue)
ON_UPDATE_COMMAND_UI(ID_FILL_TRUE, OnUpdateFillTrue)
ON_UPDATE_COMMAND_UI(ID_FILL_FALSE, OnUpdateFillFalse)
ON_UPDATE_COMMAND_UI(ID_WIDTH_NORMAL, OnUpdateWidthNormal)
ON_UPDATE_COMMAND_UI(ID_WIDTH_THIN, OnUpdateWidthThin)
ON_UPDATE_COMMAND_UI(ID_WIDTH_WIDE, OnUpdateWidthWide)
ON_COMMAND(ID_EXAMINE_COLOR, OnExamineColor)
ON_COMMAND(ID_EXAMINE_TOOL, OnExamineTool)
ON_COMMAND(grid, Ongrid)
ON_UPDATE_COMMAND_UI(ID_COLOR_RED, OnUpdateColorRed)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View construction/destruction
CLWQ6231View::CLWQ6231View()
{
// TODO: add construction code here
m_bDrawing=false;
m_nMouseMode = IDT_LINE;
m_usrCurrentObject = NULL;
m_nCurrentColor = UD_RED;
m_iPenWidth = WIDTH_THIN;
m_bFill = false;
m_pSelect = NULL;
m_bClip = false;
virtualline=false;
m_pStack =new Stack(4);
m_bFirstSave = true;
showgrid=false;
}
CLWQ6231View::~CLWQ6231View()
{
if(m_pSelect)
{
delete m_pSelect;
m_pSelect = NULL;
}
if(m_pStack)
{
delete m_pStack;
m_pStack = NULL;
}
if(m_usrCurrentObject)
{
delete m_usrCurrentObject;
m_usrCurrentObject = NULL;
}
}
BOOL CLWQ6231View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//加载自定义光标资源
m_hcurCross = (HCURSOR)::LoadImage(cs.hInstance,
MAKEINTRESOURCE(IDC_USERDRAW), IMAGE_CURSOR,
32, 32, LR_DEFAULTCOLOR);
//加载光标的类方法(与上述方法功能类似)
CWinApp* pApp = ::AfxGetApp();//获得当前CWinApp对象指针
m_hcurMoving = pApp->LoadCursor(IDC_USERMOVING);
m_hcurArrow = pApp->LoadCursor(IDC_USERARROW);
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View drawing
void CLWQ6231View::OnDraw(CDC* pDC)
{
CLWQ6231Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// CClient dc(this);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View printing
BOOL CLWQ6231View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CLWQ6231View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CLWQ6231View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View diagnostics
#ifdef _DEBUG
void CLWQ6231View::AssertValid() const
{
CView::AssertValid();
}
void CLWQ6231View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CLWQ6231Doc* CLWQ6231View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLWQ6231Doc)));
return (CLWQ6231Doc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLWQ6231View message handlers
void CLWQ6231View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC* pDC = GetDC();//获得DC
OnPrepareDC(pDC);//设置DC的滚动属性,与ScollView的滚动有关
pDC->DPtoLP(&point);//转换当前点为逻辑位置坐标
CLWQ6231Doc* pDoc = GetDocument();
CRect client;
GetClientRect(&client);//获得客户区范围
ClientToScreen(&client);//转化为屏幕坐标
::ClipCursor(&client);//锁定鼠标移动范围
switch(m_nMouseMode)
{
case IDT_SELECT:
if(!m_pSelect)//如果没选中
{
m_bDrawing = true;
m_pSelect = new CDrawSelect(m_nCurrentColor);
m_pSelect->NewPoint(point.x, point.y);
break;
}
else//如果选中
{
CDC * pDC = GetDC();
//如果以前有虚线则清除
if (virtualline)
m_pSelect->Clear(pDC);
m_bDrawing = false;
if (m_pSelect->isin(point))//如果鼠标进入
{
m_pSelect->maponmouse=true;
m_pSelect->p_maponmouse.x=point.x;
m_pSelect->p_maponmouse.y=point.y;
if (!(m_pSelect->copied))//如果没有存储两个图
{
m_pSelect->maponmouse=true;
m_pSelect->copied=true;
//m_bClip = true;
Selected_Copy();
Back_CutCopy();
ReleaseDC(pDC);
}
break;
}
else//如果落在选中的矩形外边
{
//SaveInStack();
virtualline=false;
delete m_pSelect;
m_pSelect = NULL;
break;
}
}
case IDT_LINE:
m_bDrawing = true;
m_usrCurrentObject = new CDrawLine(m_nCurrentColor, m_iPenWidth);
m_usrCurrentObject->NewPoint(point.x, point.y);
break;
case IDT_CURVE:
m_bDrawing = true;
m_usrCurrentObject = new CDrawCurve(m_nCurrentColor, m_iPenWidth);
m_usrCurrentObject->NewPoint(point.x, point.y);
break;
case IDT_RECTANGLE:
m_bDrawing = true;
m_usrCurrentObject = new CDrawRect(m_nCurrentColor, m_iPenWidth, m_bFill);
m_usrCurrentObject->NewPoint(point.x, point.y);
break;
case IDT_ELLIPSE:
m_bDrawing = true;
m_usrCurrentObject = new CDrawEllipse(m_nCurrentColor, m_iPenWidth, m_bFill);
m_usrCurrentObject->NewPoint(point.x, point.y);
break;
case IDT_CIRCLE:
m_bDrawing = true;
m_usrCurrentObject = new CDrawCircle(m_nCurrentColor, m_iPenWidth, m_bFill);
m_usrCurrentObject->NewPoint(point.x, point.y);
break;
case IDT_POLY:
if(m_usrCurrentObject)
{
m_usrCurrentObject->AddPoint(point.x, point.y);
// if(!m_nMoveMode)
// {//输入端点超过20个
// OnRButtonDown(nFlags, point);
// }
}
else
{
m_bDrawing = true;
m_usrCurrentObject = new CDrawPoly(m_nCurrentColor, m_iPenWidth);
m_usrCurrentObject->NewPoint(point.x, point.y);
}
break;
}
if ((m_pSelect)&&(m_nMouseMode!=IDT_SELECT))
{
//SaveInStack();
if (virtualline)
m_pSelect->Clear(GetDC());
delete m_pSelect;
m_pSelect = NULL;
}
ReleaseDC(pDC);//释放DC资源
CView::OnLButtonDown(nFlags, point);
}
void CLWQ6231View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC* pDC = GetDC();
OnPrepareDC(pDC);
pDC->DPtoLP(&point);
if(m_bDrawing && m_usrCurrentObject)
{
m_usrCurrentObject->MoveAt(pDC, point.x, point.y);
}
if( m_pSelect && m_nMouseMode==IDT_SELECT)//如果是选中状态
if(m_bDrawing )//如果在画虚框
m_pSelect->MoveAt(pDC, point.x, point.y);
else
if (m_pSelect->maponmouse) //如果拖动选中则移动选中的部分
{
CDC dc;
CClientDC pdc(this);
if(!dc.CreateCompatibleDC(pDC))
return;
BITMAP bm;
if(showgrid)
Grid();
// Sleep(100);
m_pSelect->backmap.GetBitmap(&bm);
CBitmap *pOldBitmap=dc.SelectObject(&m_pSelect->backmap);
pdc.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY);
m_pSelect->map_select.GetBitmap(&bm);
pOldBitmap=dc.SelectObject(&m_pSelect->map_select);
// Sleep(100);
pdc.BitBlt(m_pSelect->GetX()+point.x-m_pSelect->p_maponmouse.x
, m_pSelect->GetY()+point.y-m_pSelect->p_maponmouse.y,
bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY);
dc.SelectObject(&pOldBitmap);
if(showgrid)
Grid();
}
ReleaseDC(pDC);//释放DC资源
CView::OnMouseMove(nFlags, point);
}
void CLWQ6231View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC* pDC = GetDC();//获得DC
OnPrepareDC(pDC);//设置DC的滚动属性,与ScollView的滚动有关
pDC->DPtoLP(&point);//转换当前点为逻辑位置坐标
CLWQ6231Doc* pDoc = GetDocument();
switch(m_nMouseMode)
{
case IDT_LINE:
case IDT_RECTANGLE:
case IDT_ELLIPSE:
case IDT_CIRCLE:
case IDT_CURVE:
m_usrCurrentObject->Draw(pDC);
SaveInStack();
::ClipCursor(NULL);//释放鼠标锁定
m_bDrawing = false;
delete m_usrCurrentObject;
m_usrCurrentObject = NULL;
break;
case IDT_SELECT:
::ClipCursor(NULL);//释放鼠标锁定
if (m_pSelect)
if (m_bDrawing)
{
m_bDrawing=false;
virtualline=true;
}
else//不在画虚框则释放鼠标
{
if (m_pSelect->maponmouse==true)
{
m_pSelect->maponmouse=false;
long w=m_pSelect->GetWidth();
long h=m_pSelect->GetHeight();
long x=m_pSelect->GetX()+point.x-m_pSelect->p_maponmouse.x;
long y=m_pSelect->GetY()+point.y-m_pSelect->p_maponmouse.y;
m_pSelect->Set(pDC,x,y,w,h);
m_bDrawing=false;
virtualline=true;
SaveInStack();
}
}
break;
}
ReleaseDC(pDC);//释放DC资源
CView::OnLButtonUp(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -