Пользовательский элемент управления формой

#c# #winforms #pixel #shapes

#c# #winforms #пиксель #формы

Вопрос:

У меня очень мало знаний в C #, и я пытаюсь создать приложение WinForms для создания монохромных растровых изображений размером 8×8 пикселей. Я хочу, чтобы пользовательский интерфейс выглядел так, как показано ниже:

Форма

Здесь каждый из полей с черными рамками будет представлять пиксель, и просто, когда пользователь нажимает на один из них, он будет заполнен черным цветом, чтобы «был установлен пиксель».

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

Примечание: Я создал образец изображения с помощью инструмента графического проектирования и Visual Studio, он не из реального приложения. Это цель, которую я хочу достичь. В конечном приложении будут другие элементы формы для управления созданным растровым изображением.

Комментарии:

1. Давайте проигнорируем эти серые точки между квадратами..

2. Это выглядит как простой класс, который определяет прямоугольник. A bool Selected Color BorderColor и Color FillColor свойства с классом manager , который обрабатывает List<RectangleClass> , определяет размер пробелов и переключает Selected значение при Rectangle.Contains(Point) Mouse.Click событии. Событие Paint / OnPaint контейнера может передать e.Graphics объект классу manager , который рисует все прямоугольники в их текущем состоянии.

3. И как только у вас есть пользовательские calss или флажок изображения, вы можете программно поместить их в 2d-массив, чтобы вы могли легко получить координаты x, y

Ответ №1:

Вы хотите использовать CheckBox элемент управления. Вам нужны следующие свойства (не волнуйтесь, это можно установить в таблице свойств, это только для отображения фактического свойства и значений) :

 CheckBox myCheckBox = new CheckBox();

// change the look to a button style
myCheckBox.Appearance = System.Windows.Forms.Appearance.Button;

// put white background to match your design
myCheckBox.BackColor = System.Drawing.Color.White;

// make button style flat to get rid of the 3d-esque look
myCheckBox.FlatStyle = System.Windows.Forms.FlatStyle.Flat;

// either center image or scale should look good
myCheckBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;

// set to your empty picture by default and on the checked changed you will swap that
myCheckBox.BackgroundImage = /* whaever image is default */;
  

затем в событии checked changed просто измените фоновое изображение. Поскольку флажок допускает 2 состояния, вы сможете удобно использовать Checked свойство, чтобы узнать статус, с которым легче справиться, имея кнопку и сохраняя значение для каждого.

Комментарии:

1. Это точный ответ, который я искал. Выглядит очень просто, но, поскольку я новичок в C #, мне было трудно найти. Спасибо!

Ответ №2:

Это можно сделать с помощью стандартной кнопки. Вам нужно будет установить для свойства кнопки FlatStyle Flat Text значение , очистить свойство и добавить Click событие. Событие нажатия каждой кнопки затем может быть сопоставлено следующему методу:

 private void Pixel_Click(object sender, EventArgs e)
{
  ((Button)sender).BackColor = ((Button)sender).BackColor == Color.Black
    ? Color.White
    : Color.Black;
}
  

Размер кнопки можно легко изменить в IDE, чтобы сделать ее квадратной. Вы также должны установить начальный цвет на белый или черный в IDE.

Комментарии:

1. вы должны изменить все значения Pixel. для ((Button)sender). отправителя, которым будет сама кнопка, и если он создаст много кнопок, он сможет затем сопоставить это событие со всеми кнопками вместо того, чтобы писать по одному для каждой.

2. @Franck Спасибо, я обновил ответ, чтобы включить это.

Ответ №3:

Сначала я создал 1 кнопку.
В свойствах кнопки установите следующее:

 FlatStyle = Flat  
FlatAppearance => BorderColor = Black  
FlatAppearance => BorderSize = 4
  

Затем скопируйте и создайте еще 63 кнопки и расположите их как на картинке.
введите описание изображения здесь

Для каждой кнопки создайте событие нажатия, и вам понравится следующий код, чтобы при нажатии на него цвет фона становился черным. Если фон уже был черным, он вернет ему белый цвет.

 private void button1_Click(object sender, EventArgs e)
{
    if (button1.BackColor == Color.Black)
    {
        button1.BackColor = Color.White;
    }
    else
    {
        button1.BackColor = Color.Black;
    }
}