?? drawobj.cpp
字號(hào):
// DrawObj.cpp: implementation of the CDrawObj class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DrawCli.h"
#include "DrawObj.h"
#include "drawdoc.h"
#include "drawvw.h"
#include "cntritem.h"
#include "rectdlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CDrawObj, CObject, 0)
CDrawObj::CDrawObj()
{
}
CDrawObj::~CDrawObj()
{
}
CDrawObj::CDrawObj(const CRect& position)
{
m_position = position;
m_pDocument = NULL;
m_bPen = TRUE;
m_logpen.lopnStyle = PS_INSIDEFRAME;
m_logpen.lopnWidth.x = 2;
m_logpen.lopnWidth.y = 2;
m_logpen.lopnColor = RGB(0, 0, 0);
m_bBrush = TRUE;
m_logbrush.lbStyle = BS_SOLID;
m_logbrush.lbColor = RGB(192, 192, 192);
m_logbrush.lbHatch = HS_HORIZONTAL;
m_nOrder=0;
m_nType=0;
}
void CDrawObj::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
{
ar << m_position;
ar << (WORD)m_bPen;
ar.Write(&m_logpen, sizeof(LOGPEN));
ar << (WORD)m_bBrush;
ar.Write(&m_logbrush, sizeof(LOGBRUSH));
ar << m_nOrder;
ar << m_nType;
}
else
{
// get the document back pointer from the archive
m_pDocument = (CDrawDoc*)ar.m_pDocument;
ASSERT_VALID(m_pDocument);
ASSERT_KINDOF(CDrawDoc, m_pDocument);
WORD wTemp;
ar >> m_position;
ar >> wTemp; m_bPen = (BOOL)wTemp;
ar.Read(&m_logpen,sizeof(LOGPEN));
ar >> wTemp; m_bBrush = (BOOL)wTemp;
ar.Read(&m_logbrush, sizeof(LOGBRUSH));
ar >> m_nOrder;
ar >> m_nType;
}
}
void CDrawObj::Remove()
{
delete this;
}
void CDrawObj::Draw(CDC*)
{
}
void CDrawObj::DrawTracker(CDC* pDC, TrackerState state)
{
ASSERT_VALID(this);
switch (state)
{
case normal:
break;
case selected:
case active:
{
int nHandleCount = GetHandleCount();
for (int nHandle = 1; nHandle <= nHandleCount; nHandle += 1)
{
CPoint handle = GetHandle(nHandle);
pDC->PatBlt(handle.x - 3, handle.y - 3, 7, 7, DSTINVERT);
}
}
break;
}
}
// position is in logical
void CDrawObj::MoveTo(const CRect& position, CDrawView* pView)
{
ASSERT_VALID(this);
if (position == m_position)
return;
if (pView == NULL)
{
Invalidate();
m_position = position;
Invalidate();
}
else
{
pView->InvalObj(this);
m_position = position;
pView->InvalObj(this);
}
m_pDocument->SetModifiedFlag();
}
// Note: if bSelected, hit-codes start at one for the top-left
// and increment clockwise, 0 means no hit.
// If !bSelected, 0 = no hit, 1 = hit (anywhere)
// point is in logical coordinates
int CDrawObj::HitTest(CPoint point, CDrawView* pView, BOOL bSelected)
{
ASSERT_VALID(this);
ASSERT(pView != NULL);
if (bSelected)
{
int nHandleCount = GetHandleCount();
for (int nHandle = 1; nHandle <= nHandleCount; nHandle += 1)
{
// GetHandleRect returns in logical coords
CRect rc = GetHandleRect(nHandle,pView);
if (point.x >= rc.left && point.x < rc.right &&
point.y <= rc.top && point.y > rc.bottom)
return nHandle;
}
}
else
{
if (point.x >= m_position.left && point.x < m_position.right &&
point.y <= m_position.top && point.y > m_position.bottom)
return 1;
}
return 0;
}
// rect must be in logical coordinates
BOOL CDrawObj::Intersects(const CRect& rect)
{
ASSERT_VALID(this);
CRect fixed = m_position;
fixed.NormalizeRect();
CRect rectT = rect;
rectT.NormalizeRect();
return !(rectT & fixed).IsRectEmpty();
}
int CDrawObj::GetHandleCount()
{
ASSERT_VALID(this);
return 8;
}
// returns logical coords of center of handle
CPoint CDrawObj::GetHandle(int nHandle)
{
ASSERT_VALID(this);
int x, y, xCenter, yCenter;
// this gets the center regardless of left/right and top/bottom ordering
xCenter = m_position.left + m_position.Width() / 2;
yCenter = m_position.top + m_position.Height() / 2;
switch (nHandle)
{
default:
ASSERT(FALSE);
case 1:
x = m_position.left;
y = m_position.top;
break;
case 2:
x = xCenter;
y = m_position.top;
break;
case 3:
x = m_position.right;
y = m_position.top;
break;
case 4:
x = m_position.right;
y = yCenter;
break;
case 5:
x = m_position.right;
y = m_position.bottom;
break;
case 6:
x = xCenter;
y = m_position.bottom;
break;
case 7:
x = m_position.left;
y = m_position.bottom;
break;
case 8:
x = m_position.left;
y = yCenter;
break;
}
return CPoint(x, y);
}
// return rectange of handle in logical coords
CRect CDrawObj::GetHandleRect(int nHandleID, CDrawView* pView)
{
ASSERT_VALID(this);
ASSERT(pView != NULL);
CRect rect;
// get the center of the handle in logical coords
CPoint point = GetHandle(nHandleID);
// convert to client/device coords
pView->DocToClient(point);
// return CRect of handle in device coords
rect.SetRect(point.x-3, point.y-3, point.x+3, point.y+3);
pView->ClientToDoc(rect);
return rect;
}
HCURSOR CDrawObj::GetHandleCursor(int nHandle)
{
ASSERT_VALID(this);
LPCTSTR id;
switch (nHandle)
{
default:
ASSERT(FALSE);
case 1:
case 5:
id = IDC_SIZENWSE;
break;
case 2:
case 6:
id = IDC_SIZENS;
break;
case 3:
case 7:
id = IDC_SIZENESW;
break;
case 4:
case 8:
id = IDC_SIZEWE;
break;
}
return AfxGetApp()->LoadStandardCursor(id);
}
// point must be in logical
void CDrawObj::MoveHandleTo(int nHandle, CPoint point, CDrawView* pView)
{
ASSERT_VALID(this);
CRect position = m_position;
switch (nHandle)
{
default:
ASSERT(FALSE);
case 1:
position.left = point.x;
position.top = point.y;
break;
case 2:
position.top = point.y;
break;
case 3:
position.right = point.x;
position.top = point.y;
break;
case 4:
position.right = point.x;
break;
case 5:
position.right = point.x;
position.bottom = point.y;
break;
case 6:
position.bottom = point.y;
break;
case 7:
position.left = point.x;
position.bottom = point.y;
break;
case 8:
position.left = point.x;
break;
}
MoveTo(position, pView);
}
void CDrawObj::Invalidate()
{
ASSERT_VALID(this);
m_pDocument->UpdateAllViews(NULL, HINT_UPDATE_DRAWOBJ, this);
}
CDrawObj* CDrawObj::Clone(CDrawDoc* pDoc)
{
ASSERT_VALID(this);
CDrawObj* pClone = new CDrawObj(m_position);
pClone->m_bPen = m_bPen;
pClone->m_logpen = m_logpen;
pClone->m_bBrush = m_bBrush;
pClone->m_logbrush = m_logbrush;
pClone->m_nOrder = m_nOrder;
pClone->m_nType = m_nType;
ASSERT_VALID(pClone);
if (pDoc != NULL)
pDoc->Add(pClone);
return pClone;
}
void CDrawObj::OnEditProperties()
{
ASSERT_VALID(this);
CPropertySheet sheet( _T("對(duì)象顯示屬性") );
CRectDlg dlg;
dlg.m_bNoFill = !m_bBrush;
dlg.m_penSize = m_bPen ? m_logpen.lopnWidth.x : 0;
dlg.m_LineColor = m_logpen.lopnColor;
dlg.m_FillColor = m_logbrush.lbColor;
dlg.m_nOrd=m_nOrder;
dlg.m_nTyp=m_nType;
sheet.AddPage( &dlg );
if (sheet.DoModal() != IDOK)
return;
m_bBrush = !dlg.m_bNoFill;
m_bPen = dlg.m_penSize > 0;
m_logbrush.lbColor = dlg.m_FillColor;
if (m_bPen)
{
m_logpen.lopnWidth.x = dlg.m_penSize;
m_logpen.lopnWidth.y = dlg.m_penSize;
m_logpen.lopnColor = dlg.m_LineColor;
}
m_nOrder=dlg.m_nOrd;
m_nType=dlg.m_nTyp;
Invalidate();
m_pDocument->SetModifiedFlag();
}
void CDrawObj::OnOpen(CDrawView* /*pView*/ )
{
OnEditProperties();
}
void CDrawObj::SetLineColor(COLORREF color)
{
ASSERT_VALID(this);
m_logpen.lopnColor = color;
Invalidate();
m_pDocument->SetModifiedFlag();
}
void CDrawObj::SetFillColor(COLORREF color)
{
ASSERT_VALID(this);
m_logbrush.lbColor = color;
Invalidate();
m_pDocument->SetModifiedFlag();
}
#ifdef _DEBUG
void CDrawObj::AssertValid()
{
ASSERT(m_position.left <= m_position.right);
ASSERT(m_position.bottom <= m_position.top);
}
#endif
////////////////////////////////////////////////////////////////////////////
// CDrawRect
IMPLEMENT_SERIAL(CDrawRect, CDrawObj, 0)
CDrawRect::CDrawRect()
{
}
CDrawRect::CDrawRect(const CRect& position)
: CDrawObj(position)
{
ASSERT_VALID(this);
m_nShape = rectangle;
m_roundness.x = 16;
m_roundness.y = 16;
}
void CDrawRect::Serialize(CArchive& ar)
{
ASSERT_VALID(this);
CDrawObj::Serialize(ar);
if (ar.IsStoring())
{
ar << (WORD) m_nShape;
ar << m_roundness;
}
else
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -