18.01.2020, 05:39 [+3 UTC]
в нашей команде: 4 150 чел. | участники онлайн: 3 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.80 (15.01.2020)
JS-v.1.35 | CSS-v.3.36

Общие новости:
06.01.2020, 22:45

Форум:
13.01.2020, 16:40

Последний вопрос:
18.01.2020, 02:32
Всего: 151434

Последний ответ:
17.01.2020, 19:30
Всего: 259652

Последняя рассылка:
18.01.2020, 05:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
21.10.2009, 18:12 »
Гуревич Александр Львович
Большое Вам спасибо за рекомендованную программу. Общими усилиями проблема успешно решена. [вопрос № 173416, ответ № 255579]
27.07.2019, 14:37 »
dar777
Это самое лучшее решение! [вопрос № 196022, ответ № 278435]

РАЗДЕЛ • .NET Framework / C# / Java

Создание программ на программной платформе .NET Framework и языках С# и Java.

[администратор рассылки: Коцюрбенко Алексей Владимирович (Модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 973
solowey
Статус: Специалист
Рейтинг: 274
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 270

Перейти к консультации №:
 

Консультация онлайн # 72301
Раздел: • .NET Framework / C# / Java
Автор вопроса: Lameruga
Отправлена: 23.01.2007, 19:43
Поступило ответов: 3

Здравствуйте. Проблемка возникла, не знаю как решить:
Есть кнопка со стилем BS_OWNERDRAW. Мне нужно, чтобы под курсором мыши она перерисовывалась(типа подсвечивалась). Вроде все делаю правильно, отслеживаю сообщения WM_MOUSEMOVE, но как
раз над этой кнопкой сообщения WM_MOUSEMOVE перестают поступать в оконную процедуру. Как это правильно делается, подскажите пожалуйста. Спасибо.
С/С++.

Состояние: Консультация закрыта

Ответ # 138608 от burbot

Здравствуйте, Lameruga!

Для того, чтобы правильно обработать данную ситуацию, Вам необходимо реагировать на сообщение WM_DRAWITEM.

При приеме этого сообщения:
wParam - идентификатор контрола;
lParam - указатель на структуру DRAWITEMSTRUCT.

DRAWITEMSTRUCT.itemState в Вашем случае должен содержать флаг ODS_HOTLIGHT.

Флаг ODS_HOTLIGHT действует только в Windows 98/Me, Windows 2000/XP.
На старых версиях придется извращаться по-другому.

Если Вам необходимо решение и для старых версий Windows и Вы согласны немного подождать, то я мог бы немного поэкпериментировать.

Всего доброго.


Консультировал: burbot
Дата отправки: 23.01.2007, 21:09

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Ответ # 138624 от Bob Johnson

Здравствуйте, Lameruga!
Все верно, потому что на этом месте находится кнопка, т.е. когда курсор мыши над ней, то WM_MOUSEMOVE приходят уже ей, а не твоему окну. Можно тут сделать следущее. если ты пишешь под mfc, то просто унаследуйся от CButton, добавь метод OnMouseMove и соответствующую строчку в таблицу сообщений (ON_WM_MOUSEMOVE), затем перерисовывай кнопку в этом методе.
если же ты пишешь на чистом winapi, то сабклась (subclass) окно кнопки (получи ее оконную процедуру с помощью GetWindowLong, замени ее на свою с помощью SetWindowLong). в своей оконной процедуре проверяй сообщение и инициируй перерисовку.


Консультировал: Bob Johnson
Дата отправки: 23.01.2007, 22:33

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Ответ # 138632 от John Paramol

Здравствуйте, Lameruga!

> Такое впечатление, что этот прямоугольник "вырезан" из окна

Именно вырезан. Это пространство принадлежит другому окну.
Ваша кнопка, как и любой другой контрол вроде Edit или ComboBox, тоже является окном. Любое окно имеет свой класс. Оконные классы этих контролов - глобальные, их не нужно создавать самостоятельно, они существуют в системе. У каждого оконного класса - своя оконная процедура. У всех кнопок класса Button оконная процедура одна, но она не имеет ничего общего с вашей оконной процедурой родительского окна. Поэтому нет смысла ожидать, что сообщения WM_MOUSEMOVE будут приходить в вашу процедуру. Они приходят в процедуру класса Button, скрытую от ваших глаз. Существует способ подменить эту стандартную процедуру на созданную вами, путем сообщения системе о том, что данный оконный класс должен использовать адрес вашей процедуры, вместо старого адреса (используется функция SetClassLong с параметром GCL_WNDPROC). В этом случае создается специальная процедура, которая будет обрабатывать нужные сообщения класса Button, а все остальные - передавать в старую процедуру (но только через CallWindowProc, при этом сначала необходимо сохранить адрес старой процедуры). Или же можно сообщить системе, что отдельный экземпляр окна должен использовать адрес вашей процедуры, вместо старого адреса (используется функция SetWindowLong с параметром GWL_WNDPROC). Этот метод называется субклассированием (subclassing). Но для ваших целей достаточно воспользоваться методом, предложенным экспертом burbot. Дам некоторые пояснения. Сообщение WM_DRAWITEM будет посылаться системой в процедуру вашего родительского окна, в случае, если оно имеет дочерний контрол (Button, ComboBox и т.п.), созданный со стилем XX_OWNERDRAW, в тот момент, когда его экземпляр окна должен быть перерисован (например, при наведении курсора).
Будет лучше, если вы прочтете подробно о сообщении WM_DRAWITEM в справке.
Удачи!


Консультировал: John Paramol
Дата отправки: 23.01.2007, 23:04

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.14872 сек.

© 2001-2020, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.80 от 15.01.2020
Версия JS: 1.35 | Версия CSS: 3.36