Пользователь
Регистрация: 24.02.2019
Сообщений: 33
|
При нажатии на прямоугольник, менять цвет WinApi
Здравствуйте, есть задание. Всего на рабочей области 4 прямоугольника, при нажатии на прямоугольник, тот начинает менять цвета(зеленый-красный-синий-зеленый-...), т.е. циклично меняет цвет, пока не закрою программу, при нажатии на остальные прямоугольники должно происходить то же самое. Координаты считываю с файла. Так вот, сделал часть с считывания координат и постройкой прямоугольников, не знаю, как менять цвет. Пробовал использовать WM_LBUTTONDOWN, но что-то не помогло. Помогите пожалуйста.
Код:
Код:
#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;
}
|