Возможность создавать предварительный просмотр формы / элемента управления WinForms c # - PullRequest
0 голосов
/ 08 октября 2018

Я ищу возможность создать предварительный просмотр WinForms Form / Control.Мое приложение получило два окна - одно, где кто-то может рисовать на изображении (которое находится в PictureBox), и второе окно, где кто-то может видеть то, что было нарисовано в первом окне.В этот момент я попытался поместить тот же PictureBox с изображением во второе окно и нарисовать на нем те же линии, что и в окне 1. К сожалению, предварительный просмотр, как это, не является предварительным просмотром в реальном времени, потому что изображение в окне 2 обновляется, когда кто-то прекращает рисоватьокно 1. Ниже я отправляю код, который используется для рисования на изображении.

public void AddNewPoint(int X, int Y)
{
    if (_firstPointInStroke)
    {
        _firstpoint = _mainCustomPictureBox.PointToClient(new System.Drawing.Point(X, Y));
        _firstPointInStroke = false;
            }
        _secondpoint = _mainCustomPictureBox.PointToClient(new System.Drawing.Point(X, Y));

        var g = Graphics.FromImage(_mainCustomPictureBox.Image);

        var wfactor = (double)_mainCustomPictureBox.Image.Width / _mainCustomPictureBox.Width;
        var hfactor = (double)_mainCustomPictureBox.Image.Height / _mainCustomPictureBox.Height;
        var resizeFactor = Math.Max(wfactor, hfactor);
        System.Windows.Shapes.Line currentLine;
        if (hfactor > wfactor)
        {
            _firstpoint.X = (float)((_firstpoint.X - ((_mainCustomPictureBox.Width - ((double)_mainCustomPictureBox.Image.Width / resizeFactor)) / 2)) * resizeFactor);
            _firstpoint.Y = (float)(_firstpoint.Y * resizeFactor);
            _secondpoint.X = (float)((_secondpoint.X - ((_mainCustomPictureBox.Width - ((double)_mainCustomPictureBox.Image.Width / resizeFactor)) / 2)) * resizeFactor);
            _secondpoint.Y = (float)(_secondpoint.Y * resizeFactor);
        }
        else
        {
            _firstpoint.X = (float)(_firstpoint.X * resizeFactor);
            _firstpoint.Y = (float)((_firstpoint.Y - ((_mainCustomPictureBox.Height - ((double)_mainCustomPictureBox.Image.Height / resizeFactor)) / 2)) * resizeFactor);
            _secondpoint.X = (float)(_secondpoint.X * resizeFactor);
            _secondpoint.Y = (float)((_secondpoint.Y - ((_mainCustomPictureBox.Height - ((double)_mainCustomPictureBox.Image.Height / resizeFactor)) / 2)) * resizeFactor);
        }
        currentLine = new System.Windows.Shapes.Line { X1 = _firstpoint.X, X2 = _secondpoint.X, Y1 = _firstpoint.Y, Y2 = _secondpoint.Y };
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        g.DrawLine(_pen, (float)currentLine.X1, (float)currentLine.Y1, (float)currentLine.X2, (float)currentLine.Y2);
        g.Dispose();
        _mainCustomPictureBox.Invalidate();
        if (_previewCustomPictureBox != null && _previewCustomPictureBox.Image != null)
        {
            var gg = Graphics.FromImage(_previewCustomPictureBox.Image);
            gg.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            gg.DrawLine(_pen, (float)currentLine.X1, (float)currentLine.Y1, (float)currentLine.X2, (float)currentLine.Y2);
            gg.Dispose();
            _previewCustomPictureBox.Invalidate();
        }
        _firstpoint = _mainCustomPictureBox.PointToClient(new System.Drawing.Point(X, Y));

    }

У вас есть идея, как заставить интерфейс второго окна обновляться после каждой точки?

Hawex

...