Draw a line in mfc with help of toolbar

2019-06-10 06:42发布

I am trying to make a paint application in MFC using visul basic c++ 6.0 i have already created a window using Create function and also have created a toolbar with a tool line but i am stuck on how to code for the line because the function i know goes like d.lineTo(x,y) and d.Moveto(x2,y2) but it comes under the line function how do i use OnLButtonDown to Trap the co-ordiantes or is there any other way i can draw a line ..? any help will be useful

2条回答
萌系小妹纸
2楼-- · 2019-06-10 07:07

have a look at the MFC Scribble tutorial : http://msdn.microsoft.com/en-us/library/aa716527%28v=vs.60%29.aspx)

It will get you started on how to handling mouse click and mouse move and drawing.

M.

查看更多
唯我独甜
3楼-- · 2019-06-10 07:10

Ok, you're going to have to override several member functions to do this. I've outlined an approach below. My example below deals with a single line-drawing operation (from mouse down, to mouse up). An exercise for you, is to make it so that once you've done one, you can then do another at a different place. It's easy, btw!

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

Apologies if some of these function signatures are wrong! Add some members to your window class:

// 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);
    }
}

Obviously, this is crude and gives you a single drawing operation. Once you click the left button down again, it erases what you've done. So, once you have this working:

  1. Make it so you can draw an unlimited amount of lines. You could accomplish this in several ways such as an additional container (to store vectors), or even drawing-operation classes that you can store in a single vector and then execute.

  2. This solution may well flicker. How might you stop this? Perhaps OnEraseBkgnd holds the clue...

  3. How about more colours?

All signs point towards creating some drawing-classes that encapsulate this for you, but I hope this has got you started.

查看更多
登录 后发表回答