📄 drawdoc.cpp
字号:
// DrawDoc.cpp : CDrawDoc 类的实现
//
#include "stdafx.h"
#include "Draw.h"
#include "PenDialog.h"
#include "DrawDoc.h"
#include "afxadv.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
IMPLEMENT_SERIAL(CLine,CObject,1)
CLine::CLine(CPoint pStart,CPoint pEnd,int Width,int Style,COLORREF Color)
{
m_pStart=pStart;
m_pEnd=pEnd;
m_pWidth=Width;
m_pStyle=Style;
m_pColor=Color;
}
void CLine::Drawing(CDC *pDC)
{
CPen NewPen,*pOldPen;
switch(m_pStyle)
{
case PEN_STYLE_SOLID:
NewPen.CreatePen(PS_SOLID,m_pWidth,m_pColor);
break;
case PEN_STYLE_DASH:
NewPen.CreatePen(PS_DASH,m_pWidth,m_pColor);
break;
case PEN_STYLE_DOT:
NewPen.CreatePen(PS_DOT,m_pWidth,m_pColor);
break;
}
pOldPen=pDC->SelectObject(&NewPen);
pDC->MoveTo(m_pStart);
pDC->LineTo(m_pEnd);
pDC->SelectObject(pOldPen);
}
void CLine::Serialize(CArchive &ar)
{
if(ar.IsStoring())
ar<<m_pStart.x<<m_pStart.y<<m_pEnd.x<<m_pEnd.y
<<m_pWidth<<m_pStyle<<m_pColor;
else
ar>>m_pStart.x>>m_pStart.y>>m_pEnd.x>>m_pEnd.y
>>m_pWidth>>m_pStyle>>m_pColor;
}
// CDrawDoc
IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)
BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_OPTIONS_PEN, OnOptionsPen)
ON_COMMAND(ID_OPTIONS_COLOR, OnOptionsColor)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_SELECT, OnEditSelect)
ON_COMMAND(ID_EDIT_DRAW, OnEditDraw)
ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectall)
END_MESSAGE_MAP()
// CDrawDoc 构造/销毁
CDrawDoc::CDrawDoc()
{
// TODO:在此添加一次性构造代码
m_pWidth=1;
m_pStyle=PEN_STYLE_SOLID;
m_pColor=RGB(0,0,0);
m_SelectRect.left = 0;
m_SelectRect.top = 0;
m_SelectRect.right = 0;
m_SelectRect.bottom = 0;
IsSelect=false;
}
CDrawDoc::~CDrawDoc()
{
}
BOOL CDrawDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO:在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}
// CDrawDoc 序列化
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO:在此添加存储代码
}
else
{
// TODO:在此添加加载代码
}
m_ObArray.Serialize(ar);
}
// CDrawDoc 诊断
#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDrawDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
void CDrawDoc::AddDraw (CPoint pStart,CPoint pEnd,int Width,int Style,COLORREF Color)
{
CLine *pLine=new CLine(pStart,pEnd,Width,Style,Color);
m_ObArray.Add(pLine);
SetModifiedFlag();
}
CLine *CDrawDoc::GetDraw(int index)
{
if(index<0||index>m_ObArray.GetUpperBound())return 0;
return(CLine *)m_ObArray.GetAt(index);
}
int CDrawDoc::GetDrawNumber()
{
return m_ObArray.GetSize();
}
// CDrawDoc 命令
void CDrawDoc::DeleteContents()
{
// TODO: 在此添加专用代码和/或调用基类
int index;
index=m_ObArray.GetSize();
while(index--)
delete m_ObArray.GetAt(index);
m_ObArray.RemoveAll();
CDocument::DeleteContents();
}
void CDrawDoc::OnEditUndo()
{
// TODO: 在此添加命令处理程序代码
int index;
index=m_ObArray.GetUpperBound();
if(index>=0)
{
delete m_ObArray.GetAt(index);
m_ObArray.RemoveAt(index);
}
UpdateAllViews(NULL);
SetModifiedFlag();
}
void CDrawDoc::OnUpdateEditUndo(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->Enable(m_ObArray.GetSize());
}
void CDrawDoc::OnOptionsPen()
{
// TODO: 在此添加命令处理程序代码
CPenDialog PenDialog;
PenDialog.m_pWidth=m_pWidth;
PenDialog.m_pStyle=m_pStyle;
if(PenDialog.DoModal()==IDOK)
{
m_pWidth=PenDialog.m_pWidth;
m_pStyle=PenDialog.m_pStyle;
}
}
void CDrawDoc::OnOptionsColor()
{
// TODO: 在此添加命令处理程序代码
CColorDialog ColorDialog;
if(ColorDialog.DoModal()==IDOK)
m_pColor=ColorDialog.GetColor();
}
void CDrawDoc::OnEditCopy()
{
// TODO: 在此添加命令处理程序代码
int iCount = m_SelectObArray.GetSize();// 获取用户当前选择的项数
ASSERT(iCount > 0);
// 创建一个共享内存文件
CSharedFile mf(GMEM_MOVEABLE|GMEM_DDESHARE|GMEM_ZEROINIT);
// 创建一个用于保存的与共享内存文件相连的档案对象
CArchive ar(&mf, CArchive::store);
m_SelectObArray.Serialize(ar); //序列化对象数组中的各选择项
ar.Close();
HGLOBAL hMem = mf.Detach();
if (!hMem) return;
m_SelectObArray.RemoveAll();
HWND hWnd=(AfxGetApp()->m_pMainWnd)->GetSafeHwnd();
OpenClipboard(hWnd); //打开剪贴板
EmptyClipboard(); //清空剪贴板
SetClipboardData(theApp.m_uiMyDrawClipFormat, hMem);//将设置剪贴板
CloseClipboard(); //关闭剪贴板
}
void CDrawDoc::OnUpdateEditCopy(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
int i=m_SelectObArray.GetSize();
pCmdUI->Enable(i>0?true:false); // 使Copy菜单可用或不可用
}
void CDrawDoc::OnEditPaste()
{
// TODO: 在此添加命令处理程序代码
HWND hWnd=(AfxGetApp()->m_pMainWnd)->GetSafeHwnd();
OpenClipboard(hWnd);
HGLOBAL hMem = ::GetClipboardData(theApp.m_uiMyDrawClipFormat); //获取剪贴板数据
if (!hMem)
{
CloseClipboard();
return;
}
CSharedFile mf; // 创建一个共享内存文件
mf.SetHandle(hMem); // 把共享内存文件连接到一个内存块
// 创建一个用于装载的与共享内存文件相连的档案对象
CArchive ar(&mf, CArchive::load);
CObArray PasteArray; // 创建一个对象数组
PasteArray.Serialize(ar); //序列化对象链表中的各选择项
ar.Close();
mf.Detach();
CloseClipboard();
// 把剪贴板的数据加入到文档并清空剪贴板
int n=PasteArray.GetSize();
for(int i=0;i<n;i++)
{
CLine *p=(CLine *)PasteArray.GetAt(i);
CPoint sp,ep;
sp.x=p->m_pStart.x+20;// 新直线在原直线右下方
sp.y=p->m_pStart.y+20;
ep.x=p->m_pEnd.x+20;
ep.y=p->m_pEnd.y+20;
CLine *pLine=new CLine(sp,ep,p->m_pWidth,p->m_pStyle,p->m_pColor);
m_ObArray.Add(pLine);
}
PasteArray.RemoveAll();
SetModifiedFlag();
UpdateAllViews(NULL);
}
void CDrawDoc::OnUpdateEditPaste(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
HWND hWnd=(AfxGetApp()->m_pMainWnd)->GetSafeHwnd();
OpenClipboard(hWnd);
UINT uiFmt = 0;
while (uiFmt = EnumClipboardFormats(uiFmt)) // 遍历剪贴板的数据格式
{
//检查剪贴板是否有我们注册的数据格式
if (uiFmt == theApp.m_uiMyDrawClipFormat)
{
CloseClipboard();
pCmdUI->Enable(true); // 使Paste菜单可用或不可用
return;
}
}
pCmdUI->Enable(false);
CloseClipboard();
}
void CDrawDoc::OnEditSelect()
{
// TODO: 在此添加命令处理程序代码
IsSelect=true;
}
void CDrawDoc::OnEditSelectall()
{
// TODO: 在此添加命令处理程序代码
int minx=1024,miny=800,maxx=0,maxy=0;
IsSelect=true;
int index=GetDrawNumber();
for(int i=0;i<index;i++)
{
CLine *pLine=GetDraw(i);
m_SelectObArray.Add(pLine);
if(pLine->m_pStart.x<minx)
minx=pLine->m_pStart.x;
if(pLine->m_pEnd.x<minx)
minx=pLine->m_pEnd.x;
if(pLine->m_pStart.x>maxx)
maxx=pLine->m_pStart.x;
if(pLine->m_pEnd.x>maxx)
maxx=pLine->m_pEnd.x;
if(pLine->m_pStart.y<miny)
miny=pLine->m_pStart.y;
if(pLine->m_pEnd.y<miny)
miny=pLine->m_pEnd.y;
if(pLine->m_pStart.y>maxy)
maxy=pLine->m_pStart.y;
if(pLine->m_pEnd.y>maxy)
maxy=pLine->m_pEnd.y;
}
m_SelectRect.left = minx;
m_SelectRect.top = miny;
m_SelectRect.right = maxx;
m_SelectRect.bottom = maxy;
UpdateAllViews(NULL);
}
void CDrawDoc::OnEditDraw()
{
// TODO: 在此添加命令处理程序代码
IsSelect=false;
m_SelectRect.left = 0;
m_SelectRect.top = 0;
m_SelectRect.right = 0;
m_SelectRect.bottom = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -