Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386

Изменение цвета кнопки при наведении курсора

16.05.2015, 16:59. Показов 6372. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как средствами c++ сделать так чтобы при наведении на кнопку(как hover в CSS) она меняла свой цвет
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2015, 16:59
Ответы с готовыми решениями:

OnMouseMove Изменение цвета фона окна программы при помещении курсора в прямоугольник с соответствующим цветом
Помогите изменить вопросный блок кода (см. внизу) OnMouseMove для "Изменения цвета фона окна программы при помещении курсора в...

Изменение цвета при наведении курсора
Всем, привет. Всем здравствуйте. Уважаемые гуру CSS. Need your help!!! В чем заключается вопрос. Нужна анимация ". Изменение цвета при...

Изменение цвета и текста при наведении курсора мыши
Добрый вечер. Вот такой вот вопрос: "Как менять одновременно цвет и текст при наведении курсора мыши?" Вот код: ...

7
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
16.05.2015, 18:59
тыц
1
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
17.05.2015, 11:03  [ТС]
jonson, спасибо, как сделать это с картинками я понял, а как задать в lpdrawiremstruct цвет? Можно пример
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
17.05.2015, 14:27
Лучший ответ Сообщение было отмечено programmist99 как решение

Решение

Цитата Сообщение от programmist99 Посмотреть сообщение
а как задать в lpdrawiremstruct цвет?
DRAWITEMSTRUCT это структура которая содержит все необходимые данные чтобы определить какое событие произошло и как перерисовать контрол. Тебе в эту структуру вносить ничего не нужно, она отсылается системой, а ловить её нужно в WM_DRAWITEM.
Чтобы заполнить кнопку определенным цветом а не картинкой, делается все так же, просто вместо битмапа заполняем область кистью с нужным цветом.
Цитата Сообщение от programmist99 Посмотреть сообщение
Можно пример
примерно так:
Кликните здесь для просмотра всего текста
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
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH brushNoActive;
    static HBRUSH brushFocus;
    static HBRUSH brushSelect;
    LPDRAWITEMSTRUCT pdis;
    HBITMAP bm_owner;
    static HDC hDC_owner; 
 
    switch (msg)
    {   
    case WM_DRAWITEM:
        {
            HGDIOBJ oldBrush;
            pdis = (LPDRAWITEMSTRUCT) lParam;
            hDC_owner = CreateCompatibleDC(pdis->hDC); // контекст в памяти
            bm_owner = CreateCompatibleBitmap(pdis->hDC, pdis->rcItem.right, pdis->rcItem.bottom); // ширина и высота области равна кнопке
            oldBrush = SelectObject(hDC_owner, bm_owner);
            FillRect(hDC_owner, &pdis->rcItem, brushNoActive); // сразу заполним кистью "по умолчанию"
 
            switch (pdis->itemAction)
            {   
            case ODA_FOCUS:
                if (pdis->itemState & ODS_FOCUS)        
                    FillRect(hDC_owner, &pdis->rcItem, brushFocus );
                if (pdis->itemState & ODS_CHECKED)
                    FillRect(hDC_owner, &pdis->rcItem, brushNoActive );
                break;
 
            case ODA_SELECT:
                if (pdis->itemState & ODS_SELECTED)
                    FillRect(hDC_owner, &pdis->rcItem, brushSelect );
                break;        
 
            case ODA_DRAWENTIRE:  
                FillRect(hDC_owner, &pdis->rcItem, brushNoActive );
                break;   
            } 
            // отрисовуем кнопку (из памяти на экран)
            BitBlt(pdis->hDC, 0,0, pdis->rcItem.right, pdis->rcItem.bottom, hDC_owner,0,0, SRCCOPY);
            // освободим память 
            DeleteObject(SelectObject(hDC_owner, oldBrush));
            DeleteDC(hDC_owner);
            return true;
        }   
 
    case WM_CREATE:
        // ownerdraw brushes
        brushNoActive = CreateSolidBrush(RGB(255,0,0));
        brushFocus = CreateSolidBrush(RGB(0,255,0));
        brushSelect = CreateSolidBrush(RGB(0,0,255));
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0); 
        break;
 
    case WM_SETCURSOR:  // отслеживание фокуса ввода для курсора мыши
        if ((HWND)wParam == wnd)    
            SetFocus(wnd); // курсор на кнопке
        else if ((HWND)wParam != wnd) 
            SetFocus(w_hMainWnd); // курсор Не на кнопке
        return false;
 
    default:
        return DefWindowProc(hWnd, msg, wParam, lParam);
    }
    return 0;
}
1
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
18.05.2015, 18:09  [ТС]
jonson, Большое спасибо, все хорошо, при нажатии цвет меняется, но при наведении - нет
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
#include<Windows.h>
#define ID_MYBUTTON 1
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
HWND hWnd, My;
char Class[] = "MyWindow";
void MyButton(HWND hwnd, int x, int y, int Width, int Height, int xe, int xy, HWND hParent)
{
    hwnd = CreateWindow("button", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | BS_OWNERDRAW | BS_PUSHBUTTON, x, y, Width, Height, hParent, (HMENU)ID_MYBUTTON, NULL, NULL);
    HRGN rgn = CreateRoundRectRgn(0, 0, Width, Height, xe, xy);
    SetWindowRgn(hwnd, rgn, TRUE);
}
void DrawButton(LPDRAWITEMSTRUCT lpInfo)
{
    HGDIOBJ obj;
    HBRUSH noactive = CreateSolidBrush(RGB(255, 0, 0)), focus = CreateSolidBrush(RGB(0, 255, 0)), select = CreateSolidBrush(RGB(0, 0, 255));
    HBITMAP bm;
    HDC Owner;
    Owner = CreateCompatibleDC(lpInfo->hDC);
    bm = CreateCompatibleBitmap(lpInfo->hDC, lpInfo->rcItem.right, lpInfo->rcItem.bottom);
    obj = SelectObject(Owner, bm);
    FillRect(Owner, &lpInfo->rcItem, noactive);
    switch (lpInfo->itemAction)
    {
    case ODA_FOCUS:
        if (lpInfo->itemState & ODS_FOCUS)
            FillRect(Owner, &lpInfo->rcItem, focus);
        if (lpInfo->itemState & ODS_CHECKED)
            FillRect(Owner, &lpInfo->rcItem, noactive);
        break;
    case ODA_SELECT:
        if (lpInfo->itemState & ODS_SELECTED)
            FillRect(Owner, &lpInfo->rcItem, select);
        break;
    case ODA_DRAWENTIRE:
        FillRect(Owner, &lpInfo->rcItem, noactive);
        break;
    }
    BitBlt(lpInfo->hDC, 0, 0, lpInfo->rcItem.right, lpInfo->rcItem.bottom, Owner, 0, 0, SRCCOPY);
    DeleteObject(SelectObject(Owner, obj));
    DeleteDC(Owner);
}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{
    WNDCLASSEX wc;
    wc.cbClsExtra = 0;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)CreateSolidBrush(0x3366AA);
    wc.hCursor = NULL;
    wc.hIcon = NULL;
    wc.hIconSm = NULL;
    wc.hInstance = hInst;
    wc.lpfnWndProc = WinProc;
    wc.lpszClassName = Class;
    wc.lpszMenuName = NULL;
    wc.style = CS_DBLCLKS;
    if (!RegisterClassEx(&wc))
        return 0;
    hWnd = CreateWindowEx(NULL, Class, "Window", WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION, 0, 0, 800, 500, NULL, NULL, NULL, NULL);
    MyButton(My, 10, 10, 100, 30, 20, 20, hWnd);
    ShowWindow(hWnd, SW_SHOW);
    MSG msg;
    while (GetMessage(&msg, hWnd, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CLOSE:
    {
        PostQuitMessage(0);
        return 0;
    }
    break;
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    break;
    case WM_DRAWITEM:
    {
        DrawButton((LPDRAWITEMSTRUCT)lParam);
        return true;
    }
    break;
    case WM_SETCURSOR:
    {
        if ((HWND)wParam == My)
        {
            SetFocus(My);
        }
        else if ((HWND)wParam != My)
        {
            SetFocus(hWnd);
        }
        return false;
    }
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
        break;
    }
    return 0;
}
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
18.05.2015, 19:39
Цитата Сообщение от programmist99 Посмотреть сообщение
при нажатии цвет меняется, но при наведении - нет
в MyButton() используй ссылку на кнопку (HWND My)
C++
1
void MyButton(HWND & hwnd, int x, int y, int Width, int Height, int xe, int xy, HWND hParent)
Добавлено через 18 минут
Цитата Сообщение от programmist99 Посмотреть сообщение
while (GetMessage(&msg, hWnd, 0, 0))
Есть мнение, что второй параметр должен быть NULL, потому что тебе нужно извлекать из очереди сообщения для всех окон.
1
55 / 55 / 63
Регистрация: 18.03.2014
Сообщений: 386
18.05.2015, 20:18  [ТС]
jonson, спасибо, можно еще вопрос, на ownerdraw кнопке пропадает текст, как отобразить его на кнопке?
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
18.05.2015, 20:38
Цитата Сообщение от programmist99 Посмотреть сообщение
на ownerdraw кнопке пропадает текст, как отобразить его на кнопке?
ну если в твоем примере, то в методе
C++
1
void DrawButton(LPDRAWITEMSTRUCT lpInfo)
перед
C++
1
BitBlt(lpInfo->hDC, 0, 0, lpInfo->rcItem.right, lpInfo->rcItem.bottom, Owner, 0, 0, SRCCOPY);
добавь эти строки
C++
1
2
3
4
wchar_t wtext[] = L"Text Button";
SetBkMode(Owner, TRANSPARENT);
SetTextColor(Owner, RGB(255,255,0));
TextOutW(Owner, 15, 5, wtext, wcslen(wtext) );
вариант для примера, а там сам рассуди как лучше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2015, 20:38
Помогаю со студенческими работами здесь

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

Изменение цвета рамки картинки-гиперссылки при наведении курсора.
Изменение цвета рамки картинки-гиперссылки при наведении курсора.Никак не могу этого сделать.Допустим, с цвета #3399FF на цвет...

Не работает код смены цвета кнопки при наведении курсора мыши
Уважаемый пользователи портала, Есть docm word 2010 c несколькими кнопками в нём(button,button2 итд). Как при наведении на конкретную...

Изменение координат кнопки при наведении курсора
всем привет как сделать что бы когда курсор мишки на него поставишь кнопка бутон от него сдвинулся помигите пожалуйста

Изменение цвета Label при наведении на него курсора мыши. Как это сделать?
Изменение цвета Label при наведении на него курсора мыши. Как это сделать? Какое свойство надо поменять?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru