vc++绘图基础
参考https://wenku.baidu.com/view/50c1214ee009581b6ad9eb2e.html
注:如果代码实现出错,请手敲一遍再执行
在OnDraw里面添加语句
例:
void CMy123View::OnDraw(CDC* pDC)
{
CMy123Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//在此加语句
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
OldPen=pDC->SelectObject(&MyPen);
pDC->MoveTo(20,30);
pDC->LineTo(200,300);
pDC->SelectObject(OldPen);
// TODO: add draw code for native data here
}
效果图:
1.画点
在屏幕的(20,20)坐标位置处绘制一个红色像素点。然后取出该像素点的颜色,在屏幕的(60,20)坐标处绘制一个相同颜色的像素点。
COLORREF c; //变量c用于存放像素点的颜色值
pDC->SetPixel(20,20,RGB(255,0,0)); //在屏幕的(20,20)坐标位置处,绘制一个红色的像素点
c=pDC->GetPixel(20,20); //c保存该像素点的颜色
pDC->SetPixel(60,20,c); //在像素点(60,20)处以颜色值c绘制一个像素点
2.画线
从屏幕的(20,30)到(200,300)画一条一像素宽的蓝色直线
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
OldPen=pDC->SelectObject(&MyPen);
pDC->MoveTo(20,30); //移动画笔到(20,30)
pDC->LineTo(200,300); //从(20,30)画线到(200,300)
pDC->SelectObject(OldPen); //还原
3.画矩形
绘制左上角点为(100,100),右下角点为(600,300)的矩形。矩形边框为一像素宽的蓝色边界线,内部填充红色
CPen MyPen,*OldPen;//
MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));//
OldPen=pDC->SelectObject(&MyPen);//
CBrush MyBrush,*OldBrush;//
MyBrush.CreateSolidBrush(RGB(255,0,0));//
OldBrush=pDC->SelectObject(&MyBrush);//
pDC->Rectangle(100,100,600,300);//画矩形
pDC->SelectObject(OldPen);//
//MyPen.DelectObject();//
pDC->SelectObject(OldBrush);//
//MyBrush.DelectObject();//
4.绘制椭圆函数
将一个圆绘制在视区中央,圆的形状依据视区形状而定。当窗口的形状发生改变是,圆的形状也随之改变。坐标系的中点位于屏幕中心。X轴向右,Y轴向上。圆的边界为一像素宽的蓝色边界线,内部填充为红色。
void CZhy123View::OnDraw(CDC* pDC)
{
CZhy123Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect Rect;//定义矩形对象
GetClientRect(&Rect);//获得当前窗口的客户区大小
pDC->SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC的映射模式
pDC->SetWindowExt(Rect.Width(),-Rect.Height());//设置窗口范围大小
pDC->SetViewportExt(Rect.right,-Rect.bottom);//设置视区范围
pDC->SetViewportOrg(Rect.right/2,Rect.bottom/2);//设置视口原点
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
OldPen=pDC->SelectObject(&MyPen);
CBrush MyBrush,*OldBrush;
MyBrush.CreateSolidBrush(RGB(255,0,0));
OldBrush=pDC->SelectObject(&MyBrush);
pDC->Ellipse(-Rect.right/2,-Rect.bottom/2,Rect.right/2,Rect.bottom/2);
//Ellipse函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外接矩形右下角点的坐标
pDC->SelectObject(OldPen);
MyPen.DeleteObject();
pDC->SelectObject(OldBrush);
MyBrush.DeleteObject();
}
5.椭圆弧
绘制第一象限内的椭圆弧
void CZhy123View::OnDraw(CDC* pDC)
{
CZhy123Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CPen MyPen,*OldPen;
MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
OldPen=pDC->SelectObject(&MyPen);
pDC->Arc(100,100,600,300,100,00,350,600);
pDC->SelectObject(OldPen);
MyPen.DeleteObject();
}
6.绘制多边形
绘制两个多边形,一个使用路径填充,另一个不使用路径填充,试观察结果的异同
void CZhy123View::OnDraw(CDC* pDC)
{
CZhy123Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//绘制第一个多边形,用路径填充图
CPoint p[7];//定义顶点数组
p[0]=CPoint(340,240);
p[1]=CPoint(260,160);
p[2]=CPoint(220,260);
p[3]=CPoint(260,370);
p[4]=CPoint(320,300);
p[5]=CPoint(360,380);
p[6]=CPoint(440,220);
CBrush MyBrush;
MyBrush.CreateSolidBrush(RGB(255,0,0));
CBrush *OldBrush=pDC->SelectObject(&MyBrush);
pDC->BeginPath(); //打开路径
pDC->MoveTo(p[0]);//绘制多边形
for(int i=1;i<7;i++)
pDC->LineTo(p[i]);
pDC->LineTo(p[0]);
pDC->EndPath(); //关闭路径图
pDC->FillPath(); //填充路径图
pDC->SelectObject(OldBrush);
MyBrush.DeleteObject();
//绘制第二个多边形,用画刷填充
p[0]=CPoint(740,240);
p[1]=CPoint(660,160);
p[2]=CPoint(620,260);
p[3]=CPoint(660,370);
p[4]=CPoint(720,300);
p[5]=CPoint(760,380);
p[6]=CPoint(840,220);
MyBrush.CreateSolidBrush(RGB(255,0,0));
CBrush*Oldbrush=pDC->SelectObject(&MyBrush);
pDC->Polygon(p,7);
pDC->SelectObject(OldBrush);
MyBrush.DeleteObject();
}
(1,2两个是上课打的~)今天就学到这啦~