MFC 动态的Bresenham直线画法最详细的讲解,,,

xiaoxiao2021-02-27  459

运行环境是vs2017 本人亲自尝试过vc6也是完全可以的所有的步骤,方法都是一样。

原创:金松(Inner  Mongolia University)

原理:调用的

                                LButouneDown() 决定起始点

                                LButounUp()       决定终点位置

                                MouseMove()     实现动态画线核心函数

                                OnDraw()            刷新界面根源函数,   

                                Invalidate()          强制调用OnDraw()函数

                              

动态画线-->当我们按下鼠标左键不放,当左键弹起的整个过程中直线的位置会不断地改变,因为中点还没有定下来呢,

制作步骤:

(1)打开vs2017/vc2010/vc6/vc2013  ,创建mfc项目,在点击下一步的同时手动选择标准MFC ,点击完成创建项目。

(2)在cxxxxview.h  和cxxxxview.cpp 中创建自己的函数名与具体实现的函数代码。具体如下,

cxxxxview.h下

void MidPointCircle(int x0, int y0, int radus, int color);

cxxxxview.cpp 下

void CMFC1View::Bresenhamline(int x0, int y0, int x1, int y1, int color) {  CDC *p;  p = GetDC();  int x, y, dx, dy, e;  dx = x1 - x0;  dy = y1 - y0;  e = -dx;  x = x0;  y = y0;  if ((dx >= 0 && dy >= 0) || (dx <= 0 && dy <= 0))    //如果k大于0  {   if ((dx<0) || (dx == 0 && dy<0))                       //dx小于0说明终点x   {    dx = -dx;//    x = x1;//    dy = -dy;    y = y1;   }   if (dy<dx)                             //第一种情况,k-(0,1)//   {    e = -dx;    for (int i = 0;i<dx;i++)    {     p->SetPixel(x, y, color);     x++;     e = e + dy + dy;     if (e >= 0)     {      y++;      e = e - dx - dx;     }    }   }   else                                     //第二种情况,k-(1,max)   {    e = -dy;    for (int i = 0;i<dy;i++)    {     p->SetPixel(x, y, color);     y++;     e = e + dx + dx;     if (e >= 0)     {      x++;      e = e - dy - dy;     }    }   }  }  else                                            //如果k小于0  {   int tempx, tempy;    //保存x和y的绝对值   if (dx<0)                //dx小于0说明终点x   {    tempx = -dx;    tempy = dy;   }   if (dy<0)   {    tempx = dx;    tempy = -dy;   }   if (tempx>tempy)                                //第三种情况,k-(-1,0)   {    if (dx<0)                       //dx小于0说明终点x    {     dx = -dx;     x = x1;     dy = -dy;     y = y1;    }    e = -dx;    for (int i = 0;i<dx;i++)    {     p->SetPixel(x, y, color);     x++;     e = e - dy - dy;     if (e >= 0)     {      y--;      e = e - dx - dx;     }    }   }   else                                     //第四种情况,k-(-1,min)   {    if (dy<0)//dx小于0说明终点x    {     dx = -dx;     x = x1;     dy = -dy;     y = y1;    }    e = -dy;    for (int i = 0;i<dy;i++)    {     p->SetPixel(x, y, color);     y++;     e = e - dx - dx;     if (e >= 0)     {      x--;      e = e - dy - dy;     }    }   }  } }

(3)给cxxxxview类添加 LButoundown() ,LButounUp() ,函数

(4)给出各个函数的代码  补充的是在cxxxxview.h中要添加cpoint 类型的x1,x2,x3;

那么恭喜现在就可以运行了!!

转载请注明原文地址: https://www.6miu.com/read-673.html

最新回复(0)