Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
1

Как через DrawGrid() нарисовать пять клеток?

08.04.2014, 17:14. Просмотров 1466. Ответов 14
Метки нет (Все метки)

Интересует как нарисовать пять клеток подряд, чтобы можно было по ним кликать и менять цвет, пока только нашел метод ControlPaint.DrawGrid но что что не пойму как его использовать.
C#
1
2
3
4
5
6
7
8
9
10
11
12
private void drawStipple() 
        {
            System.Drawing.Graphics g = CreateGraphics();
            Size s = new System.Drawing.Size(5, 5);
            Rectangle rect = new Rectangle(30, 70, 30, 30);
            ControlPaint.DrawGrid(g, rect, s, Color.Black);
        }
 
        private void Form_Load(object sender, EventArgs e)
        {
            drawStipple();
        }
Есть у кого пример рабочий?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2014, 17:14
Ответы с готовыми решениями:

Нарисовать сетку из клеток на форме, отслеживая клики по каждой из них
Ребят,всем добрый вечер. Подскажите как лучше нарисовать сетку из клеток на форме,чтобы потом...

Нарисовать на DrawGrid маленький круг в центре ячейки
Здравствуйте, помогите пожалуйста как можно нарисовать небольшой(маленький) круг в центре ячейки на...

На заданных с клавиатуры координат клеток шахматной доски нарисовать ферзей
На заданных с клавиатуры координат клеток шахматной доски нарисовать ферзей (пометить как угодно)

Нарисовать пять колец
Как сделать что бы кольца стали прозрачными. В PascalABC. В PascalABCNET получилось сделать, а...

Копирование картинки из drawgrid в drawgrid
В общем имеется два компонента drawgrid. В один компонент загружены картинки через массив Bitmap....

14
Learx
1047 / 854 / 194
Регистрация: 31.03.2010
Сообщений: 2,498
08.04.2014, 17:44 2
m0, по-моему использовать DataGridView ради того чтоб рисовать не стоит.
однако, если очень хотите, то можно создать обработчик CellMouseClick:
C#
1
2
3
4
        private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            (sender as DataGridView)[e.ColumnIndex, e.RowIndex].Style.BackColor = System.Drawing.Color.Coral;
        }
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
08.04.2014, 19:10  [ТС] 3
Learx, Так у меня сам грид не рисуется на формочке
0
Metall_Version
2126 / 1263 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
08.04.2014, 19:26 4
в панели элементов перетаскиваешь на форму
0
08.04.2014, 19:26
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
08.04.2014, 20:00  [ТС] 5
Нет там такого грида
0
Metall_Version
2126 / 1263 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
08.04.2014, 20:04 6
там есть датагрид
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
08.04.2014, 20:07  [ТС] 7
Ок добавил, что мне этот датагрид даст?
0
Metall_Version
2126 / 1263 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
08.04.2014, 20:47 8
а что вы хотите? для того чтобы создать пять визуальных элементов по которым можно кликать самое простое это использовать готовый контрол.

я бы посоветовал использовать панели (panel). создайте нужного размера и у каждого создайте события клик
0
Spawn
975 / 873 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.04.2014, 21:24 9
Задача стоит в рисовании клеток? Или же в использовании какого-то готового элемента управления?
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
08.04.2014, 21:51  [ТС] 10
Мне нужно 5 клеток, которые по клику будут менять цвет черный/белый, хотелось бы это сделать через ControlPaint.DrawGrid() он вроде и предназначен для этого. Вариант с пятью панельками меняющими бекграунд по клику не айс.
0
Metall_Version
2126 / 1263 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
08.04.2014, 21:54 11
ControlPaint.DrawGrid() это всего лишь метод рисования.
чтобы у вас какая то сущность реагировала на событие клика ее нужно сделать объектом . (в простом понимании) точнее контролом . типа бутона лейбла панели. и тд.
0
Spawn
975 / 873 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.04.2014, 21:58 12
Metall_Version, чтобы что-то реагировало на событие клика, надо это что-то этому научить. Control лишь стандартный способ в WinForms или WPF, в конце-концов никто не запрещает и свою обёртку над WinAPI сделать.

По теме, перенесите Ваш метод в событие Paint у формы, тогда всё нарисуется и будет перерисовываться.
1
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 146
08.04.2014, 22:12  [ТС] 13
Spawn, Так заработало, но эффект не тот, что ожидал конечно
0
Metall_Version
2126 / 1263 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
08.04.2014, 22:36 14
Spawn, да вы кэп. для ТСа по простому объяснял самое простое это контрол .Даже если просто отлавливать клик на форму и вычислять координаты относительно нарисованных клеток это сложно для него будет . судя по таким вопросам
0
Learx
1047 / 854 / 194
Регистрация: 31.03.2010
Сообщений: 2,498
09.04.2014, 16:28 15
Лучший ответ Сообщение было отмечено m0 как решение

Решение

....

Добавлено через 2 часа 18 минут
1) создаем приложение WinForms
2) создаем обработчики событий MouseClick и Paint
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
 
namespace DrawGrid
{
    public partial class Form1 : Form
    {
 
        List<bool> fill;
        int rowCount = 1;
        int colCount = 5;
        int cellSize = 30;
        int x = 40, y = 40;
 
        public Form1()
        {
            InitializeComponent();
            //создаем список с false
            fill = new List<bool>(new bool[rowCount*colCount]);
        }
 
 
        private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
            //по клику мыши опредеделяем по какой ячейке кликнули
            int colNumber = (e.X - x) / cellSize;
            int rowNumber = (e.Y - y) / cellSize;
            //определяем находится ли ячейка в нашей сетке
            if (colNumber > colCount - 1 || rowNumber > rowCount - 1) return;
            //если в нашей сетке помечаем что она должна быть закрашена
            fill[rowNumber * colCount + colNumber] = true;
            //вызываем перерисовку форму
            this.Invalidate();
        }
 
        //это специальный метод для рисования на форме
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            //получаем Graphics нашей формы и вызываем для него рисование сетки
            e.Graphics.DrawGrid(x, y, cellSize, rowCount, colCount, Pens.Black, Brushes.Aqua, fill);
        }
        
    }
 
    public static class DrawingExtension
    {
        //этот метод рисует сетку
        //x,y координаты левого верхнего угла
        //cellSize - размер ячейки
        //rowCount и colCount - кол-во строк и столбцо соотвественно
        //pen - карандаш для границ
        //brush - кисть для заливки
        //fill - заливать ли ячейки
        public static void DrawGrid(this Graphics g, int x, int y, int cellSize, int rowCount, int colCount, Pen pen, Brush brush, List<bool> fill=null)
        {
            //по умолчинаю ячейки незакрашены
            if (fill == null) fill = new List<bool>(new bool[rowCount * colCount]);
            //количество значений должно соотвествовать количеству ячеек
            if (fill.Count != rowCount * colCount) throw new ArgumentException();
            //идем слева направо
            for (int i = 0; i < colCount ; i++)
            {
                //идем сверху вниз
                for (int j = 0; j < rowCount; j++)
                {
                    //рисуем незакрашенную ячейку
                    g.DrawRectangle(pen, x + i * cellSize, y + j * cellSize, cellSize, cellSize);
                    //если необходимо закрашиваем ячейку
                    if (fill[j * colCount + i])
                    {
                        //заливаем ячейку с учетом кисти
                        g.FillRectangle(brush, x + i * cellSize + pen.Width / 2, y + j * cellSize + pen.Width / 2, cellSize - pen.Width / 2, cellSize - pen.Width / 2);
                    }
                }
            }
        }
    }
}
1
09.04.2014, 16:28
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 16:28

Реализация через PopupMenu функций copy and paste в DrawGrid
Доброго дня! Встала задача реализовать данный сабж в пределах одного DrawGrid. При выделение одной,...

Процедура: нарисовать пять закрашенных кругов в прямоугольнике
2. нарисовать пять закрашенных кругов в прямоугольнике используя процедуру

Дана полоска из клеток: вывести последовательность номеров клеток, с которыми совершается действие
Дана полоска из клеток, пронумерованных от 1 до N. На каждом ходе разрешено поставить фишку на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru