Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 708

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

19.03.2018, 14:44. Показов 1433. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте. Я сделал программу, которая рисует прямоугольник какого-нибудь цвета. При нажатии левой кнопки мыши моя фигура меняет цвет. Проблема в том, что когда я много раз нажимаю на кнопку, прямоугольник перестаёт меняться. То же самое происходит, когда сворачиваю окно несколько раз. Вот мой код:
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
118
119
120
121
122
123
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;                 
POINT ptClientUL;             
POINT ptClientLR;              
static POINTS ptsBegin;       
static POINTS ptsEnd;         
static POINTS ptsPrevEnd;      
static BOOL fPrevLine = FALSE; 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = "WinApi";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
return(msg.wParam); 
 
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    HDC hDC,hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    HBITMAP hOldBitmap,hCompatibleBitmap;
    HPEN hOldPen;
    static HPEN Pens[2];
    HBRUSH hOldBrush;
    static HBRUSH Brushes[5];
    static long int colorRect=0;
    Brushes[0]=(CreateSolidBrush(RGB(255,0,0)));
    Brushes[1]=(CreateSolidBrush(RGB(0,255,0)));
    Brushes[2]=(CreateSolidBrush(RGB(0,0,255)));
    Brushes[3]=(CreateSolidBrush(RGB(255,0,102)));
    Brushes[4]=(CreateSolidBrush(RGB(255,255,0)));
    Pens[0]=(CreatePen(0,1,RGB(255,255,255)));
    Pens[1]=(CreatePen(0,7,RGB(0,0,0)));
    switch(message)
    {
        case WM_PAINT:
                GetClientRect(hWnd,&Rect); 
                hDC=BeginPaint(hWnd,&PaintStruct); 
                hCompatibleDC=CreateCompatibleDC(hDC); 
                hCompatibleBitmap=CreateCompatibleBitmap(hDC,Rect.right,Rect.bottom); 
                hOldBitmap=(HBITMAP)SelectObject(hCompatibleDC,hCompatibleBitmap); 
                PatBlt(hCompatibleDC, 0,0,Rect.right,Rect.bottom, PATCOPY); 
 
                hOldBrush=(HBRUSH)SelectObject(hCompatibleDC,Brushes[0]);
                Rectangle(hCompatibleDC,10,90,410,410);
                BitBlt(hDC,
                        PaintStruct.rcPaint.left,
                        PaintStruct.rcPaint.top, 
                        PaintStruct.rcPaint.right,
                        PaintStruct.rcPaint.bottom, 
                        hCompatibleDC, 
                        PaintStruct.rcPaint.left,
                        PaintStruct.rcPaint.top,
                        SRCCOPY);
                SelectObject(hCompatibleDC,hOldBitmap);
                DeleteObject(hCompatibleBitmap);
                DeleteDC(hCompatibleDC);
                EndPaint(hWnd,&PaintStruct);
                return 0;
        case WM_LBUTTONDOWN:
                  WORD xPos, yPos;
                  xPos = LOWORD(lParam);
                  yPos = HIWORD(lParam);
                  hDC = GetDC(hWnd); 
                  if ((xPos>=10 && xPos<=410) && (yPos>=10 && yPos<=410)) 
                  {
                    hOldBrush=(HBRUSH)SelectObject(hDC,Brushes[colorRect]);
                    hOldPen=(HPEN)SelectObject(hDC,Pens[1]);
                    Rectangle(hDC,10,10,410,410);
                    if (colorRect!=4) colorRect++;
                    else colorRect=0;
                  }             
                  ReleaseDC(hWnd, hDC); 
                  return 0;
        case WM_DESTROY:
            exit(1);
                return 0;
    }
    return DefWindowProc(hWnd,message,wParam,lParam);
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2018, 14:44
Ответы с готовыми решениями:

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

Нарисовать фигуру и менять её цвет и ширину линий
#define STRICT #include &lt;windows.h&gt; #include &lt;mem.h&gt; #define CM_RED 10 #define CM_GREEN 9 #define...

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

6
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
19.03.2018, 15:59
Через некоторое время работы программы строки с 70 по 76 съедают все доступные GDI, после чего отрисовка умирает.
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 708
19.03.2018, 16:15  [ТС]
Ygg, можно ли это исправить и как?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
19.03.2018, 16:21
Можно, достаточно перестать создавать GDI объекты при каждом вызове оконной функцию (WindowProc).
C++
1
2
3
4
5
6
7
8
9
10
11
    static HBRUSH Brushes[5] = {0};
    if (!Brushes[0])
    {
        Brushes[0]=(CreateSolidBrush(RGB(255,0,0)));
        Brushes[1]=(CreateSolidBrush(RGB(0,255,0)));
        Brushes[2]=(CreateSolidBrush(RGB(0,0,255)));
        Brushes[3]=(CreateSolidBrush(RGB(255,0,102)));
        Brushes[4]=(CreateSolidBrush(RGB(255,255,0)));
        Pens[0]=(CreatePen(0,1,RGB(255,255,255)));
        Pens[1]=(CreatePen(0,7,RGB(0,0,0)));
    }
0
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 708
19.03.2018, 16:27  [ТС]
Ygg, а можете пожалуйста дать полный код?
0
2735 / 890 / 331
Регистрация: 10.02.2018
Сообщений: 2,111
19.03.2018, 16:36
Лучший ответ Сообщение было отмечено Sasha38 как решение

Решение

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
118
119
120
121
122
123
124
125
126
#include <windows.h>
#include <math.h>
#include <string>
#include <sstream>
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
unsigned int lineWidth = 1;
COLORREF lineColor = RGB(0, 0, 0);
HDC hDC;
RECT rcClient;
POINT ptClientUL;
POINT ptClientLR;
static POINTS ptsBegin;
static POINTS ptsEnd;
static POINTS ptsPrevEnd;
static BOOL fPrevLine = FALSE;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 
 
 
    WNDCLASSEX WindowClass;
 
    static LPCTSTR szAppName = "WinApi";
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(0, IDI_HAND);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = 0;
    wc.lpszClassName = szAppName;
    wc.hIconSm = 0;
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow(szAppName, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    //hDC = GetDC(hWnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return(msg.wParam);
 
}
 
LRESULT WINAPI WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 
    HDC hDC, hCompatibleDC;
    PAINTSTRUCT PaintStruct;
    RECT Rect;
    HBITMAP hOldBitmap, hCompatibleBitmap;
    HPEN hOldPen;
    static HPEN Pens[2];
    HBRUSH hOldBrush;
    static HBRUSH Brushes[5] = { 0 };
    static long int colorRect = 0;
    if (!Brushes[0])
    {
        Brushes[0] = (CreateSolidBrush(RGB(255, 0, 0)));
        Brushes[1] = (CreateSolidBrush(RGB(0, 255, 0)));
        Brushes[2] = (CreateSolidBrush(RGB(0, 0, 255)));
        Brushes[3] = (CreateSolidBrush(RGB(255, 0, 102)));
        Brushes[4] = (CreateSolidBrush(RGB(255, 255, 0)));
        Pens[0] = (CreatePen(0, 1, RGB(255, 255, 255)));
        Pens[1] = (CreatePen(0, 7, RGB(0, 0, 0)));
    }
    switch (message)
    {
    case WM_PAINT:
        GetClientRect(hWnd, &Rect);
        hDC = BeginPaint(hWnd, &PaintStruct);
        hCompatibleDC = CreateCompatibleDC(hDC);
        hCompatibleBitmap = CreateCompatibleBitmap(hDC, Rect.right, Rect.bottom);
        hOldBitmap = (HBITMAP)SelectObject(hCompatibleDC, hCompatibleBitmap);
        PatBlt(hCompatibleDC, 0, 0, Rect.right, Rect.bottom, PATCOPY);
 
        hOldBrush = (HBRUSH)SelectObject(hCompatibleDC, Brushes[0]);
        Rectangle(hCompatibleDC, 10, 90, 410, 410);
        BitBlt(hDC,
            PaintStruct.rcPaint.left,
            PaintStruct.rcPaint.top,
            PaintStruct.rcPaint.right,
            PaintStruct.rcPaint.bottom,
            hCompatibleDC,
            PaintStruct.rcPaint.left,
            PaintStruct.rcPaint.top,
            SRCCOPY);
        SelectObject(hCompatibleDC, hOldBitmap);
        DeleteObject(hCompatibleBitmap);
        DeleteDC(hCompatibleDC);
        EndPaint(hWnd, &PaintStruct);
        return 0;
    case WM_LBUTTONDOWN:
        WORD xPos, yPos;
        xPos = LOWORD(lParam);
        yPos = HIWORD(lParam);
        hDC = GetDC(hWnd);
        if ((xPos >= 10 && xPos <= 410) && (yPos >= 10 && yPos <= 410))
        {
            hOldBrush = (HBRUSH)SelectObject(hDC, Brushes[colorRect]);
            hOldPen = (HPEN)SelectObject(hDC, Pens[1]);
            Rectangle(hDC, 10, 10, 410, 410);
            if (colorRect != 4) colorRect++;
            else colorRect = 0;
        }
        ReleaseDC(hWnd, hDC);
        return 0;
    case WM_DESTROY:
        exit(1);
        return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}
1
0 / 33 / 5
Регистрация: 01.12.2017
Сообщений: 708
19.03.2018, 16:45  [ТС]
Ygg, вроде работает. Огромное спасибо Вам! Вы мне очень помогли!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2018, 16:45
Помогаю со студенческими работами здесь

Как менять цвет фона и цвет надписи кнопки?
Есть кнопка, хочу произвольно менять цвет фона и цвет надписи(в зависимости от цвета кнопки). Если прописать...

Циклически менять цвет подложки консоли
По заданию, пользователем вводятся номера цветов подложки(5 штук, записываются к примеру в массив), и после при каждом нажатии Enter цвет...

Менять цвет окна через ColorBox
Как при помощи данной функции менять цвет окна? Что бы выбрал цвет из этого меню с цветами, и этот цвет стал цветом фона.

C++ 2 шарика должны отталкиваться от стенок и менять цвет
Как сделать 2 шарика без добавления второго void? В чем ошибка ???(впервые задаю тему) #include &quot;TXLib.h&quot; #include...

Как менять цвет фрагмента текста в RichEdit?
Я пишу программу, в которой нужно, чтоб в RichEdit определенные символы становились другого цвета. То есть, например, в RichEdit...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru