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

运行环境是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;



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







  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NARISU_JIN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值