3,405
社区成员
发帖
与我相关
我的任务
分享
void CMyView::OnLButtonDown()
{
switch(m_Cmd)
{
case Cmd_Browse:
{
……
break;
}
case Cmd_Draw_Line:
{
……
break;
}
default:
break;
}
}
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
pTool->OnLButtonDown(this, nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
pTool->OnLButtonUp(this, nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bActive)
return;
CDrawTool* pTool = CDrawTool::FindTool(CDrawTool::c_drawShape);
if (pTool != NULL)
pTool->OnMouseMove(this, nFlags, point);
}
// 图形类型枚举变量
enum DrawShape
{
selection,
line,
rect,
roundRect,
ellipse,
poly
};
// 绘制工具基类
class CDrawTool
{
// Constructors
public:
CDrawTool(DrawShape nDrawShape);
// Overridables
virtual void OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnEditProperties(CDrawView* pView);
virtual void OnCancel();
// Attributes
DrawShape m_drawShape;
static CDrawTool* FindTool(DrawShape drawShape);
static CPtrList c_tools;
static CPoint c_down;
static UINT c_nDownFlags;
static CPoint c_last;
static DrawShape c_drawShape;
};
// 绘制矩形类
class CRectTool : public CDrawTool
{
// Constructors
public:
CRectTool(DrawShape drawShape);
// Implementation
virtual void OnLButtonDown(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnLButtonDblClk(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnLButtonUp(CDrawView* pView, UINT nFlags, const CPoint& point);
virtual void OnMouseMove(CDrawView* pView, UINT nFlags, const CPoint& point);
};
CDrawTool* CDrawTool::FindTool(DrawShape drawShape)
{
POSITION pos = c_tools.GetHeadPosition();
while (pos != NULL)
{
CDrawTool* pTool = (CDrawTool*)c_tools.GetNext(pos);
if (pTool->m_drawShape == drawShape)
return pTool;
}
return NULL;
}
enum cmd_type
{
Cmd_NoOpertin, // 无操作
Cmd_ViewAll, // 全图显示
…
};
// 命令类基类
class CBaseComand
{
public:
CBaseComand(CMyView *pView);
virtual ~ CBaseComand();
virtual void Execute(); // 外部调用方法
//
private:
CMyView *pView; // 保存视图类指针,方便访问视图类的数据
}
class CViewAllCmd : public CBaseComand
{
public:
CViewAllCmd(CMyView *pView);
virtual ~ CViewAllCmd ();
void Execute(); // 外部调用方法
//
private:
CMyView *pView; // 保存视图类指针,方便访问视图类的数据
}
CBaseComand* CCmdFactory::CreateCmd(CMyView *pView,cmd_type type)
{
switch(type)
{
case Cmd_ViewAll:
return new CViewAllCmd(pView);
……
}
}