Я пытаюсь найти лучший путь для создания пиксельной «сетки», которая позволила бы выполнять основные функции рисования, такие как окраска пикселей, щелкая и перемещая мышь, выбрав области для копирования, вставки или перемещения или использования других графических функций для визуализации текста или фигур в пикселях. Я просмотрел несколько примеров, таких как this example, который переопределяет панель управления и похож на то, что я пытаюсь достичь, но картина медленная, и кажется, что она не будет хорошо работать для рисования с помощью мышь. Есть ли элемент управления, который я мог бы переопределить, что позволит использовать функциональность, которую я ищу?C# Создать сетку для рисования пикселей и визуализации текста
Вот пример того, что в приведенном выше примере выглядит следующим образом: Sample pixel grid
И код, который я адаптировано из приведенного выше примера:
public class Pixel
{
public Rectangle Bounds { get; set; }
public bool IsOn { get; set; }
public bool IsSelected { get; set; }
}
public class PixelGridControl : Panel
{
public int Columns = 99;
public int Rows = 63;
private readonly Pixel[,] pixels;
public PixelGridControl()
{
this.DoubleBuffered = true;
this.ResizeRedraw = true;
// initialize pixel grid:
pixels = new Pixel[Columns, Rows];
for (int y = 0; y < Rows; ++y)
{
for (int x = 0; x < Columns; ++x)
{
pixels[x, y] = new Pixel();
}
}
}
// adjust each column and row to fit entire client area:
protected override void OnResize(EventArgs e)
{
int top = 0;
for (int y = 0; y < Rows; ++y)
{
int left = 0;
int height = (this.ClientSize.Height - top)/(Rows - y);
for (int x = 0; x < Columns; ++x)
{
int width = (this.ClientSize.Width - left)/(Columns - x);
pixels[x, y].Bounds = new Rectangle(left, top, width, height);
left += width;
}
top += height;
}
base.OnResize(e);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
for (int y = 0; y < Rows; ++y)
{
for (int x = 0; x < Columns; ++x)
{
if (pixels[x, y].IsOn)
{
e.Graphics.FillRectangle(Brushes.Gold, pixels[x, y].Bounds);
}
else
{
ControlPaint.DrawButton(e.Graphics, pixels[x, y].Bounds,
ButtonState.Normal);
}
}
}
base.OnPaint(e);
}
// determine which button the user pressed:
protected override void OnMouseDown(MouseEventArgs e)
{
for (int y = 0; y < Rows; ++y)
{
for (int x = 0; x < Columns; ++x)
{
if (pixels[x, y].Bounds.Contains(e.Location))
{
pixels[x, y].IsOn = true;
this.Invalidate();
MessageBox.Show(
string.Format("You pressed on button ({0}, {1})",
x.ToString(), y.ToString())
);
}
}
}
base.OnMouseDown(e);
}
}
Почему вы говорите, что GDI + медленный, любое измерение? И знаете ли вы [Double Buffered Graphics] (https://msdn.microsoft.com/en-us/library/b367a457 (v = vs.110) .aspx)? –
Я не пытаюсь сказать, что GDI + медленный, просто реализация, о которой я говорил в примере, который я связал. Я отредактировал сообщение и добавил код, который тестирую, в котором также используется графика DoubleBuffered, на которую вы ссылаетесь. Это займет всего 2 секунды между нажатием кнопки мыши и фактическим появлением области прямоугольника, меняющего цвет. Я пытаюсь выяснить, есть ли другой контроль или другой способ реализовать это, что обеспечит текучий опыт без задержки. – Rob
Не могли бы вы протестировать проект демо-тестирования на ** github ** для тестирования других? –