Форум программистов, компьютерный форум, киберфорум
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. Показов 4346. Ответов 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
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Осваиваем Kubernetes: Подробная шпаргалка
Mr. Docker 15.03.2025
Kubernetes — это открытая платформа для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Он был создан для решения проблем, с которыми сталкиваются. . .
Лучшие PHP REST API фреймворки
Jason-Webb 15.03.2025
Современные PHP REST API фреймворки предлагают большой набор функциональности: от автоматической валидации данных и управления маршрутизацией до генерации документации и интеграции с различными. . .
Многопоточность в Java с Project Loom: виртуальные или обычные потоки
Javaican 15.03.2025
Многопоточность всегда была одноим из основных элементов в разработке современного программного обеспечения. Она позволяет приложениям обрабатывать несколько задач одновременно, что критично для. . .
Что нового в Swift 6 и особенности миграции
mobDevWorks 15.03.2025
Swift 6 — это новый крупный релиз языка программирования от Apple, анонсированный на WWDC 2024. Если вы следили за эволюцией Swift, то наверняка заметили, что многие значимые возможности, которые. . .
Вопросы на собеседовании по Android
mobDevWorks 14.03.2025
По данным статистики, Android занимает более 70% мирового рынка мобильных операционных систем, что делает платформу привлекательной как для начинающих разработчиков, так и для опытных профессионалов. . . .
Лучшие игровые движки для Python
py-thonny 14.03.2025
Python обеспечивает разработчиков игр мощными движками и фреймворками, которые позволяют воплотить практически любую идею — от простой аркады до визуального романа с разветвленным сюжетом. Главное. . .
Бессерверный JavaScript: Разработка масштабируемых API с AWS Lambda
run.dev 14.03.2025
Но что такое бессерверные вычисления на самом деле? По сути, это модель облачных вычислений, где разработчик фокусируется исключительно на создании бизнес-логики, не тратя время на настройку. . .
Безопасность кода в C++26: Менеджеры ресурсов и висячие ссылки
NullReferenced 14.03.2025
C++ всегда был языком, предоставляющим разработчикам большие возможности и гибкость, но вместе с тем требующим ответственности. Одной из самых коварных проблем даже для опытных программистов остаются. . .
smart-agent proper interface settings (2025)
jigi33 14.03.2025
Smart-agent proper interface settings (mart 2025). (see screenshots to look at "Etalon" ARM)
Продвинутые настройки JVM
Javaican 14.03.2025
Стандартные параметры запуска JVM хороши для повседневной разработки, но совершенно недостаточны для высоконагруженных систем. Представьте, что вы запускаете финансовую платформу, обрабатывающую. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер