借助工具栏在mfc中画一条线

时间:2011-01-13 13:27:37

标签: visual-c++ mfc

我正在尝试使用visul basic c ++ 6.0在MFC中创建一个绘图应用程序我已经使用Create函数创建了一个窗口,并且还创建了一个带有工具行的工具栏但我仍然坚持如何为该行编码,因为我知道的函数就像d.lineTo(x,y)和d.Moveto(x2,y2)但它在线函数下如何使用OnLButtonDown来捕获共同的ordiantes或者是否有任何其他方式我可以绘制一个线..?任何帮助都会有用

2 个答案:

答案 0 :(得分:2)

看看MFC Scribble教程: http://msdn.microsoft.com/en-us/library/aa716527%28v=vs.60%29.aspx

它将帮助您开始学习如何处理鼠标单击和鼠标移动和绘图。

微米。

答案 1 :(得分: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. 更多颜色怎么样?

  4. 所有迹象都指向创建一些封装这个的绘图类,但我希望这能让你开始。