Blog. Just Blog

Как сделать иконку на кнопке справа от текста

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
При помощи сообщение BM_SETIMAGE на кнопку можно добавить иконку, в обычном режиме она будет располагаться слева от надписи. Для одной из моих программ понадобилось разместить иконку на кнопке справа от надписи. Да, я в курсе про самостоятельную отрисовку кнопок, про субклассирование и прочие навороты, но хотелось обойтись малой кровью. Поразмыслив, я решил задачу с помощью расширенного стиля окна WS_EX_LAYOUTRTL, который применяется к отдельно взятой кнопке. По прямому назначению он используется для корректной отрисовки содержимого окна на арабском или других языках с направлением письма справа-налево. Как оказалось, для иконок это тоже неплохо работает.

Вот код для переключения иконки на положение справа. Подразумевается, что иконка уже ранее была установлена на кнопку при инициализации окна или при создании элемента управления.
  1.         ; Установить иконку справа от текста
  2.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  3.         mov     ebx,eax
  4.         ; Добавить стиль Right-to-Left
  5.         invoke  GetWindowLong,ebx,GWL_EXSTYLE
  6.         or      eax,WS_EX_LAYOUTRTL
  7.         invoke  SetWindowLong,ebx,GWL_EXSTYLE,eax
  8.         ; Обновить иконку
  9.         invoke  SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
  10.         invoke  SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
Для возврата обычного положения иконки нужно убрать WS_EX_LAYOUTRTL из расширенного стиля кнопки.
  1.         ; Установить иконку слева от текста
  2.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON
  3.         mov     ebx,eax
  4.         ; Убрать стиль Right-to-Left
  5.         invoke  GetWindowLong,ebx,GWL_EXSTYLE
  6.         and     eax,not WS_EX_LAYOUTRTL
  7.         invoke  SetWindowLong,ebx,GWL_EXSTYLE,eax
  8.         ; Обновить иконку
  9.         invoke  SendMessage,ebx,BM_GETIMAGE,IMAGE_ICON,0
  10.         invoke  SendMessage,ebx,BM_SETIMAGE,IMAGE_ICON,eax
После смены расширенного стиля надо обязательно обновить иконку на кнопке. Чтобы не заморачиваться с повторной загрузкой и не хранить данные, кому какая иконка назначена, достаточно получить хэндл имеющейся на кнопке иконки и тут же назначить его обратно.

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

В приложении пример программы с исходным текстом, которая позволяет переключить изображение на кнопке слева или справа от надписи.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Left.Right.Icon.Demo.zip (4,018 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 734 | Комментариев: 0

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0055 сек.) / Память: 4.5 Mb
Наверх