Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
1

Изменить цвет квадрата при нажатии

01.05.2012, 17:36. Показов 4348. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Только начал освоение WInAPI. Была поставлена задача: по нажатию левой кнопкой мыши закрасить определенный квадрат. Столкнулся со следующей проблемой:
Не срабатывает функция WM_PALETTECHANGED.
Вот код:
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT r0;
    RECT rect;
 
    HBRUSH brush;
    int dW, dH, i, j;
    int index = 0;
        
    PALETTEENTRY pal[256];
 
    switch (uMsg)
    {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        
        GetSystemPaletteEntries(hDC, 0, 256, pal);
 
        GetClientRect(hWnd, &r0);
        dW = (r0.right - 1) / 3;
        dH = (r0.bottom - 1) / 3;
        SetViewportOrgEx(hDC, 2, 2, NULL);
 
        for (i = 0; i < 3; ++i)
            for (j = 0; j < 3; ++j) {
                SetRect(&rect, j*dW, i*dH, (j+1)*dW - 1, (i+1)*dH - 1);
                brush = CreateSolidBrush(RGB(255,
                        255, 255));
                FillRect(hDC, &rect, brush);
                DeleteObject(brush);
                index++;
            }
    
        EndPaint(hWnd, &ps);
        break;
    
    case WM_PALETTECHANGED:
        InvalidateRect(hWnd, NULL, TRUE);
        break;
 
    case WM_LBUTTONDOWN: 
        pal[1].peRed = 255;
                        pal[1].peGreen = 0;
                        pal[1].peBlue = 0;
        break; 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
Как я понял: Когда мы меняем значение элемента матрицы pal должен срабатывать WM_PALETTECHANGED. Так ли это?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.05.2012, 17:36
Ответы с готовыми решениями:

Как изменить цвет кнопки при нажатии?
Доброго времени суток. Ребята, подскажите пожалуйста как изменить цвет кнопки при нажатии?

Изменить цвет символов на следующий в палитре цветов при нажатии левой кнопки мыши
Всем привет! Задание: Изменить цвет символов на следующий в палитре цветов при нажатии левой кнопки мыши. Выход из программы –...

Изменить цвет эллипса при его попадании в квадрат
Очень нужна помощь реализовал движение эллипса но никак не выходит реализовать изменение цвета эллипса при попадании в другую...

7
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
01.05.2012, 23:11 2
Не так. С какой стати система сама по себе должна реагировать на изменение значения переменной?

Может тебе надо использовать SetPaletteEntries для уведомления системы о том что палитра изменилась!?
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
05.05.2012, 00:12  [ТС] 3
Если не трудно, то подскажите, пожалуйста, что в моем случае будет HPalette, который есть
в функции SetPaletteEntries(Palette: HPalette; StartIndex, NumEntries: Word; var PaletteEntries): Word;
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
08.05.2012, 22:36 4
Цитата Сообщение от EdarGp Посмотреть сообщение
Если не трудно, то подскажите, пожалуйста, что в моем случае будет HPalette, который есть
в функции SetPaletteEntries(Palette: HPalette; StartIndex, NumEntries: Word; var PaletteEntries): Word;
Результат выполнения функции CreatePalette(...) или CreateHalftonePalette(...).

Очень хочется спросить, зачем ты вообще пользуешься палитрой?
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
11.05.2012, 21:31  [ТС] 5
Переделал так, но вес равно квадрат не меняет цвет =(
C++ (Qt)
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
//////////////////////////////////////////////////////////////////////
// SystemPalette.cpp
 
#include <windows.h>
#include "KWnd.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd("System palette", hInstance, nCmdShow, WndProc, NULL, 0, 0, 524, 543); 
 
    while (GetMessage(&msg, NULL, 0, 0))  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
//////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT r0;
    RECT rect[8];
    
 
    static HBRUSH brush[8];
 
    COLORREF rgbColor[9] = { RGB(128,0,0), RGB(192,0,0),RGB(255,0,0),
                        RGB(255,192,0), RGB(176,250,133), RGB(245,197,137),
                        RGB(255,128,128), RGB(255,128,255),RGB(255,128,255)};
    int dW, dH, i, j;
    int index = 0;
        
    PALETTEENTRY pal[256];
 
    switch (uMsg)
    {
    case WM_CREATE:
        hDC = GetDC(hWnd);
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);        
        
 
        GetClientRect(hWnd, &r0);
        dW = (r0.right - 1) / 3;
        dH = (r0.bottom - 1) / 3;
        SetViewportOrgEx(hDC, 2, 2, NULL);
        for (i = 0; i < 9; ++i)
            brush[i] = CreateSolidBrush(rgbColor[i]);
        for (i = 0; i < 3; ++i)
            for (j = 0; j < 3; ++j) {
                SetRect(&rect[i], j*dW, i*dH, (j+1)*dW - 1, (i+1)*dH - 1);              
                FillRect(hDC, &rect[i], brush[i]);
                DeleteObject(brush);
                index++;
            }
    
        EndPaint(hWnd, &ps);
        break;
    
    case WM_PALETTECHANGED:
        InvalidateRect(hWnd, NULL, TRUE);
        break;
 
    case WM_LBUTTONDOWN:
                rgbColor[1] = RGB(0,0,0);
        brush[1] = CreateSolidBrush(RGB(0,0,0));
        break; 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.05.2012, 21:48 6
Где-то я уже это писал:
Цитата Сообщение от lazybiz Посмотреть сообщение
С какой стати система сама по себе должна реагировать на изменение значения переменной?
Я имею в виду нажатие левой кнопки мыши.

Цитата Сообщение от lazybiz Посмотреть сообщение
Очень хочется спросить, зачем ты вообще пользуешься палитрой?
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
11.05.2012, 22:00  [ТС] 7
Палитрой уже не пользуюсь.

C++ (Qt)
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
//////////////////////////////////////////////////////////////////////
// SystemPalette.cpp
 
#include <windows.h>
#include "KWnd.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd("System palette", hInstance, nCmdShow, WndProc, NULL, 0, 0, 524, 543); 
 
    while (GetMessage(&msg, NULL, 0, 0))  {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
//////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT r0;
    RECT rect[8];
    
 
    static HBRUSH brush[8];
 
    COLORREF rgbColor[9] = { RGB(128,0,0), RGB(192,0,0),RGB(255,0,0),
                        RGB(255,192,0), RGB(176,250,133), RGB(245,197,137),
                        RGB(255,128,128), RGB(255,128,255),RGB(255,128,255)};
    int dW, dH, i, j;
    int index = 0;
        
 
    switch (uMsg)
    {
    case WM_CREATE:
        hDC = GetDC(hWnd);
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);        
        
 
        GetClientRect(hWnd, &r0);
        dW = (r0.right - 1) / 3;
        dH = (r0.bottom - 1) / 3;
        SetViewportOrgEx(hDC, 2, 2, NULL);
        for (i = 0; i < 9; ++i)
            brush[i] = CreateSolidBrush(rgbColor[i]);
        for (i = 0; i < 3; ++i)
            for (j = 0; j < 3; ++j) {
                SetRect(&rect[i], j*dW, i*dH, (j+1)*dW - 1, (i+1)*dH - 1);              
                FillRect(hDC, &rect[i], brush[i]);
                DeleteObject(brush);
                index++;
            }
    
        EndPaint(hWnd, &ps);
        break;
    
    case WM_PALETTECHANGED:
        InvalidateRect(hWnd, NULL, TRUE);
        break;
 
    case WM_LBUTTONDOWN:
                rgbColor[1] = RGB(0,0,0);
        brush[1] = CreateSolidBrush(RGB(0,0,0));
        break; 
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return 0;
}
SetPaletteEntries в данном случае не знаю как применить...
Помогите, пожалуйста, уже 2 недели не могу эту задачку сделать =(
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.05.2012, 22:15 8
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
#include <windows.h>
 
#define             W               640
#define             H               480
 
static char *       g_szClass       = "test_cls_32";
static HWND         g_hWnd;
static RECT         g_rc            = { 50, 50, W - 50, H - 50 };
static HBRUSH       g_brush[2];
static int          g_phase         = 0;
 
static LRESULT CALLBACK wnd_proc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    PAINTSTRUCT     ps;
 
    switch ( uMsg ) {
        case WM_CREATE:
            g_brush[0] = (HBRUSH)GetStockObject( BLACK_BRUSH );
            g_brush[1] = (HBRUSH)GetStockObject( GRAY_BRUSH );
            break;
 
        case WM_PAINT:
            BeginPaint( hWnd, &ps );
            FillRect( ps.hdc, &g_rc, g_brush[g_phase] );
            EndPaint( hWnd, &ps );
            break;
 
        case WM_LBUTTONDOWN:
            g_phase ^= 1;
            InvalidateRect( hWnd, NULL, FALSE );
            break;
 
        case WM_DESTROY:
            PostQuitMessage( 0 );
            break;
 
        default:
            return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }
    return 0;
}
 
int CALLBACK WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASS    wc;
    memset( &wc, 0, sizeof( WNDCLASS ) );
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = wnd_proc;
    wc.hInstance     = hInst;
    wc.hCursor       = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = g_szClass;
    RegisterClass( &wc );
 
    g_hWnd = CreateWindow( g_szClass, "test",
            WS_SYSMENU | WS_MINIMIZEBOX,
            (GetSystemMetrics( SM_CXSCREEN ) / 2) - (W / 2),
            (GetSystemMetrics( SM_CYSCREEN ) / 2) - (H / 2),
            W, H, NULL, NULL, hInst, NULL );
 
    ShowWindow( g_hWnd, SW_SHOW );
    UpdateWindow( g_hWnd );
 
    MSG msg;
    while ( GetMessage( &msg, NULL, 0, 0 ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
 
    DestroyWindow( g_hWnd );
    UnregisterClass( g_szClass, hInst );
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.05.2012, 22:15
Помогаю со студенческими работами здесь

Как изменить цвет при выделении текста в richedit на delphi
Подскажите, пожалуйста. Как изменить цвет(по умолчанию он черный или синий) при выделении текста в richedit на delphi. Заранее спасибо.

Как изменить код, выполняющийся при нажатии на крестик?
Или как этот самый крестик убрать? Дело в том, что в программе есть такая строка: atexit(OnQuit); И в OnQuit происходят...

Светофор, в котором цвет "зажигается" при нажатии на лампу левой клавишей мыши
Нарисовать светофор, в котором цвет «зажигается» при нажатии на эту лампу левой клавишей мыши. Одновременно может гореть только один...

При нажатии кнопки закрытия окна, оно должно сворачиваться, а при нажатии на сворачивание - закрываться
привет всем)) задача такая: при нажатии кнопки закрытия окна, оно должно сворачиваться, а при нажатии на сворачивание - закрываться)) с...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru