// 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);
}