Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для egorus99
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28

Кнопка меняется, когда над ней "висит" курсор

14.05.2014, 07:38. Показов 1837. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Хочу, чтобы моя кнопка в моей программе менялась, когда над ней висит курсор.
Знаю, что это можно реализовать через BM_GETSTATE и его BST_HOT. А вот что куда именно вставлять, не знаю.
Помогите ,пожалуйста.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2014, 07:38
Ответы с готовыми решениями:

Анимация кнопки, когда над ней находится курсор
Скажите, как можно перерисовывать кнопку, когда над ней находится курсор?

Необходимо определить, над каким из гаджетов висит курсор мыши
Друзья помогите! WinApi только осваиваю по этому пинайте по полной программе Необходимо определить над киким из гаджетов висит курсор...

Отслеживать с помощью события TrackMouseEvent, когда курсор находится над окном и когда его покидает
Здравствуйте. Пишу приложение по работе с мышью и клавиатурой. Требуется чтобы приложение отслеживало события когда курсор находится на...

2
 Аватар для egorus99
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28
16.05.2014, 18:45  [ТС]
Лучший ответ Сообщение было отмечено egorus99 как решение

Решение

Как реализовать это, нашел способ.
Работает, но только теоретически.
Помогите разобраться, что не так.
Скидываю со всем или почти всем мусором, потому что не знаю, где ошибка может быть именно.
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "Header.h"     //Здесь хранятся все макросы
#include <windows.h>
#include <windowsx.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);//Функция процедур окна
void fDestroy(HWND);                                //Функция уничтожения окна
void fPaint(HWND);                                  //Функция рисования в окне
bool fCreate(HWND, LPCREATESTRUCT);                 //Функция, вызывающаяся при создании окна
void RegionMe();                                    //Функция уничтожения заголовка и рамки окна
bool fEraseBkgnd(HWND, HDC);                        //Функция очистки фона для отсутсвия мерцания
void fLButtonDown(HWND, BOOL, int, int, UINT );     //Функция обработки сигналов ЛКМ
void fCommand(HWND, int , HWND , UINT );            //Функция обработки команд
void fMouseMove( HWND , int , int , UINT );         //Функция обработки движиния мыши
 
LRESULT CALLBACK ButtonProc(HWND, UINT, WPARAM, LPARAM);
 
 
HBITMAP hSkinBitmap;                                //Хэндл для изображения
HINSTANCE hI;                                       //Дескриптор приложения
HDC dcSkin;                                         //Контекст устройства для скина
HGDIOBJ hOldBmp;                                    //Объект для хранения скрина
HWND hwnd;                                          //Дескриптор окна
HWND hwndXButton;                                   //Дескриптор кнопки X
TRACKMOUSEEVENT tme;                                //Струтктура  обработки движения мыши
LONG lpButtonProc;
                                    
 
 
//Координаты окна
int x;  
int y;
 
int APIENTRY WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow)
{
    MSG msg;    //Переменная сообщений
    WNDCLASS w; //Переменная регистрации класса
    hI=hInstance;
    //Регистрация класса окна
        memset(&w,0,sizeof(WNDCLASS));
        w.style = CS_HREDRAW | CS_VREDRAW;
        w.lpfnWndProc = WndProc;
        w.hInstance = hInstance;
        w.hbrBackground = GetStockBrush(WHITE_BRUSH);
        w.lpszClassName = L"C Windows";
        w.hIcon=LoadIcon(hI, MAKEINTRESOURCE(IDI_ICON));
        RegisterClass(&w);
    //Получение координат для центрирования окна
        HDC hDCScreen = GetDC(NULL);
        x=GetDeviceCaps(hDCScreen, HORZRES)/2-XLENGTH/2;
        y=GetDeviceCaps(hDCScreen, VERTRES)/2-YLENGTH/2;
    //Создание окна
        hwnd=CreateWindowEx( NULL ,L"C Windows",L"Заголовок",WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_VISIBLE , x, y,XLENGTH, 
            YLENGTH, NULL, NULL, hInstance, NULL);
        hwndXButton = CreateWindowExW(NULL,L"BUTTON",L"XButtom",
            WS_CHILD|WS_VISIBLE|BS_ICON|BS_PUSHBUTTON,
            770,60,16,16,hwnd,(HMENU)ID_XBUTTON,NULL,NULL);
        SendMessage(hwndXButton, BM_SETIMAGE, IMAGE_ICON, 
            (LPARAM)LoadImage(hI, MAKEINTRESOURCE(IDI_XBUTTON), IMAGE_ICON, 0, 0, 
            LR_DEFAULTCOLOR));
        lpButtonProc=SetWindowLong(hwndXButton, GWL_WNDPROC, (LONG)ButtonProc);
        ShowWindow(hwnd,nCmdShow);
        UpdateWindow(hwnd);
    //Цикл отправления сообщений
        while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam)
{
    switch (Message){
        HANDLE_MSG(hwnd, WM_DESTROY, fDestroy);
        HANDLE_MSG(hwnd, WM_PAINT, fPaint);
        HANDLE_MSG(hwnd, WM_CREATE, fCreate);
        HANDLE_MSG(hwnd, WM_LBUTTONDOWN, fLButtonDown);
        HANDLE_MSG(hwnd, WM_ERASEBKGND, fEraseBkgnd);
        HANDLE_MSG(hwnd, WM_COMMAND, fCommand);
        HANDLE_MSG(hwnd, WM_MOUSEMOVE, fMouseMove);
        break;
        default:
        return DefWindowProc(hwnd, Message, wParam, lParam);
    }
}
void fDestroy(HWND){
    PostQuitMessage(0);
}
 
void fPaint(HWND hwnd){
    PAINTSTRUCT ps;
    BeginPaint(hwnd,&ps);
    RegionMe();                                                                         //Уничтожение заголовка и рамки окна
    BitBlt(ps.hdc, 0,0,XLENGTH,YLENGTH, dcSkin, 0,0, SRCCOPY);                          //Рисование скина окна
    SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(hwnd, RGB(246,244,128), 0, LWA_COLORKEY);                //Создание прозрачных областей
    EndPaint(hwnd,&ps);
}
 
bool fCreate(HWND hwnd, LPCREATESTRUCT){
    hSkinBitmap=LoadBitmap(hI, MAKEINTRESOURCE(IDB_SKIN));  //Загрузка рисунка из ресурсов
    dcSkin = CreateCompatibleDC(0);                         //Выделение памяти для контекста рисунка
    hOldBmp = (HBITMAP)SelectObject(dcSkin, hSkinBitmap);   //Создание битовой карты для рисунка
    tme.cbSize=sizeof(tme);
    tme.dwFlags=TME_HOVER|TME_LEAVE;
    tme.hwndTrack=hwndXButton;
    tme.dwHoverTime=0;
    return 1;
}
 
void RegionMe()
{
  HRGN hRegion=CreateRectRgn(0, 0, XLENGTH, YLENGTH);                           //Создание региона
  SetWindowRgn(hwnd, hRegion, true);                                            //Соединение региона с окном
  DeleteObject(hRegion);
  DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);                       
  dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);                                          //Удаление заголовка и рамки окна
  SetWindowLong(hwnd, GWL_STYLE, dwStyle);
  InvalidateRect(hwnd, NULL, TRUE);
  SetWindowPos(hwnd , NULL, x, y,XLENGTH,YLENGTH+2, SWP_NOMOVE|SWP_NOZORDER);
}
 
bool fEraseBkgnd(HWND, HDC){
    return 1;
}
 
void fLButtonDown(HWND, BOOL, int, int, UINT ){
    SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION,NULL);    //Окно двигается, если его зажать ЛКМ и двигать
}
 
void fCommand(HWND, int id, HWND , UINT ){
    switch(id){
    case ID_XBUTTON:
        PostQuitMessage(0);                 //Если нажата X кнопка, то - выйти из программы
        break;
    default:
        break;
    }
}
 
void fMouseMove(HWND hwnd,int,int,UINT){
    TrackMouseEvent(&tme);
}
 
LRESULT CALLBACK ButtonProc(HWND hwndButton, UINT message, WPARAM wParam, LPARAM lParam){
    switch(message){
        case WM_MOUSEHOVER:
            SendMessage(hwndXButton, BM_SETIMAGE, IMAGE_ICON, 
            (LPARAM)LoadImage(hI, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 0, 0, 
            LR_DEFAULTCOLOR));
            return 0;
        case WM_MOUSELEAVE:
            SendMessage(hwndXButton, BM_SETIMAGE, IMAGE_ICON, 
            (LPARAM)LoadImage(hI, MAKEINTRESOURCE(IDI_XBUTTON), IMAGE_ICON, 0, 0, 
            LR_DEFAULTCOLOR));
            return 0;
        default:
            return CallWindowProcA((WNDPROC)lpButtonProc, hwndButton, message, wParam, lParam);
    }
}
0
 Аватар для egorus99
2 / 2 / 3
Регистрация: 28.05.2013
Сообщений: 28
18.05.2014, 12:35  [ТС]
Что, вообще никто не знает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2014, 12:35
Помогаю со студенческими работами здесь

Курсор над бордюром панели автоматически меняется на стрелку
день добрый. столкнулся с такой проблемой: есть на форме стандартная панель со стилем бордюра &quot;Fixed3D&quot; в евенте...

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

Как в TMemo узнать, когда курсор над выделением?
Использую px:Word; ...................... px:=LoWord(Perform(EM_CHARFROMPOS,0,MakeLParam(X,Y))); if...

Вывод static текста, когда курсор находится НАД контролом. как?
нужно научиться получать сообщения когда курсор находится над каком нибудь из контролов. пример во вложении. мышка над едитбоксом,...

Если над главной диагональю минимальные элементы столбцов, то добавить всем элементам над ней среднее под ней
Дана действительная матрица размерности (n x n) Если на главной диагонали стоят минимальные элементы столбцов, то ко всем элементам,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru