画直线,画圆,输出文字

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zzzkiti/article/details/83280372

// MFCAppDrawTestDlg.cpp: 实现文件
//

#include "stdafx.h"
#include "MFCAppDrawTest.h"
#include "MFCAppDrawTestDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif



// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CMFCAppDrawTestDlg 对话框



CMFCAppDrawTestDlg::CMFCAppDrawTestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MFCAPPDRAWTEST_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);



	//初始化画笔、点变量数组
	m_pen[0].CreatePen(PS_SOLID, 1, RGB(0, 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 CMFCAppDrawTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STATIC_GroupBox, m_staticgroupbox);
}

BEGIN_MESSAGE_MAP(CMFCAppDrawTestDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


// CMFCAppDrawTestDlg 消息处理程序

BOOL CMFCAppDrawTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	//SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE);

	int nWinWidth = GetSystemMetrics(SM_CXFULLSCREEN),
		nWinHeight = GetSystemMetrics(SM_CYFULLSCREEN);
	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CMFCAppDrawTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMFCAppDrawTestDlg::OnPaint()
{

	//CRect rect;
	//GetDlgItem(IDC_STATIC_GroupBox)->GetClientRect(&rect);
	//if()
	//CPaintDC dc(this); // 用于绘制的设备上下文
	//CBrush brush(RGB(190, 190, 190));//画刷
	//dc.SelectObject(&brush);//将画刷选入DC

	vector<CString> str;
	str.push_back("12264");
	str.push_back("11111");
	str.push_back("12222");
	str.push_back("13333");
	str.push_back("11212");
	str.push_back("12121");
	str.push_back("12333");
	str.push_back("12444");
	str.push_back("12555");
	str.push_back("12666");
	str.push_back("12777");
	str.push_back("12888");
	str.push_back("12999");

	DrawLineCircleText(m_staticgroupbox.GetDC(), 9, str);
	//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();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMFCAppDrawTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


//绘制直线函数
void CMFCAppDrawTestDlg::DrawLineCircleText(CDC *pDC, int CircleNum, vector<CString> strVal)
{
	CPen *oldPen;

	CRect rect;
	GetDlgItem(IDC_STATIC_GroupBox)->GetClientRect(&rect);
	//GetDlgItem(IDC_STATIC_GroupBox)->ClientToScreen(&rect);

	int starx[4] = { 0 };
	int stary[4] = { 0 };

	int endx[4] = { 0 };
	int endy[4] = { 0 };

	starx[0] = rect.left;
	stary[0] = rect.top + rect.Height() / 3;
	endx[0] = rect.right;
	endy[0] = stary[0];

	starx[1] = rect.left;
	stary[1] = rect.top + 2 * rect.Height() / 3;
	endx[1] = rect.right;
	endy[1] = stary[1];

	starx[2] = rect.left + rect.Width() / 3;
	stary[2] = rect.top;
	endx[2] = starx[2];
	endy[2] = rect.bottom;

	starx[3] = rect.left + 2 * rect.Width() / 3;
	stary[3] = rect.top;
	endx[3] = starx[3];
	endy[3] = rect.bottom;

	int circlex[13] = { 0 };
	int circley[13] = { 0 };
	int radius = rect.Width() / 20;
	
	circlex[0] = rect.left + rect.Width() / 6;
	circley[0] = rect.top + rect.Height() / 6;

	circlex[1] = rect.left + 3 * rect.Width() / 6;
	circley[1] = rect.top + rect.Height() / 6;

	circlex[2] = rect.left + 5 * rect.Width() / 6;
	circley[2] = rect.top + rect.Height() / 6;



	circlex[3] = rect.left + rect.Width() / 6;
	circley[3] = rect.top + 3 * rect.Height() / 6;

	circlex[4] = rect.left + 3 * rect.Width() / 6;
	circley[4] = rect.top + 3 * rect.Height() / 6;

	circlex[5] = rect.left + 5 * rect.Width() / 6;
	circley[5] = rect.top + 3 * rect.Height() / 6;



	circlex[6] = rect.left + rect.Width() / 6;
	circley[6] = rect.top + 5 * rect.Height() / 6;

	circlex[7] = rect.left + 3 * rect.Width() / 6;
	circley[7] = rect.top + 5 * rect.Height() / 6;

	circlex[8] = rect.left + 5 * rect.Width() / 6;
	circley[8] = rect.top + 5 * rect.Height() / 6;

	if (CircleNum == 13)
	{
		//选择13点,进行绘图
		//绘圆
		circlex[9] = rect.left + rect.Width() / 15;
		circley[9] = rect.top + rect.Height() / 15;

		circlex[10] = rect.left + rect.Width() / 15;
		circley[10] = rect.top + 14*rect.Height() / 15;

		circlex[11] = rect.left + 14 *rect.Width() / 15;
		circley[11] = rect.top + rect.Height() / 15;

		circlex[12] = rect.left + 14 *rect.Width() / 15;
		circley[12] = rect.top + 14 *rect.Height() / 15;


		//绘文字

	}
	oldPen = pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
	for (int i = 0; i < 4; i++)
	{
		pDC->SelectObject(&m_pen[0]);
		pDC->MoveTo(starx[i], stary[i]);
		pDC->LineTo(endx[i], endy[i]);
	}
	pDC->SelectObject(oldPen);


	//oldPen = pDC->SelectObject(&m_pen[0]);
	//for (int i = 0; i < CircleNum; i++)
	//{
	//	pDC->SelectObject(&m_pen[0]);
	//	pDC->Ellipse(circlex[i] - radius, circley[i] - radius, circlex[i] + radius, circley[i] + radius);
	//}
	//pDC->SelectObject(oldPen);
	CFont font;
	CFont *pFont;
	font.CreateFont(14, 0, 0, 0, FW_MEDIUM, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "Arial");

	oldPen = pDC->SelectObject(&m_pen[0]);
	for (int i = 0; i < CircleNum; i++)
	{
		CBrush brush(RGB(190, 190, 190));//画刷
		pDC->SelectObject(&brush);//将画刷选入DC
		CRect rect(circlex[i] - radius, circley[i] - radius, circlex[i] + radius, circley[i] + radius);
		pDC->SelectObject(&m_pen[0]);
		//pDC->Ellipse(circlex[i] - radius, circley[i] - radius, circlex[i] + radius, circley[i] + radius);
		pDC->Ellipse(rect);

		//CRect rcRectangle(x, x, x, x);

		pFont = pDC->SelectObject(&font);
		pDC->TextOut(circlex[i], circley[i], strVal.at(i));
		//pDC->DrawText(L"祝你圣诞快乐!!", rect, DT_CENTER);
		//font.DeleteObject();
		//pDC
	}
	pDC->SelectObject(oldPen);


	//oldPen = pDC->SelectObject(&m_pen[0]);
	//for (int i = 0; i < CircleNum; i++)
	//{
	//	pDC->SelectObject(&m_pen[0]);
	//	pDC->Ellipse(circlex[i] - radius, circley[i] - radius, circlex[i] + radius, circley[i] + radius);
	//}
	//pDC->SelectObject(oldPen);




	ReleaseDC(pDC);
}

//绘制折线
void CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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 CMFCAppDrawTestDlg::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);
}

猜你喜欢

转载自blog.csdn.net/zzzkiti/article/details/83280372
今日推荐