void CDrawLinesView::MenuDdaline() ... { CDC* pDC = GetDC(); int xa = m_pnt1.x, ya = m_pnt1.y, xb = m_pnt2.x, yb = m_pnt2.y, c = RGB(255,0,0); float x,y; float dx, dy, k; dx = (float)(xb - xa); dy = (float)(yb - ya); k = dy / dx; y = ya; x = xa; if(abs(k)<1) ...{ if(xa <= xb)...{ for(x = xa; x <= xb; ++x) ...{ pDC->SetPixel((int)x,int(y+0.5),c); y += k; } } else if(xa > xb) ...{ for(x = xa; x >= xb; --x) ...{ pDC->SetPixel((int)x,int(y+0.5),c); y -= k; } } } if(abs(k)>=1) ...{ if(ya <= yb)...{ for(y = ya; y <= yb; ++y) ...{ pDC->SetPixel(int(x+0.5),(int)y, c); x += 1/k; } } else if( ya > yb) ...{ for(y = ya; y >= yb; --y) ...{ pDC->SetPixel(int(x+0.5),(int)y, c); x -= 1/k; } } } ReleaseDC(pDC);} void CDrawLinesView::MenuMindlepoint() ... { CDC* dc = GetDC(); int x0 = m_pnt1.x, y0 = m_pnt1.y, x1 = m_pnt2.x, y1= m_pnt2.y, color = RGB(0,255,0); int dx,dy,nexte,nextne,d,x,t,y; float m; dx=x1-x0; dy=y1-y0; m=1.0*dy/dx; //¼ÆËãбÂÊ£¬²¢ÒÀ¾Ý´Ë½øÐÐÅÐ¶Ï if(m<=1&&m>=0) ...{ if(x0>=x1) ...{ swap(x0,x1); swap(y0,y1); dx=-dx;dy=-dy; //½»»»×ø±êºódx,dy±äΪÏà·´µÄÊý } x=x0; y=y0; d=dx-2*dy; //d0 nexte=-2*dy; //ÏÂÒ»¸ö×ø±ê¾àÀëÇ°Ò»¸ö×ø±êµÄÆ«ÒÆ nextne=-2*dy+2*dx; while(x<x1) ...{ if(d>0) d+=nexte; else ...{ d+=nextne; y++; } x++; dc->SetPixel(x,y,color); } } else if(m>=-1&&m<0) ...{ if(x0>=x1) ...{ swap(x0,x1); swap(y0,y1); dx=-dx;dy=-dy; } x=x0;y=y0; d=-dx-2*dy; //d0 nexte=-2*dy; nextne=-2*dy-2*dx; while(x<x1) ...{ if(d>0) ...{ d+=nextne; y--; } else d+=nexte; x++; dc->SetPixel(x,y,color); } } else if(m>1) ...{ if(y0>=y1) ...{ swap(x0,x1); swap(y0,y1); dy=-dy;dx=-dx; } x=x0; y=y0; d=-dy+2*dx; //d0 nexte=2*dx; nextne=-2*dy+2*dx; while(y<y1) ...{ if(d>0) ...{ d+=nextne; x++; } else d+=nexte; y++; dc->SetPixel(x,y,color); } } else if(m<-1) ...{ if(y0>=y1) ...{ swap(x0,x1); swap(y0,y1); dx=-dx;dy=-dy; } x=x0; y=y0; d=2*dx+dy; //d0 nexte=2*dx; nextne=2*dx+2*dy; while(y<y1) ...{ if(d<0) ...{ d+=nextne; x--; } else d+=nexte; y++; dc->SetPixel(x,y,color); } } ReleaseDC(dc);} void swap( int & x1, int & x2) ... { int t; t = x1; x1 = x2; x2 = t;} void CDrawLinesView::MenuBhline() ... { CDC* dc = GetDC(); int x0 = m_pnt1.x, y0 = m_pnt1.y, x1 = m_pnt2.x, y1= m_pnt2.y, color = RGB(0,0,255); int x,y,dx,dy,sx,sy; int f; bool flag = false; x = x0; y = y0; dx = abs(x0-x1); dy = abs(y0-y1); if(x1-x0 >= 0) sx = 1; else sx = -1; if(y1-y0>=0) sy = 1; else sy = -1; if(dy > dx) ...{ swap(dx,dy); flag = true; } else flag = false; f = 2*dy - dx; for(int i=1; i<=dx; ++i) ...{ dc->SetPixel(x,y,color); if(f >= 0) ...{ if(flag) x += sx; else y+=sy; dc->SetPixel(x,y,color); f -= 2*dx; } else ...{ if(flag) y+=sy; else x+=sx; f += 2*dy; } }} void CDrawLinesView::OnMenuDdaline() ... { // TODO: Add your command handler code here m_blDDA = true; m_blMid = false; m_blBre = false;} void CDrawLinesView::OnMenuMindlepoint() ... { // TODO: Add your command handler code here m_blDDA = false; m_blMid = true; m_blBre = false; } void CDrawLinesView::OnMenuBhline() ... { // TODO: Add your command handler code here m_blDDA = false; m_blMid = false; m_blBre = true; } void CDrawLinesView::OnLButtonDown(UINT nFlags, CPoint point) ... { // TODO: Add your message handler code here and/or call default ++m_pntCount; if(m_pntCount == 1) m_pnt1 = point; else if(m_pntCount == 2) ...{ m_pnt2 = point; if(m_blDDA) MenuDdaline(); if(m_blMid) MenuMindlepoint(); if(m_blBre) MenuBhline(); m_pntCount = 0; } CView::OnLButtonDown(nFlags, point);}