MFC绘图_基本图形绘制

原创 2014年09月01日 08:15:13

其实这部分才是我最先学习MFC的部分,这里给出代码与原理,先看一下结果图(分别是绘点、绘线、绘面、绘注记):


MFC学习-绘图-图形绘制

首先说下MFC绘制图形,要写在项目view.cpp的ondraw里,得到pDC,或者用其他方法,如GetDC。
若要实现窗口变动图形仍在,就要给各个图像创建类来存储各个图形,然后根据存储的数据重绘图形。
(1)绘点:

struct PointFeature : public CObject
{
int      ID;
float    x,y;
int      radio;
COLORREF color;
public:
//重绘时候调用
void draw(DrawContext *drawContext);
};
这里用结构体或者用类存储数据都是可以的

把代码写在view的消息void CGISView::OnLButtonDown(UINT nFlags, CPoint point)中:

PointFeature *pointFeature = new PointFeature();
pointFeature->x = point.x;
pointFeature->y = point.y;
pointFeature->color = RGB(255,0,0);
pointFeature->radio = 5;
pointFeature->ID = activeLayer->pointFeatures.GetSize()+1;
//接之前的图层博客,这里指把点存在了当前图层中
activeLayer->pointFeatures.Add(pointFeature);
这里是之前提到的draw,自己定义的函数

void PointFeature::draw(DrawContext *drawContext)
{
CDC *pDC=drawContext->pDC;
CPoint *pM=new CPoint();
//结构体自身的
pM->x=x;
pM->y=y;
CRect r(pM->x - radio,pM->y - radio,pM->x + radio,pM->y + radio);
CPen *newPen = new CPen(PS_SOLID,1,this->color);
CPen *oldPen = pDC->SelectObject(newPen);
pDC->Ellipse(&r);
pDC->SelectObject(oldPen);
delete newPen;
CString str;
str.Format("%d",ID);
pDC->TextOut(pM->x+5,pM->y-5,str);
delete pM;
}
另外,别忘记写个for,把cobarray中所有点都draw一下,代码就不贴了。
(2)绘线:
首先在view.h中加入
 //记录鼠标左键按下的次数
int nDownNum; 
另外在加线的按钮里加入:
activeLine = new LineFeature();
activeLine->color=RGB(0,0,255);
activeLine->lineWidth=2;
struct LineFeature : public CObject
{
int      ID;
CObArray points;
int      lineWidth;
COLORREF color;
public:
~LineFeature();
void draw(DrawContext *drawContext);
};
把下面代码写在LButtonDown里:
if(activeLine != NULL)
{
CPoint *p = new CPoint();
p->x = point.x;
p->y = point.y;
activeLine->points.Add((CObject*)p);
}
startPt=point1;
endPt  =point1;
把下面代码写在OnRButtonDown里

CPoint *p = new CPoint();
p->x = point.x;
p->y = point.y;
activeLine->points.Add((CObject*)p);
if(activeLine->points.GetSize()>1)
{
activeLayer->lineFeatures.Add(activeLine);
activeLine = new LineFeature();
activeLine->color=RGB(0,0,255);
activeLine->lineWidth=2;
}
nDownNum=0;
把下面代码写在OnLButtonDblClk里
规定的双击时间限制之内再次按下鼠标左键时结束画线,和上面点击右键作用一样
CPoint *p = new CPoint();
p->x = point.x;
p->y = point.y;
activeLine->points.Add((CObject*)p);
if(activeLine->points.GetSize()>1)
{
activeLayer->lineFeatures.Add(activeLine);
activeLine = new LineFeature();
activeLine->color=RGB(0,0,255);
activeLine->lineWidth=2;
}
nDownNum=0;
//绘制
void LineFeature::draw(DrawContext *drawContext)
{
CDC *pDC=drawContext->pDC;
//线颜色、线型
CPen pen(PS_SOLID,lineWidth,color); 
CPen *pOldPen=pDC->SelectObject(&pen);
int num=points.GetSize();
if(num>1)
{   
CPoint *pPts=new CPoint[num];
for(int i=0 ; i< num;i++)
{
//这里是新内容,作用是不同放大缩小系数时,保持比例不便。
PMtoPV((CPoint *)points.GetAt(i),&pPts[i],drawContext);
}
pDC->Polyline(pPts,num);
pDC->SelectObject(pOldPen);
delete pPts;
}
}
上述只是实现了绘制,但是并没有“实时”的效果,这里给出“橡皮条”效果的代码(绘线和绘面对于“橡皮条的代码相同):
<pre name="code" class="cpp">if(nDownNum)
{
CClientDC dc(this);
CPen pNewPen(PS_SOLID,1,RGB(0,255,255));  
CPen* pOldPen=(CPen*)dc.SelectObject(&pNewPen);
<pre name="code" class="cpp">//设置反色,橡皮条的核心

dc.SetROP2(R2_XORPEN);
//第一次绘制反色,第二次是显示,然后每次把原来的抹去。
dc.MoveTo(startPt);
dc.LineTo(endPt);
dc.MoveTo(startPt);
dc.LineTo(point);
endPt=point;
}

(3)绘面:

struct AreaFeature : public CObject
{
int      ID;
CObArray points;
int      borderLineWidth;
COLORREF borderLineColor;
COLORREF fillColor;
public:
void draw(DrawContext *drawContext);
};
void AreaFeature::draw(DrawContext *drawContext)
{
CDC *pDC=drawContext->pDC;
int num=points.GetSize();
if(num>1)
{
CPoint *pPts=new CPoint[num];
for(int i=0 ; i< num;i++)
{
PMtoPV((CPoint *)points.GetAt(i),&pPts[i],drawContext);
}
CPen pen(PS_SOLID,borderLineWidth,borderLineColor); 
CBrush brush(fillColor);
CPen *pOldPen=pDC->SelectObject(&pen);
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Polygon(pPts,num);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
delete pPts;
}
}
(4)注记就十分类似,直接给出核心了:
void AnnoteFeature::draw(DrawContext *drawContext)
{
CDC *pDC=drawContext->pDC;
CPoint *pM=new CPoint();
pM->x=x;
pM->y=y;
CPoint *pV=new CPoint();
PMtoPV(pM,pV,drawContext);
pDC->TextOut(pV->x,pV->y,annote);
}


【计算机图形学课程】一.MFC基本绘图函数使用方法

这是最近我《计算机图形学》课程实践编程课介绍的相关知识,主要是想通过MFC C++绘图,让学生体会下图形学相关的编程及简单的图形绘制,同时非常佩服学生的想象力,他们做得真的不错。希望这篇基础文章对你有...
  • Eastmount
  • Eastmount
  • 2016年11月16日 04:45
  • 9768

MFC之绘图篇二:初步绘图(开发平台VS2010)

好吧,不得不承认,我昨天懒了,没有对这个进行更新,是完全的抵制不住电影的诱惑啊!!或许...
  • u012424783
  • u012424783
  • 2014年05月13日 20:58
  • 5727

基于MFC的简单图形绘制系统

  • 2016年11月04日 21:32
  • 947KB
  • 下载

MFC画柱状图之High-speed Charting Control(待续)

MFC 柱状图 X64平台 vs2010
  • jiang111_111shan
  • jiang111_111shan
  • 2016年06月16日 14:40
  • 4464

MFC基本图形的绘制(三)在SDI中实现绘图操作

例:绘制一条由点连起的曲线(简单图形)   新建一个MFC SDI应用程序,工程名为DrawGraph; 添加菜单命令:绘图和设置; 绘图子菜单项为绘制图形的类型。包含如下类型: 绘图类型:...
  • shufac
  • shufac
  • 2014年03月28日 00:24
  • 1525

MFC中图形绘制(一)

1)新建一个绘图菜单。打开
  • sanqima
  • sanqima
  • 2014年07月01日 20:55
  • 1055

MFC GDI多线程绘图

  • 2017年07月25日 15:32
  • 11.93MB
  • 下载

MFC中的GDI绘图

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上。   ...
  • weiqubo
  • weiqubo
  • 2011年09月27日 17:19
  • 3023

C++/MFC-多线程绘图

一、坐标系转换 GetWindowRect      1、取得屏幕坐标      2、转换成相对坐标      3、绘图      4、设计函数DrawRect(UINT id,UINT* width...
  • qwdpoiguw
  • qwdpoiguw
  • 2017年06月01日 21:16
  • 367

MFC如何高效的绘图

显示图形如何避免闪烁,如何提高显示效率是问得比较多的问题。 而且多数人认为MFC的绘图函数效率很低,总是想寻求其它的解决方案。 MFC的绘图效率的确不高但也不差,而且它的绘图函数使用非常简单, 只要使...
  • neubuffer
  • neubuffer
  • 2013年11月23日 14:21
  • 987
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC绘图_基本图形绘制
举报原因:
原因补充:

(最多只允许输入30个字)