Войти

Показать полную графическую версию : [решено] Закрашивание ячеек в picturebox Visual Studio C#


Grafitchic
18-09-2014, 16:39
Здравствуйте, есть следующая задача:
- создать сетку;
- обеспечить в ней смену цвета ячейки по нажатию клавиши мыши. Один клик окрашивает ячейку в черный цвет, второй клик возвращает прежний цвет.

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



private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
int q = e.X; // координата по оси X
int w = e.Y; // координата по оси Y
int x = Convert.ToInt32(textBox1.Text);
int y = Convert.ToInt32(textBox2.Text);
int i = 0;
int j = 0;
int f = pictureBox1.Size.Width / x;
int d = pictureBox1.Size.Height / y;
int c, z;



do
{
i++;
c = i * f;
} while (c <= e.X);
textBox3.Text = Convert.ToString(i);
do
{
j++;
z = j * d;
} while (z < e.Y);
textBox4.Text = Convert.ToString(j);


Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
SolidBrush blackbrush = new SolidBrush(Color.Black);
SolidBrush whitebrush = new SolidBrush(Color.White);
if (k==0)
{
g.FillRectangle(blackbrush, (i - 1) * f, (j - 1) * d, f, d);
k++;
}

else
{
g.FillRectangle(whitebrush, (i - 1) * f, (j - 1) * d, f, d);
k--;
}
}

Delirium
19-09-2014, 09:53
Глобальная переменная (tmp), хранящая ссылку на нажатый объект ( координаты, кнопка, имя или что то еще).

При нажатии делать следующее:
1. Если tmp != null то закрашиваем ее в первоначальный цвет
2. Закрашиваем текущий элемент черным
3. Присваиваем tmp равному текущему элементу.

Все.

А обязательно делать это в PictureBox? не проще сделать DataGrid, DataGridView, разметочный Table или что то подобное? Тогда не надо возиться с координатами и прочим, достаточно просто указать нужную ячейку.

mrcnn
19-09-2014, 14:54
В двухмерный массив цветов состояние можно попробовать сохранять.

Если в первый раз произойдет клик по ячейке 1,1, а затем 2,2 и (3,3 и снова 1,1 то возвращение после 4 клика, а значит нужно постоянно хранить цвет каждого элемента сетки.

После выхода из функции, данные о цвете не сохраняются, а переменные не статические, поэтому цвет не возвращается. При выходе из функции, локальные переменные функции очищаются, то есть делаются "мусором" , и их каждый раз откуда-то надо восстанавливать

Iska
19-09-2014, 16:01
Delirium, mrcnn, а нельзя ли просто получать текущий цвет из координат щелчка мышкой?!

Delirium
22-09-2014, 01:59
Iska, можно, но зачем? Это лишняя работа по поиску, а в моем варианте искать ничего не надо.

Iska
22-09-2014, 14:42
Iska, можно, но зачем? »
Потому как проще, полагаю.

Это лишняя работа по поиску, »
Каким образом?

а в моем варианте искать ничего не надо. »
Первый вариант не годится. Тут скорееВ двухмерный массив цветов состояние можно попробовать сохранять. »
и переменная под массив либо внешняя по отношению к функции, либо действительно статическая.

Если второе:
А обязательно делать это в PictureBox? не проще сделать DataGrid, DataGridView, разметочный Table или что то подобное? Тогда не надо возиться с координатами и прочим, достаточно просто указать нужную ячейку. »
— ничуть не спорю. Другое дело гоже ли сие автору темы. Больно уж похоже на типичное студзадание.

Мне просто было интересно узнать, можно ли так:
Delirium, mrcnn, а нельзя ли просто получать текущий цвет из координат щелчка мышкой?! »
вообще сделать.




© OSzone.net 2001-2012