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

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

16.05.2015, 16:59. Показов 6484. Ответов 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
Ответ Создать тему
Новые блоги и статьи
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru