Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 49
1

Рисование точек по нажатию клавиши

15.12.2013, 23:33. Показов 5885. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят помогите разобраться.Я вообще только начал изучать WinAPI и много делаю по учебнику, поэтому в коде может быть много лишнего, но сильно не ругайте.Но вот не могу понять.У меня задание такое: надо чтобы по нажатию ЛКМ в некой области сетки появлялся, допустим, красный кружок...Вот как мне такое реализовать?Прикрепляю код, который я более менее написал. Заранее спасибо.
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
81
82
83
84
85
86
87
88
89
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR WinName[] = _T("MainFrame");
int APIENTRY _tWinMain(HINSTANCE This,// Дескриптор текущего приложения
    HINSTANCE Prev,         // В современных системах всегда 0
    LPTSTR cmd,             // Командная строка
    int mode)               // Режим отображения окна
{
    HWND hWnd;  // Дескриптор главного окна программы
    MSG msg;    // Структура для хранения сообщения
    WNDCLASS wc;    // Класс окна
// Определение класса окна 
    wc.hInstance = This;        
    wc.lpszClassName = WinName;         // Имя класса окна
    wc.lpfnWndProc = WndProc;               // Функция окна
    wc.style = CS_HREDRAW | CS_VREDRAW;     // Стиль окна
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // Стандартная иконка
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);    // Стандартный курсор
    wc.lpszMenuName = NULL; // Нет меню
    wc.cbClsExtra = 0;      // Нет дополнительных данных класса
    wc.cbWndExtra = 0;      // Нет дополнительных данных окна
    // Заполнение окна белым цветом
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    if(!RegisterClass(&wc)) return 0;   // Регистрация класса окна 
//Создание окна
    hWnd = CreateWindow(WinName,    // Имя класса окна
    _T("Game Life"),    // Заголовок окна
    WS_OVERLAPPEDWINDOW,        // Стиль окна
    CW_USEDEFAULT,  // x
    CW_USEDEFAULT,  // y    Размеры окна
    CW_USEDEFAULT,  // Width
    CW_USEDEFAULT,  // Height
    HWND_DESKTOP,   // Дескриптор родительского окна
    NULL,       // Нет меню
    This,       // Дескриптор приложения
    NULL);      // Дополнительной информации нет
    ShowWindow(hWnd, mode); //Показать окно
// Цикл обработки сообщений
    while(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);// Функция трансляции кодов нажатой клавиши
    DispatchMessage(&msg); // Посылает сообщение функции WndProc()
    }
    return 0;
}
 
// Оконная функция вызывается операционной системой
// и получает сообщения из очереди для данного приложения
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    int x, y;
    static int sx, sy;
    switch (message)
    {
    case WM_SIZE:
        sx = 500;
        sy = 500;
        break;
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        for (x = 20; x < sx; x += sx/20)
        {
            MoveToEx(hdc, x, 20, NULL);
            LineTo(hdc, x, sy);
        }
        for (y = 20; y < sy; y += sy/20)
        {
            MoveToEx(hdc, 20, y, NULL);
            LineTo(hdc, sx, y);
        }
        EndPaint(hWnd, &ps);
        break;
        case WM_LBUTTONDOWN:
        x = LOWORD(lParam);
        y = HIWORD(lParam);
        hdc = GetDC(hWnd);
        ReleaseDC(hWnd, hdc);
        break;
        case WM_LBUTTONUP:
        InvalidateRect(hWnd, NULL, TRUE);
        break;
    case WM_DESTROY: PostQuitMessage(0); break;
    default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2013, 23:33
Ответы с готовыми решениями:

Вывод изображения по нажатию клавиши
Почему не выводит рисунок при нажатии на клавишу &quot;2&quot; #include &lt;windows.h&gt; #include &lt;tchar.h&gt; ...

Как менять толщину и цвет линий по нажатию клавиши?
Как менять толщину и цвет линий по нажатию клавиши:??? линии рисую мышкой

Добавление текстбоксов по нажатию клавиши и удаление по нажатию другой кнопки
Всем доброго времени суток. Хотел попросить помощи в написании следующего кода. Кое что набросал,...

Программа, которая по нажатию клавиши r или к рисует красный прямоугольник, а по нажатию q или й завершает работу
по нажатию клавиши r или к рисует красный прямоугольник, а по нажатию q или й завершает...

8
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
15.12.2013, 23:55 2
Я не совсем понимаю что требуется. Вам нужно нарисовать сетку с определенным шагом и уже по нажатию мышки определить в какую ячейку сетки вы попали и нарисовать там круг?
0
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
16.12.2013, 00:02 3
PolApelcina, у тебя подход к задаче неправильный, т.к. твоя сетка просто нарисована и ее координаты в программе нигде не хранятся.
0
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 49
16.12.2013, 00:09  [ТС] 4
Цитата Сообщение от DENIS94 Посмотреть сообщение
Я не совсем понимаю что требуется. Вам нужно нарисовать сетку с определенным шагом и уже по нажатию мышки определить в какую ячейку сетки вы попали и нарисовать там круг?
Да, именно.

Добавлено через 6 минут
Цитата Сообщение от Digit@ll Посмотреть сообщение
PolApelcina, у тебя подход к задаче неправильный, т.к. твоя сетка просто нарисована и ее координаты в программе нигде не хранятся.
Ну если можете, то пожалуйста объясните или покажите как и что именно надо сделать?
0
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
16.12.2013, 00:17 5
Массив(ы) используй.
0
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 49
16.12.2013, 00:20  [ТС] 6
Цитата Сообщение от Digit@ll Посмотреть сообщение
Массив(ы) используй.
А что мне тогда вместо сетки рисовать? прямоугольники? и их в массив загонять что ли?так?
0
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
16.12.2013, 00:32 7
Готово
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
void inline         DrawLine(HDC hdc, int X1, int Y1, int X2, int Y2);
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static int XStartPos = 20, YStartPos = 20, WidthGrid = 500, HeightGrid = 500, StepGrid = 20;
 
    switch (message)
    {
        case WM_LBUTTONDOWN:
        {
            if (LOWORD(lParam) >= XStartPos && LOWORD(lParam) <= XStartPos + WidthGrid &&
                HIWORD(lParam) >= YStartPos && HIWORD(lParam) <= YStartPos + HeightGrid )
            {
                int XBuf = LOWORD(lParam), YBuf = HIWORD(lParam);
                bool flag = true;
                for(register int Y = YStartPos, count_y = YStartPos + HeightGrid; Y <= count_y && flag; Y += StepGrid)
                {
                    for(register int X = XStartPos, count_x = XStartPos + WidthGrid; X <= count_x; X += StepGrid)
                    {
                        if ((XBuf > X && XBuf < X + StepGrid) && (YBuf > Y && YBuf < Y + StepGrid)) 
                        {
                            HDC hdc = GetDC(hWnd);
                            HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
                            SelectObject(hdc, hBrush);
                            Ellipse(hdc, X + 1, Y + 1, X + StepGrid, Y + StepGrid);
                            DeleteObject(hBrush);
                            flag = false;
                            break;
                        }
                    }
                }
            }
            break;
        }
        case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
                for(register int i = XStartPos, j = XStartPos + WidthGrid; i <= j; i += StepGrid) DrawLine(hdc, i, YStartPos, i, YStartPos + HeightGrid);
                for(register int i = YStartPos, j = YStartPos + HeightGrid; i <= j; i += StepGrid) DrawLine(hdc, XStartPos, i, XStartPos + WidthGrid, i);
            EndPaint(hWnd, &ps);
            break;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }
        default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Функция рисования линии
void inline DrawLine(HDC hdc, int X1, int Y1, int X2, int Y2)
{
    MoveToEx(hdc, X1, Y1, NULL);
    LineTo(hdc, X2, Y2);
}
Добавлено через 1 минуту
Только этот вариант кода рисует круги не сохраняя их координаты. При обновлении окна все сотрется. Можно конечно координаты хранить в массиве. Или односвязный список создать. Дело ваше)
1
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 49
16.12.2013, 00:35  [ТС] 8
Оогромное спасибо, очень выручил.Дальше разберусь сам, еще раз спасибо
0
24 / 24 / 6
Регистрация: 12.04.2013
Сообщений: 122
16.12.2013, 01:06 9
Я тут немного подредактировал рисование сетки. Теперь она рисуется корректно при любой ширине и высоте. Лишнее попросту обрезается.

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    static int XStartPos = 20, YStartPos = 20, WidthGrid, HeightGrid, StepGrid = 20;
    
    switch (message)
    {
        case WM_SIZE:
        {
            // Запоминаем размеры окна
            WidthGrid = LOWORD(lParam) - XStartPos;
            HeightGrid = HIWORD(lParam) - YStartPos;
            break;
        }
        case WM_LBUTTONDOWN:
        {
            if (LOWORD(lParam) >= XStartPos && LOWORD(lParam) <= XStartPos + WidthGrid &&
                HIWORD(lParam) >= YStartPos && HIWORD(lParam) <= YStartPos + HeightGrid )
            {
                int XBuf = LOWORD(lParam), YBuf = HIWORD(lParam);
                bool flag = true;
                register int    BufWidth = XStartPos + ((WidthGrid - XStartPos) / StepGrid) * StepGrid, 
                                BufHeight = YStartPos + ((HeightGrid - YStartPos) / StepGrid) * StepGrid;
                for(register int Y = YStartPos; Y < BufHeight && flag; Y += StepGrid)
                {
                    for(register int X = XStartPos; X < BufWidth; X += StepGrid)
                    {
                        if ((XBuf > X && XBuf < X + StepGrid) && (YBuf > Y && YBuf < Y + StepGrid)) 
                        {
                            HDC hdc = GetDC(hWnd);
                            HBRUSH hBrush = CreateSolidBrush(RGB(255, 0, 0));
                            SelectObject(hdc, hBrush);
                            Ellipse(hdc, X + 1, Y + 1, X + StepGrid, Y + StepGrid);
                            DeleteObject(hBrush);
                            flag = false;
                            break;
                        }
                    }
                }
            }
            break;
        }
        case WM_PAINT:
        {
            hdc = BeginPaint(hWnd, &ps);
                register int    BufWidth = XStartPos + ((WidthGrid - XStartPos) / StepGrid) * StepGrid + 1, 
                        BufHeight =YStartPos + ((HeightGrid - YStartPos) / StepGrid) * StepGrid;
                for(register int i = XStartPos; i <= BufWidth; i += StepGrid) DrawLine(hdc, i, YStartPos, i, BufHeight);
                for(register int i = YStartPos; i <= BufHeight; i += StepGrid) DrawLine(hdc, XStartPos, i, BufWidth, i);
            EndPaint(hWnd, &ps);
            break;
        }
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            break;
        }
        default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
1
16.12.2013, 01:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2013, 01:06
Помогаю со студенческими работами здесь

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

Рисование Рисование точек по координатам
Доброе время суток. Помогите мне наглядным примером. У меня есть массив координат a х у 1 2 3...

Рисование по нажатию кнопкой
Как по нажатию кнопки &quot;добавить сеанс&quot;, рисовалась выделенная область(включая кнопки и макросы,...

Рисование по нажатию кнопки
Читая самоучитель я дошел до рисования (наконец то!), но кое чего не понял: В заголовочной файле я...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru