MFC CDC绘制直线 折现 椭圆 ...

来源:互联网 发布:网络连接但是不能上网 编辑:程序博客网 时间:2024/05/16 14:45

****Dlg.h头文件添加:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
//为工程添加画笔、点变量数组
public:
    CPen m_pen[5];
    CPoint m_point[5];
public:
    voidDrawLine(CDC *pDC);
    voidDrawPolyline(CDC *pDC);
    voidDrawPolygon(CDC *pDC);
    voidDrawRect(CDC *pDC);
    voidDrawRoundRect(CDC *pDC);
    voidDrawEllipse(CDC *pDC);
    voidDrawArc(CDC *pDC);
    voidDrawAngleArc(CDC *pDC);

****Dlg.cpp构造函数修改:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CLineTestDlg::CLineTestDlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CLineTestDlg::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;
}
***Dlg.cpp onpaint函数

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
voidCLineTestDlg::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);
 
        // 使图标在工作区矩形中居中
        intcxIcon = GetSystemMetrics(SM_CXICON);
        intcyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        intx = (rect.Width() - cxIcon + 1) / 2;
        inty = (rect.Height() - cyIcon + 1) / 2;
 
        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
 
         
    }
    else
    {
        CDialogEx::OnPaint();
    }
}
定义绘图函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//绘制直线函数
voidCLineTestDlg::DrawLine(CDC *pDC)
{
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(inti=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原画笔
}
 
//绘制折线
voidCLineTestDlg::DrawPolyline(CDC *pDC)
{
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(inti=0;i<5;i++)
    {
        for(intj=0;j<5;j++)
        {
            m_point[j].y+=35;      //每次下移35个像素
        }
        pDC->SelectObject(&m_pen[i]);
        pDC->Polyline(m_point,5);
    }
    pDC->SelectObject(oldPen);
}
 
//绘制多边形
voidCLineTestDlg::DrawPolygon(CDC *pDC)
{
    for(intj=0;j<5;j++)
        m_point[j].y+=75;  //数组中的点下移75个像素
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);//保存DC原始画笔
    for(inti=0;i<5;i++)
    {
        for(intj=0;j<5;j++)
        {
            m_point[j].y+=35;  //每次绘制图形下移35个像素
        }
        pDC->SelectObject(&m_pen[i]);
        pDC->Polygon(m_point,5);//绘制多边形
    }
    pDC->SelectObject(oldPen);
}
 
//绘制矩形
voidCLineTestDlg::DrawRect(CDC *pDC)
{
    CRect rect(150,20,220,80);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(inti=0;i<5;i++)
    {
        rect.OffsetRect(80,0);//每次绘图右移80个像素
        pDC->SelectObject(&m_pen[i]);
        pDC->Rectangle(&rect);//绘制矩形
    }
    pDC->SelectObject(oldPen);
}
 
//绘制圆角矩形
voidCLineTestDlg::DrawRoundRect(CDC *pDC)
{
    CRect rect(150,150,220,230);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(inti=0;i<5;i++)
    {
        rect.OffsetRect(80,0);//每次绘图右移80个像素
        pDC->SelectObject(&m_pen[i]);
        pDC->RoundRect(&rect,CPoint(15,15));
    }
    pDC->SelectObject(oldPen);
}
 
//绘制椭圆
voidCLineTestDlg::DrawEllipse(CDC *pDC)
{
    CRect rect(150,260,220,310);
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(inti=0;i<5;i++)
    {
        rect.OffsetRect(80,0);
        pDC->SelectObject(&m_pen[i]);
        pDC->Ellipse(&rect);
    }
    pDC->SelectObject(oldPen);
}
 
//绘制弧线
voidCLineTestDlg::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(inti=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);
}
 
//绘制直线与弧线
voidCLineTestDlg::DrawAngleArc(CDC *pDC)
{
    CRect rect(150,500,220,560);
    CPoint ptCenter(185,600);
    CPoint ptStart(150,630);
    intr=30;
    floatangleStart=0;
    floatangleEnd=180;
    CPen *oldPen=pDC->SelectObject(&m_pen[0]);
    for(inti=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);
}


运行效果:

0 0
原创粉丝点击