⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawdoc.cpp

📁 这源代码是书本《visual c++.net MFC 类库应用详解》的
💻 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 + -