嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元微信扫码支付:2 元
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
利用C 的MFC制作绘制三角形,矩形,圆形的绘图工具
AttributeDialog.h:
class AttributeDialog : public CDialogEx
{
DECLARE_DYNAMIC(AttributeDialog)
public:
AttributeDialog(CWnd* pParent = NULL); // 标准构造函数
virtual BOOL OnInitDialog();
virtual ~AttributeDialog();
// 对话框数据
enum { IDD = IDD_ATTRIBUTEDIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CMFCColorButton borderColorButton;
int x;
int y;
int w;
int height;
// CString text;
COLORREF borderColor;
COLORREF fillColor;
CMFCColorButton fillColorButton;
int borderWidth;
CListBox fillType;
CListBox borderType;
CComboBox shapeType;
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
afx_msg void OnCbnSelchangeComboShapeType();
// 选项的索引号
int comboxIndex;
int borderTypeIndex;
int filltypeIndex;
int borderType2;
int fillType2;
afx_msg void OnEnChangeEditLineWidth();
afx_msg void OnBnClickedButtonBorderColor();
CString text;
};
AttributeDialog.cpp:
BOOL AttributeDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
// 初始化列表框中的内容
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_BORDER_TYPE);
pListBox->InsertString(0, L"SOLID");
pListBox->InsertString(1, L"DASH");
pListBox->InsertString(2, L"DOT");
pListBox->InsertString(3, L"DASHDOT");
pListBox->InsertString(4, L"DASHDOTDOT");
pListBox->InsertString(5, L"PS_NULL");
pListBox->InsertString(6, L"PS_INSIDEFRAME");
pListBox->SetCurSel(0);
pListBox = (CListBox*)GetDlgItem(IDC_LIST_FILL_TYPE);
pListBox->InsertString(0, L"HS_HORIZONTAL");
pListBox->InsertString(1, L"HS_VERTICAL");
pListBox->InsertString(2, L"HS_FDIAGONAL");
pListBox->InsertString(3, L"HS_BDIAGONAL");
pListBox->InsertString(4, L"HS_CROSS");
pListBox->InsertString(5, L"SOLID");
pListBox->SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void AttributeDialog::OnCbnSelchangeComboShapeType()
{
UpdateData(FALSE);
// TODO: 在此添加控件通知处理程序代码
int index = shapeType.GetCurSel(); // 根据用户选项调整界面
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEXT);
pEdit->ShowWindow(SW_HIDE);
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);
pEdit->ShowWindow(SW_HIDE);
if (index == 5)
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TEXT);
pEdit->ShowWindow(SW_SHOW);
}
if (index == 1||index== 4)
{
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);
pEdit->ShowWindow(SW_SHOW);
}
UpdateData(FALSE);
}
void AttributeDialog::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
comboxIndex = shapeType.GetCurSel(); // 获取图形类型选项值
borderTypeIndex = borderType.GetCurSel(); // 获取边框类型选项值
filltypeIndex = fillType.GetCurSel(); //获取填充类型选项值
borderColor = borderColorButton.GetColor(); // 获取边框颜色值
fillColor = fillColorButton.GetColor(); // 获取填充颜色值
}
DrawingView.h:
class CDrawingView : public CScrollView
{
protected: // 仅从序列化创建
CDrawingView();
DECLARE_DYNCREATE(CDrawingView)
// 特性
public:
CDrawingDoc* GetDocument() const;
// 操作
public:
// 重写
public:
virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual void OnInitialUpdate(); // 构造后第一次调用
public:
virtual ~CDrawingView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的消息映射函数
protected:
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
DECLARE_MESSAGE_MAP();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
public:
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
};
#ifndef _DEBUG // DrawingView.cpp 中的调试版本
inline CDrawingDoc* CDrawingView::GetDocument() const
{ return reinterpret_cast<CDrawingDoc*>(m_pDocument); }
#endi
void CDrawingView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if ((nFlags&MK_CONTROL) == MK_CONTROL)//Ctrl键按下
{
CDrawingDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc) return;
CClientDC dc(this);
CPoint pntLogical = point;
OnPrepareDC(&dc);
dc.DPtoLP(&pntLogical);//DP->LP进行转换
AttributeDialog dlg;
dlg.x= pntLogical.x;
dlg.y = pntLogical.y;
if(dlg.DoModal()==IDOK)
{//获取图形的属性
int orgX = dlg.x;
int orgY = dlg.y;
int width = dlg.w;
int height = dlg.height;
CString text = dlg.text;
int borderWidth = dlg.borderWidth;
int borderType = dlg.borderTypeIndex;
COLORREF borderColor = dlg.borderColor;
int fillType = dlg.filltypeIndex;
int fillColor = dlg.fillColor;
int comboxIndex = dlg.comboxIndex;
switch(comboxIndex)
{
case 0:
{
// 正方形
CSquare *p = new CSquare(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
case 1:
{
// 矩形
CRectangle *p = new CRectangle(orgX, orgY, width, height, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
case 2:
{
// 正三角形
CTriangle *p = new CTriangle(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
case 3:
{
// 圆形
CCircle *p = new CCircle(orgX, orgY, width, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
case 4:
{
// 椭圆形
CEllipse *p = new CEllipse(orgX, orgY, width, height, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
case 5:
{
// 文本
CText *p = new CText(orgX, orgY, width, text, borderWidth, borderType, borderColor, fillType, fillColor);
pDoc->m_Elements.Add(p);
break;
}
default:
{
MessageBox(L"请您选择图形类型!");
break;
}
}
Invalidate();//刷新窗口
}
}
CScrollView::OnLButtonDown(nFlags, point);
}
void CDrawingView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CScrollView::OnLButtonDblClk(nFlags, point);
CDrawingDoc* pDoc = GetDocument();
int i;
CShape* p;
CClientDC dc(this);
CPoint pntLogical = point;
OnPrepareDC(&dc);
dc.DPtoLP(&pntLogical);//DP->LP进行坐标转换
for (i = 0; i < pDoc->m_Elements.GetCount(); i )
{
p = (CShape*)pDoc->m_Elements[i];
if (p->IsMatched(pntLogical)) //鼠标点point是否落在图元p之中
{
//AfxMessageBox(L"Matched!"); //选中图元p,在此编写处理代码
pDoc->m_Elements.RemoveAt(i);
AfxMessageBox(L"已删除!");
}
}
pDoc->CDocument::UpdateAllViews(NULL);
CScrollView::OnRButtonDblClk(nFlags, point);
}
void CDrawingView::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CScrollView::OnRButtonDblClk(nFlags, point);
CDrawingDoc* pDoc = GetDocument();
CShape *p = NULL;
int count = pDoc->m_Elements.GetCount();
CClientDC dc(this);
CPoint pntLogical = point;
OnPrepareDC(&dc);
dc.DPtoLP(&pntLogical);//DP->LP进行坐标转换
for (int i = 0; i < count; i )
{
p = (CShape*)pDoc->m_Elements[i];
if (p->IsMatched(pntLogical))
{
//修改图元属性,从图元属性值里面取值赋值给对话框的变量
AttributeDialog dialog;
dialog.x = p->OrgX;
dialog.y = p->OrgY;
dialog.w=p->Getw();
dialog.borderColor = p->BorderColor;
dialog.borderWidth = p->BorderWidth;
dialog.borderTypeIndex = p->BorderType;
if (dialog.DoModal() == IDOK)
{
//利用改了以后对话框中图元的属性更新到文档图元数组的对象中
p->OrgX = dialog.x;
p->OrgY = dialog.y;
p->Setw(dialog.w);
p->BorderColor = dialog.borderColor;
p->BorderWidth = dialog.borderWidth;
p->BorderType = dialog.borderTypeIndex;
p->FillColor = dialog.fillColor;
p->FillType = dialog.filltypeIndex;
p->SetAttribute(p->OrgX, p->OrgY, p->BorderColor, p->BorderType, p->BorderWidth, p->FillColor, p->FillType);
}
Invalidate();//刷新窗口
}
}
}
Shape.h:
enum ElementType { NOTSET, SQUARE, RECTANGLE, CIRCLE, ELLIPSE, TRIANGLE, TEXT };
class CShape : public CObject
{
public:
CShape();
virtual void Setw(int x)=0;
virtual int Getw()=0;
virtual void Draw(CDC*pDC)=0;//绘制图元
virtual bool IsMatched(CPoint pnt)=0;//点是否落在图形内部
virtual void Serialize(CArchive& ar) = 0;
void SetAttribute(int orgX, int orgY, COLORREF borderColor, int borderType, int borderWidth, COLORREF fillColor, int fillType); //修改图形属性表函数
virtual ~CShape();
public:
ElementType Type;//图元类型
int OrgX;//原点坐标
int OrgY;
COLORREF BorderColor;//边界颜色
int BorderType;//边界线型--实线、虚线、虚点线等
int BorderWidth;//边界宽度
COLORREF FillColor;//填充颜色
int FillType;//填充类型--实心、双对角、十字交叉等
};
Square.cpp:
void CSquare::Draw(CDC* pDC)//绘制图形函数
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
pDC->Rectangle(OrgX - width / 2, OrgY - width / 2, OrgX width / 2, OrgY width / 2);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CSquare::IsMatched(CPoint pnt)//图元匹配函数
{
CRgn rgn;
rgn.CreateRectRgn(OrgX - width / 2, OrgY - width / 2, OrgX width / 2, OrgY width / 2);
BOOL flag = rgn.PtInRegion(pnt);
if (flag)
return true;
else
return false;
}
Rectangle.cpp:
void CRectangle::Draw(CDC* pDC)//绘制图形函数
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
pDC->Rectangle(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CRectangle::IsMatched(CPoint pnt)//图元匹配函数
{
CRgn rgn;
rgn.CreateRectRgn(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);
BOOL flag = rgn.PtInRegion(pnt);
if (flag)
return true;
else
return false;
}
Triangle.cpp:
void CTriangle::Draw(CDC* pDC)//绘制图形函数
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
double x1 = double(OrgX), y1 = double(OrgY) double(width) / SQRT3;
double x2 = double(OrgX) - double(width) / 2, y2 = double(OrgY) - double(width) / (2 * SQRT3);
double x3 = double(OrgX) double(width) / 2, y3 = double(OrgY) - double(width) / (2 * SQRT3);
CPoint points[3] = { CPoint(int(x1), int(y1)), CPoint(int(x2), int(y2)), CPoint(int(x3), int(y3))};
pDC->Polygon(points, 3);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CTriangle::IsMatched(CPoint pnt)//图元匹配函数
{
CRgn rgn ;
CPoint ptVertex[3];
ptVertex[0].x = long(OrgX - width / 2);
ptVertex[0].y = long(OrgY (sqrt(1.0 / 12)) * width);
ptVertex[1].x = long(OrgX);
ptVertex[1].y = long(OrgY - (sqrt(1.0 / 3)) * width);
ptVertex[2].x = long(OrgX (width / 2));
ptVertex[2].y = long(OrgY (sqrt(1.0 / 12)) * width);
rgn.CreatePolygonRgn(ptVertex , 3 , ALTERNATE);
BOOL flag= rgn.PtInRegion(pnt);
if (flag)
{
return true;
}
else
return false;
}
Circle.cpp:
void CCircle::Draw(CDC* pDC)
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
pDC->Ellipse(OrgX - width/ 2, OrgY width / 2, OrgX width / 2, OrgY - width / 2);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CCircle::IsMatched(CPoint pnt)
{
CRgn rgn;
rgn.CreateEllipticRgn(OrgX-width,OrgY-width,OrgX width,OrgY width);
BOOL flag = rgn.PtInRegion(pnt);
if (flag)
{
return true;
}
else
return false;
}
Ellipse.cpp:
void CEllipse::Draw(CDC* pDC)
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
pDC->Ellipse(OrgX - width/ 2, OrgY height / 2, OrgX width / 2, OrgY - height / 2);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CEllipse::IsMatched(CPoint pnt)
{
CRgn rgn;
rgn.CreateEllipticRgn(OrgX - width / 2, OrgY - height / 2, OrgX width / 2, OrgY height / 2);
BOOL flag = rgn.PtInRegion(pnt);
if (flag)
return true;
else
return false;
}
Text.cpp:
void CText::Draw(CDC* pDC)
{
CPen pen, *pOldPen;
pen.CreatePen(BorderType, BorderWidth, BorderColor);
pOldPen = (CPen*)pDC->SelectObject(&pen);
CBrush brush, *pOldBrush;
if ( FillType >= HS_HORIZONTAL && FillType <= HS_DIAGCROSS)
brush.CreateHatchBrush(FillType, FillColor);
else
brush.CreateSolidBrush(FillColor);
pOldBrush = (CBrush*)pDC->SelectObject(&brush);
LOGFONT logfont;
lstrcpy(logfont.lfFaceName, _T("楷?体¬?_GB2312"));
logfont.lfWeight = 0;
logfont.lfWidth = 40;
logfont.lfHeight = 70;
logfont.lfEscapement = width;
logfont.lfUnderline = FALSE;
logfont.lfItalic = FALSE;
logfont.lfStrikeOut = FALSE;
logfont.lfCharSet = GB2312_CHARSET;
HFONT hFont, *hOldFont;
hFont = CreateFontIndirect(&logfont);
hOldFont = (HFONT*)pDC->SelectObject(hFont);
pDC->SetBkColor(FillColor);
pDC->SetTextColor(BorderColor);
pDC->TextOutW(OrgX, OrgY, text);
pDC->SelectObject(hOldFont);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
bool CText::IsMatched(CPoint pnt) //图元匹配函数
{
SIZE size;
double a = width * 3.1415926 / 180.0;
HFONT pNewFont = CreateFont(70, 40, width,0, 40, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, _T("楷?体¬?_GB2312"));
HDC hDC = CreateCompatibleDC(NULL);
SelectObject(hDC, pNewFont);
if (GetTextExtentPoint32(hDC, text, wcslen(text), &size))
{
CRgn rgn;
POINT ptVertex[4];
ptVertex[0].x = OrgX;
ptVertex[0].y = OrgY;
ptVertex[1].x = long(OrgX cos(a) * size.cx);
ptVertex[1].y = long(OrgY - sin(a) * size.cx);
ptVertex[2].x = long(OrgX sin(a) * size.cy cos(a) * size.cx);
ptVertex[2].y = long(OrgY cos(a) * size.cy - sin(a) * size.cx);
ptVertex[3].x = long(OrgX sin(a) * size.cy);
ptVertex[3].y = long(OrgY cos(a) * size.cy);
rgn.CreatePolygonRgn(ptVertex, 4, WINDING);
BOOL flag = rgn.PtInRegion(pnt);
if (flag)
{
return true;
}
else
return false;
}
else
return false;
}