2011-01-13 53 views
0

我想在MFC中使用visul basic C++ 6.0製作一個繪畫應用程序我已經創建了一個使用Create函數的窗口,並且還創建了一個帶有工具欄的工具欄,但是我卡住了關於如何編寫代碼行,因爲我知道的函數像d.lineTo(x,y)和d.Moveto(x2,y2)一樣,但是它在線函數下,我如何使用OnLButtonDown來捕獲協調器或有沒有其他辦法可以畫出一條線..?任何幫助將是有益的在工具欄的幫助下在mfc中繪製一條線

回答

1

好吧,你將不得不重寫幾個成員函數來做到這一點。我在下面概述了一種方法。我下面的示例處理單個繪圖操作(從鼠標向下到鼠標向上)。爲你做一個練習,就是讓它一旦完成,你就可以在不同的地方做另一個。這很簡單,順便說一句!

CWnd::OnLButtonDown(UINT _flags, CPoint _pt); 
CWnd::OnLButtonUp(UINT _flags, CPoint _pt); 
CWnd::OnMouseMove(UINT _flags, CPoint _pt); 
CWnd::OnPaint() 

道歉,如果這些功能簽名的一些是錯誤的!添加一些成員到你的窗口類:

// at the top of your file 
#include <vector> 

// in your class 
typedef std::vector<POINT> PointVector; 
PointVector m_Points; 


CYourWnd::OnLButtonDown(UINT _flags, CPoint _pt); 
{ 
    // NOTE: For more than one set of drawing, this will be different! 
    m_Points.clear(); 
    m_Points.push_back(POINT(_pt.x, _pt.y)); 
} 

CYourWnd::OnMouseMove(UINT _flags, CPoint _pt); 
{ 
    if(_flags & MK_LBUTTON) 
    { 
     const POINT& last(m_Points.back()); 
     if(_pt.x != last.x || _pt.y != last.y) 
     { 
      m_Points.push_back(POINT(_pt.x, _pt.y)); 
      Invalidate(); 
     } 
    } 
} 

CYourWnd::OnPaint() 
{ 
    CPaintDC dc(this); 
    CRect rcClient; GetClientRect(&rc); 
    FillSolidRect(&rcClient, RGB(255, 255, 255)); 

    if(m_Points.size()) 
    { 
     dc.MoveTo(m_Points[0].x, m_Points[0].y); 
     for(PointsVector::size_type p(1); 
      p < m_Points.size(); 
      ++p) 
      dc.LineTo(m_Points[p].x, m_Points[p].y); 
    } 
} 

顯然,這是粗糙的,並給你一個繪圖操作。一旦你再次點擊左鍵,它就會清除你所做的事情。所以,一旦你有這個工作:

  1. 讓它,所以你可以繪製無限量的線。您可以通過多種方式完成此操作,例如額外的容器(用於存儲矢量),甚至可以存儲在單個矢量中然後執行的繪圖操作類。

  2. 此解決方案可能會閃爍。你怎麼能阻止呢?也許OnEraseBkgnd持有線索...

  3. 如何更多的顏色?

所有的跡象都指向創建一些繪製類來爲你封裝,但我希望這已經讓你開始了。