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

При нажатии на прямоугольник, менять цвет

18.09.2019, 22:45. Показов 3220. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть задание. Всего на рабочей области 4 прямоугольника, при нажатии на прямоугольник, тот начинает менять цвета(зеленый-красный-синий-зеленый-...), т.е. циклично меняет цвет, пока не закрою программу, при нажатии на остальные прямоугольники должно происходить то же самое. Координаты считываю с файла. Так вот, сделал часть с считывания координат и постройкой прямоугольников, не знаю, как менять цвет. Пробовал использовать WM_LBUTTONDOWN, но что-то не помогло. Помогите пожалуйста.
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HDC hdc;
RECT rect;
HWND hMainWnd;
HBRUSH brush;
static HDC secondHdc;
UINT nIDEvent;
int selected_mark = 0;
PAINTSTRUCT ps;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    WNDCLASSEX wc;
 
    char szClassName[] = "AppClass";
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    /*****************************************************************************************************************************/
    if (!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Не удалось зарегистрировать класс окна", "Ошибка", MB_OK);
        return 0;
    }
 
    hMainWnd = CreateWindow(szClassName, "Программа", WS_SYSMENU | WS_MINIMIZEBOX, 0, 0, 1000, 1000, NULL, NULL, hInstance, NULL);
 
    if (!hMainWnd) {
        MessageBox(NULL, "Не удалось создать главное окно программы", "Ошибка", MB_OK);
        return 0;
    }
    ShowWindow(hMainWnd, nCmdShow);
    /*Функция GetMessage возвращает FALSE, если получит сообщение WM_QUIT. Во всех остальных случаях она вернёт TRUE.*/
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
    case WM_CREATE: {
        hdc = GetDC(hWnd);
        ReleaseDC(hWnd, hdc);
    }
    case WM_PAINT: {
        int x1, y1, x2, y2;
        ifstream fin;
        fin.open("text.txt");
        hdc = BeginPaint(hWnd, &ps);
        brush = CreateSolidBrush(RGB(250, 0, 0));
        for (int i = 0; i < 4; i++) {
            fin >> x1 >> y1 >> x2 >> y2;
            rect = { x1,y1,x2,y2 };
            FillRect(hdc, &rect, brush);
        } 
        fin.close();
        EndPaint(hWnd, &ps);
        break;
    }
    case WM_LBUTTONDOWN: {
        POINT point;
        GetCursorPos(&point);
        ifstream fin;
        fin.open("text.txt");
        int x1, y1, x12, y12, x2, y2, x22, y22, x3, y3, x32, y32, x4, y4, x42, y42;
        fin >> x1 >> y1 >> x12 >> y12 >> x2 >> y2 >> x22 >> y22 >> x3 >> y3 >> x32 >> y32 >> x4 >> y4 >> x42 >> y42;
        fin.close();
        if (point.x > x1 && point.y > y1 && point.x < x12 && point.y < y12) {
                
        }
        else if (point.x > x2 && point.y > y2 && point.x < x22 && point.y < y22) {
 
        }
        else if (point.x > x3 && point.y > y3 && point.x < x32 && point.y < y32) {
 
        }
        else if (point.x > x4 && point.y > y4 && point.x < x42 && point.y < y42) {
 
        }
        break;
    }
 
    case WM_CLOSE: {
        DestroyWindow(hWnd);    //посылает окну сообщение WM_DESTROY, после которого окна на экране уже нет
        break;
    }
    case WM_DESTROY: {
        PostQuitMessage(0);     //посылает сообщение WM_QUIT, после которого прекращается цикл обработки сообщений
        break;
    }
    default: {
        return DefWindowProc(hWnd, uMsg, wParam, lParam); //обработка сообщений по умолчанию
    }
    }
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.09.2019, 22:45
Ответы с готовыми решениями:

Прямоугольник перестаёт менять цвет
Здравствуйте. Я сделал программу, которая рисует прямоугольник какого-нибудь цвета. При нажатии левой кнопки мыши моя фигура меняет цвет....

При нажатии на зеленую кнопку: цвет фона менять на зеленый
помогите сделать так,что бы при нажетии на зеленую кнопку цвет фона менялся на зеленый

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

1
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
19.09.2019, 10:09
Лучший ответ Сообщение было отмечено LomionDK как решение

Решение

Вместе с сообщением WM_LBUTTONDOWN передаются координаты мыши. Не нужно запрашивать координаты отдельно. Если же запрашиваете координаты отдельно, то возможно нужно ещё переводить значения из глобальных координат в локальные координаты окна.
C++
1
2
case WM_LBUTTONDOWN: {
        POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
Для проверки попадания точки в прямоугольник есть готовая функция PtInRect, с ней код компактней будет выглядеть.

Я бы создал несколько разноцветных кистей сразу в WM_CREATE, а не создавал их каждый раз при рисовании. Ещё бы, наверное, сделал отдельную структуру для закрашиваемых прямоугольников. В ней разместил бы координаты и текущий цвет. Координаты можно прочесть единожды, что бы не заниматься перечитыванием файла каждый раз. В обработчике нажатия кнопки изменял бы значение цвета в структуре и вызывал штатную перерисовку с помощью InvalidateRect.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2019, 10:09
Помогаю со студенческими работами здесь

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

Программа должна при нажатии на кнопку выводить в метку площадь, а орнамент - менять цвет
На счёт площади вопросов нет, но как сделать чтобы орнамент цвет менял(там 12 меток). Пробовала присвоить цвет сумме меткок.цвет но...

Как сделать кнопки, каждая из которых будет менять цвет фона документа при нажатии?
Помогите!!! Не могу справиться!!!! Нужно написать программу с использованием двух языков: html и javascript. Задание такое: a. При...

Как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка?
Здравствуйте, подскажите, пожалуйста, как изменить цвет пункта ListView при нажатии на него и сохранять его цвет при проматывании списка? ...

Как поменять цвет кнопки при ее нажатии, а при наведении чтоб цвет не менялся?
//css файл .mymegabutton{ background: blue; } .hvr{ background: green; } .act{ background: green !important; }


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru