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;



那麼恭喜現在就可以運行了!!







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章