У меня проблемы с перелистыванием растрового изображения при его перемещении или изменении размера.Я в основном делаю приложение типа рисования, которое также будет включать слои, похожие на слои фотошопа.
Я установил колесо прокрутки для увеличения / изменения размера растрового изображения и установил среднюю кнопку мыши для перемещения панели, покаон удерживается и двигается.
У меня есть панель с клетчатым фоновым изображением, которое установлено на плитку.Это делается для того, чтобы при изменении размера фоновый рисунок оставался одинакового размера.Эта панель в основном используется для установки размера растрового изображения и фона.
Вот видео этой проблемы: 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 рисует эти битовые карты.После того, как все они вычеркнуты, ручка оказывается сверху.
Я пробовал двойную буферизацию и бесконечное количество игр безуспешно.
Кто-нибудь может помочь?
Спасибо