Перенос или копирование созданных графических значений по событию mouseUp в событие Paint - PullRequest
0 голосов
/ 20 августа 2010

Как я могу поместить свои созданные графические коды в событие рисования?У меня проблемы с отображением его на краску.Я пытался добавить точки в список, но нарисованные линии сливаются.Помогите!

Вот код:

private Point _ps = new Point();
private Point _pe = new Point();
private TransparentPanel _thispan;
private Rectangle _SelectRect;
private Graphics _g;
private Pen _pen;
List<Point> _listPS = new List<Point>();
List<Point> _listPE = new List<Point>();

private void _newTransPan_MouseDown(object sender, MouseEventArgs e)
{
    _SelectRect.Width = 0;
    _SelectRect.Height = 0;
    _SelectRect.X = e.X;
    _SelectRect.Y = e.Y;

    _ps.X = e.X;
    _ps.Y = e.Y;
    _pe = _ps;
}

private void _newTransPan_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        _thispan = (TransparentPanel)sender;

        ControlPaint.DrawReversibleLine(_thispan.PointToScreen(_ps),  _thispan.PointToScreen(_pe), Color.Red);
        _pe = new Point(e.X, e.Y);
        ControlPaint.DrawReversibleLine(_thispan.PointToScreen(_ps), _thispan.PointToScreen(_pe), Color.Red);
    }
}

private void _newTransPan_MouseUp(object sender, MouseEventArgs e)
{

    _thispan = (TransparentPanel)sender;

    _g = _thispan.CreateGraphics();
    _flagCol = _mdt._getColorVal();
    _pen = new Pen(_flagCol, _mdt._getPenVal());
    _pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
    _pen.DashCap = System.Drawing.Drawing2D.DashCap.Triangle;
    ControlPaint.DrawReversibleLine(_thispan.PointToScreen(_ps), _thispan.PointToScreen(_pe), Color.Red);
     _g.DrawLine(_pen, _ps, _pe);

     _listPS.Add(_ps);
     _listPE.Add(_pe);

 }

private void _newTransPan_Paint(object sender, PaintEventArgs e)
{
    _thispan = (TransparentPanel)sender;
    _g = _thispan.CreateGraphics();

    foreach (Point _tps in _listPS)
    {
        foreach (Point _tpe in _listPE)
        {
           _g.DrawLine(_pen, _tps, _tpe);
        }
    }
}

1 Ответ

2 голосов
/ 20 августа 2010

В вашем _newTransPan_Paint обработчике событий вы соединяете каждую начальную точку с каждой конечной точкой. Конечно, это не приведет к непрерывной сегментированной линии; это произведет каракули. Вы хотите соединить каждую начальную точку только с ее соответствующей конечной точкой:

private void _newTransPan_Paint(object sender, PaintEventArgs e)
{
    var g = _newTransPan.CreateGraphics();

    for (int i = 0; i < _listPS.Count; i++)
        g.DrawLine(_pen, _listPS[i], _listPE[i]);
}

Еще раз хочу подчеркнуть, что вы должны использовать локальные переменные. Вы будете создавать себе трудные для поиска ошибки позже, если вы этого не сделаете. Существует причина, по которой существуют локальные переменные; используйте их, когда можете, и используйте поля, только если это необходимо. В вашем коде:

  • _g и _pen должны быть локальными переменными. Вы присваиваете им новое значение в каждом методе, поэтому обмен данными не происходит.

  • Если я не ошибаюсь, у вас уже есть _newTransPan для вашей панели, поэтому _thispan является избыточным. Вероятно, вы можете полностью удалить его и заменить все вхождения на _newTransPan.

...