Проблемы с мерцающим C # - PullRequest
       18

Проблемы с мерцающим C #

0 голосов
/ 19 сентября 2018

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

Я установил колесо прокрутки для увеличения / изменения размера растрового изображения и установил среднюю кнопку мыши для перемещения панели, покаон удерживается и двигается.

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

Вот видео этой проблемы: https://youtu.be/HRcCGaPmNU0

Вот скрипт, который рисует и перемещает сненужные вещи удалены.

 public Canvas()
    {
        InitializeComponent();
        this.SetStyle(ControlStyles.ResizeRedraw, true);
        this.MouseWheel += new MouseEventHandler(Canvas_WheelZoom);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

    }
 private void panel_DrawArea_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
        Graphics g;
        g = e.Graphics;
        //--------LAYERS--------//
        layerCount = layerBMPs.Count;
        if (layerCount > 0)
        {
            for (int i = 0; i < layerCount; i++)
            {
                Console.WriteLine("Draw Layer");
                g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
                g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
                g.DrawImage(layerBMPs[i], 0, 0, canvasSize.Width, canvasSize.Height);
            }
        }
        //--------LAYERS--------//

        //--------GRID--------//
        Console.WriteLine("Draw Grid");
        Bitmap gridArea;
        gridArea = new Bitmap(canvasSize.Width, canvasSize.Height);
        Pen myPen = new Pen(Brushes.Black);
        int tileCountX = canvasSize.Width / tileSize.Width;
        int tileCountY = canvasSize.Height / tileSize.Height;
        for (int i = 0; i < tileCountX; i++)
        {
            g.DrawLine(myPen, i * tileSize.Width * canvasScale, 0, i * tileSize.Width * canvasScale, canvasSize.Height);
        }
        for (int j = 0; j < tileCountY; j++)
        {
            g.DrawLine(myPen, 0, j * tileSize.Height * canvasScale, canvasSize.Width, j * tileSize.Height * canvasScale);
        }
        //--------GRID--------//
        g.Dispose();
        myPen.Dispose();
        }
    //Clicking the canvas
    private void panel_DrawArea_MouseDown(object sender, MouseEventArgs e)
    {
        //Detect which mouse button is pressed
        switch(MouseButtons)
        {
            case MouseButtons.Middle:
                //Move Canvas
                canvasMove = 1;
                canvasMoveX = e.X;
                canvasMoveY = e.Y;
                break;
        }
    }
    private void panel_DrawArea_MouseMove(object sender, MouseEventArgs e)
    {
        //Detect which mouse button is pressed
        switch (MouseButtons)
        {
            case MouseButtons.Middle:
                //Move Canvas
                if (canvasMove == 1)
                {
                    int xPos = Cursor.Position.X - canvasMoveX - this.Location.X;
                    int yPos = Cursor.Position.Y - canvasMoveY - this.Location.Y - 16;

                    drawAreaPos = new Point(xPos, yPos);

                    panel_DrawArea.Refresh(); <--- This makes it flicker really fast when moving or resizing.
                    //panel_DrawArea.Invalidate(); <--- Does nothing
                }

                break;
        }
    }
    private void panel_DrawArea_MouseUp(object sender, MouseEventArgs e)
    {
        switch (MouseButtons)
        {
            case MouseButtons.Middle:
                //Move Canvas
                canvasMove = 0;
                break;
        }
    }

Итак, в основном здесь происходит то, что список содержит растровые изображения.Цикл в событии draw рисует эти битовые карты.После того, как все они вычеркнуты, ручка оказывается сверху.

Я пробовал двойную буферизацию и бесконечное количество игр безуспешно.

Кто-нибудь может помочь?

Спасибо

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