Пользовательская форма кнопки - PullRequest
1 голос
/ 04 октября 2011

Я хочу реализовать простую кнопку увеличения / уменьшения громкости с использованием пользовательского растрового изображения, и все, что у нее будет, - это простой эффект наведения и эффект мыши.
Моей первой идеей было обработать WM_MOUSEMOVE для наведения и обработать WM_LBUTTONUP и WM_LBUTTONDOWN для эффекта нажатия мыши.

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

Тогда у меня проблема с фоном, который должен быть прозрачным, я знаю, что могу использовать маску, передавая SRCAND в BitBlt, но для этого нужно, чтобы у меня было 2 изображения для каждой кнопки. Есть ли способ сделать это только с одним изображением? Например, если я наложу на него зеленый фон в редакторе изображений, могу ли я замаскировать его с помощью эффекта зеленого экрана?

1 Ответ

2 голосов
/ 04 октября 2011

Вам необходимо создать обычную кнопку и создать ее подкласс с помощью SetWindowSubclass .На кнопке должен быть стиль рисования владельцем, что означает, что в родительском WndProc вы обрабатываете WM_DRAWITEM .Как вы правильно сказали, вы будете BitBlt 'ing или StretchBlt ' с фоном изображения на.

Для событий при наведении вы должны сделать следующее:

  • Иметь некоторый тип общего логического значения между родительским и подклассовым WndProc, например.IsMousedOver
  • В подклассе WndProc обработайте WM_MOUSEMOVE .При получении этого сообщения вы должны установить IsMousedOver, а затем аннулировать элемент управления с помощью InvalidateRect (это вызовет WM_DRAWITEM в родительском элементе)
  • В родительском WndProc, если вы получитеWM_MOUSEMOVE, вы должны очистить IsMousedOver
  • В WM_DRAWITEM в родительском WndProc, вы должны проверить IsMousedOver и BitBlt на основе этого состояния

Если вы хотите обработать MouseUp/ MouseDown, вместо этого вы можете изменить логическое значение на int и иметь три состояния.Тем не менее, в большинстве реализаций MouseDown совпадает с обычной кнопкой, а MouseUp - это просто обычное наложение фона.

Что касается вашего запроса о 2 изображениях, вполне возможно сделать это с одним, ноЯ не пробовал этого раньше.

...