如何用MFC画出直线、虚线、折线、圆、椭圆、矩形、弧形(附上源码)

我创建的工程名字是默认的,叫MFCApplication3

首先在MFCApplication3Dlg.h这个文件中添加构造说明:

public:
	CPen m_pen[5];
	CPoint m_point[5];
public:
	void DrawLine(CDC *pDC);
	void DrawPolyline(CDC *pDC);
	void DrawPolygon(CDC *pDC);
	void DrawRect(CDC *pDC);
	void DrawRoundRect(CDC *pDC);
	void DrawEllipse(CDC *pDC);
	void DrawArc(CDC *pDC);
	void DrawAngleArc(CDC *pDC);
然后在MFCApplication3Dlg.cpp这个文件里面更改些东西和加点程序:

首先找到这个CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCApplication3Dlg::IDD, pParent),这个创建的时候就自动产生了,改成这样:

CMFCApplication3Dlg::CMFCApplication3Dlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CMFCApplication3Dlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//初始化画笔、点变量数组
	m_pen[0].CreatePen(PS_SOLID, 1, RGB(255, 0, 0));     //红色实线,1像素宽---参数:样式、宽度、颜色
	m_pen[1].CreatePen(PS_SOLID, 6, RGB(0, 255, 0));     //绿色实线,6像素宽
	m_pen[2].CreatePen(PS_DASH, 1, RGB(255, 0, 0));      //红色虚线,必须为一个像素宽
	m_pen[3].CreatePen(PS_DOT, 1, RGB(0, 0, 255));       //蓝色点线,必须为一个像素宽
	m_pen[4].CreatePen(PS_DASHDOTDOT, 1, RGB(255, 0, 0));//红色双点虚线,必须为一个像素宽

	//绘制多边形的点数组
	m_point[0].x = 10;
	m_point[0].y = 100;
	m_point[1].x = 10;
	m_point[1].y = 120;
	m_point[2].x = 100;
	m_point[2].y = 105;
	m_point[3].x = 170;
	m_point[3].y = 120;
	m_point[4].x = 170;
	m_point[4].y = 100;
}

然后再继续找到这个函数void CMFCApplication3Dlg::OnPaint(),将里面的东西改成这样:

void CMFCApplication3Dlg::OnPaint()
{

	CPaintDC dc(this); // 用于绘制的设备上下文
	CBrush brush(RGB(190, 190, 190));//画刷
	dc.SelectObject(&brush);//将画刷选入DC
	DrawLine(&dc);
	DrawPolyline(&dc);
	DrawPolygon(&dc);
	DrawRect(&dc);
	DrawRoundRect(&dc);
	DrawEllipse(&dc);
	DrawArc(&dc);
	DrawAngleArc(&dc);

	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);


	}
	else
	{
		CDialogEx::OnPaint();
	}
}
然后继续在刚刚的同一个的MFCApplication3Dlg.cpp : 实现文件中,添加绘图函数:

//绘制直线函数
void CLineTestDlg::DrawLine(CDC *pDC)
{
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(int i=0;i<5;i++) 
    {
        pDC->SelectObject(&m_pen[i]);        //将画笔选入DC
        pDC->MoveTo(20,20+i*15);         //设置DC当前点
        pDC->LineTo(170,20+i*15);            //绘制直线
    }
    pDC->SelectObject(oldPen);       //回复DC原画笔
}
 
//绘制折线
void CLineTestDlg::DrawPolyline(CDC *pDC)
{
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            m_point[j].y+=35;       //每次下移35个像素
        }
        pDC->SelectObject(&m_pen[i]);
        pDC->Polyline(m_point,5);
    }
    pDC->SelectObject(oldPen);
}
 
//绘制多边形
void CLineTestDlg::DrawPolygon(CDC *pDC)
{
    for(int j=0;j<5;j++)
        m_point[j].y+=75;   //数组中的点下移75个像素
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            m_point[j].y+=35;   //每次绘制图形下移35个像素
        }
        pDC->SelectObject(&m_pen[i]);
        pDC->Polygon(m_point,5); //绘制多边形
    }
    pDC->SelectObject(oldPen);
}
 
//绘制矩形
void CLineTestDlg::DrawRect(CDC *pDC)
{
    CRect rect(150,20,220,80);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(int i=0;i<5;i++)
    {
        rect.OffsetRect(80,0);//每次绘图右移80个像素
        pDC->SelectObject(&m_pen[i]);
        pDC->Rectangle(&rect);//绘制矩形
    }
    pDC->SelectObject(oldPen);
}
 
//绘制圆角矩形
void CLineTestDlg::DrawRoundRect(CDC *pDC)
{
    CRect rect(150,150,220,230);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(int i=0;i<5;i++)
    {
        rect.OffsetRect(80,0);//每次绘图右移80个像素
        pDC->SelectObject(&m_pen[i]);
        pDC->RoundRect(&rect,CPoint(15,15));
    }
    pDC->SelectObject(oldPen);
}
 
//绘制椭圆
void CLineTestDlg::DrawEllipse(CDC *pDC)
{
    CRect rect(150,260,220,310);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(int i=0;i<5;i++)
    {
        rect.OffsetRect(80,0);
        pDC->SelectObject(&m_pen[i]);
        pDC->Ellipse(&rect);
    }
    pDC->SelectObject(oldPen);
}
 
//绘制弧线
void CLineTestDlg::DrawArc(CDC *pDC)
{
    CRect rect(150,400,220,460);
    CPoint ptStart(170,440);
    CPoint ptEnd(210,400);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(int i=0;i<5;i++)
    {
        rect.OffsetRect(80,0);
        ptStart+=CPoint(80,0);
        ptEnd+=CPoint(80,0);
        pDC->SelectObject(&m_pen[i]);
        pDC->Arc(&rect,ptStart,ptEnd);
    }
    pDC->SelectObject(oldPen);
}
 
//绘制直线与弧线
void CLineTestDlg::DrawAngleArc(CDC *pDC)
{
    CRect rect(150,500,220,560);
    CPoint ptCenter(185,600);
    CPoint ptStart(150,630);
    int r=30;
    float angleStart=0;
    float angleEnd=180;
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(int i=0;i<5;i++)
    {
        rect.OffsetRect(80,0);
        ptStart+=CPoint(80,0);
        pDC->MoveTo(ptStart);
        pDC->SelectObject(&m_pen[i]);
        pDC->AngleArc(ptCenter.x,ptCenter.y,r,angleStart,angleEnd);
    }
    pDC->SelectObject(oldPen);
}

然后点击运行,图就出来了,里面什么都有,大家想用哪个就用哪个吧。



结束了!MFC太难了,好多都看不懂了,哎,还是需要学习啊。

  • 35
    点赞
  • 217
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
以下是使用 MFC 完成手动绘制直线折线矩形的代码示例: 1. 在 MFC 应用程序中添加一个继承自 CView 的类 MyView。 2. 在 MyView.h 中添加以下代码: ```cpp #pragma once class MyView : public CView { protected: CPoint m_ptStart; // 起始点 CPoint m_ptEnd; // 终止点 int m_nShapeType; // 形状类型:0-直线,1-折线,2-矩形,3-形 public: MyView(); virtual ~MyView(); protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; ``` 3. 在 MyView.cpp 中添加以下代码: ```cpp #include "stdafx.h" #include "MyView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif IMPLEMENT_DYNCREATE(MyView, CView) BEGIN_MESSAGE_MAP(MyView, CView) ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_LBUTTONUP() ON_WM_PAINT() END_MESSAGE_MAP() MyView::MyView() { m_nShapeType = 0; } MyView::~MyView() { } void MyView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptStart = m_ptEnd = point; SetCapture(); } void MyView::OnMouseMove(UINT nFlags, CPoint point) { if (nFlags & MK_LBUTTON) { CClientDC dc(this); dc.SetROP2(R2_NOTXORPEN); dc.SelectStockObject(NULL_BRUSH); switch (m_nShapeType) { case 0: dc.MoveTo(m_ptStart); dc.LineTo(m_ptEnd); m_ptEnd = point; dc.MoveTo(m_ptStart); dc.LineTo(m_ptEnd); break; case 1: dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); m_ptEnd = point; dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; case 2: dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); m_ptEnd = point; dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; case 3: dc.MoveTo(m_ptStart); dc.LineTo(m_ptEnd); m_ptEnd = point; dc.MoveTo(m_ptStart); dc.LineTo(m_ptEnd); break; } } } void MyView::OnLButtonUp(UINT nFlags, CPoint point) { CClientDC dc(this); dc.SetROP2(R2_COPYPEN); dc.SelectStockObject(NULL_BRUSH); switch (m_nShapeType) { case 0: dc.MoveTo(m_ptStart); dc.LineTo(m_ptEnd); break; case 1: dc.Rectangle(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; case 2: dc.Ellipse(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y); break; case 3: dc.Arc(m_ptStart.x, m_ptStart.y, m_ptEnd.x, m_ptEnd.y, (m_ptStart.x + m_ptEnd.x) / 2, (m_ptStart.y + m_ptEnd.y) / 2, (m_ptStart.x + m_ptEnd.x) / 2, (m_ptStart.y + m_ptEnd.y) / 2); break; } ReleaseCapture(); } void MyView::OnPaint() { CPaintDC dc(this); } ``` 4. 在主窗口类中添加以下代码: ```cpp BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { m_wndSplitter.CreateStatic(this, 1, 2); m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(MyView), CSize(0, 0), pContext); m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CScrollView), CSize(0, 0), pContext); return TRUE; } ``` 5. 在菜单资源中添加以下菜单项: ``` ID_SHAPE_LINE 直线 ID_SHAPE_POLY 折线 ID_SHAPE_RECT 矩形 ID_SHAPE_ELLIP 形 ``` 6. 在主窗口类中添加以下代码: ```cpp BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND(ID_SHAPE_LINE, OnShapeLine) ON_COMMAND(ID_SHAPE_POLY, OnShapePoly) ON_COMMAND(ID_SHAPE_RECT, OnShapeRect) ON_COMMAND(ID_SHAPE_ELLIP, OnShapeEllip) END_MESSAGE_MAP() void CMainFrame::OnShapeLine() { MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0); pView->m_nShapeType = 0; } void CMainFrame::OnShapePoly() { MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0); pView->m_nShapeType = 1; } void CMainFrame::OnShapeRect() { MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0); pView->m_nShapeType = 2; } void CMainFrame::OnShapeEllip() { MyView* pView = (MyView*)m_wndSplitter.GetPane(0, 0); pView->m_nShapeType = 3; } ``` 7. 运行程序,选择菜单中的不同形状,手动绘制图形。 注意:以上代码示例只是演示如何手动绘制不同形状,还需要根据实际需要完善代码。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值