Нарисуйте линию в MFC с помощью панели инструментов - PullRequest
0 голосов
/ 13 января 2011

Я пытаюсь создать приложение для рисования в MFC, используя visul basic c ++ 6.0. Я уже создал окно, используя функцию Create, а также создал панель инструментов со строкой инструментов, но я застрял на том, как кодировать линию, потому чтофункция, которую я знаю, работает как d.lineTo (x, y) и d.Moveto (x2, y2), но подпадает под функцию line: как использовать OnLButtonDown для захвата координат или есть какой-либо другой способ нарисоватьлиния ..?любая помощь будет полезна

Ответы [ 2 ]

2 голосов
/ 13 января 2011

взгляните на учебник MFC Scribble: http://msdn.microsoft.com/en-us/library/aa716527%28v=vs.60%29.aspx)

Это поможет вам начать работать с щелчком мыши, перемещением и рисованием мыши.

M.

1 голос
/ 14 января 2011

Хорошо, вам придется переопределить несколько функций-членов, чтобы сделать это.Я изложил подход ниже.Мой пример ниже касается одной операции рисования линии (от мыши вниз, до мыши вверх).Упражнение для вас - сделать так, чтобы после того, как вы сделали одно, вы могли сделать другое в другом месте.Это просто, кстати!

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. Как насчет большего количества цветов?

Все знаки указывают на создание некоторых классов рисования, которые инкапсулируютэто для вас, но я надеюсь, что вы начали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...