运行环境是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() ,函数

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



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


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


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

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

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







相关文章:

  • 2021-10-20
  • 2021-10-26
  • 2022-12-23
  • 2021-07-30
  • 2022-12-23
  • 2021-12-12
猜你喜欢
  • 2021-06-04
  • 2021-04-20
  • 2021-07-22
相关资源
相似解决方案