Как создать круглую / круглую кнопку в Win32 API с помощью Visual C ++ - PullRequest
5 голосов
/ 12 ноября 2009

У меня есть приложение Window (win32 API) в Visual C ++. Я не использую MFC. Я должен создать круглую / круглую кнопку с растровым изображением. Мое приложение имеет скинутое представление. Может ли кто-нибудь помочь мне в решении этой задачи. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 25 сентября 2010

Кнопки оконные. Вы можете создать кнопку с помощью вызова CreateWindow или CreateWindowEx:

- http://msdn.microsoft.com/en-us/library/ms632680(VS.85).aspx

При создании окна кнопки убедитесь, что вы передали стиль BS_OWNDERDRAW:

- http://msdn.microsoft.com/en-us/library/bb775951(VS.85).aspx

Это сообщит кнопке для отправки сообщений WM_DRAWITEM на ваши кнопки WNDPROC:

- http://msdn.microsoft.com/en-us/library/bb775923(v=VS.85).aspx

В WNDPROC ваших кнопок вы обрабатываете сообщение WM_DRAWITEM и раскрашиваете свою кнопку в соответствии с информацией в DRAWITEMSTRUCT, полученной в виде указателя в lParam.

Чтобы отобразить растровое изображение как что-либо кроме прямоугольника, вам нужно предоставить 1-разрядное растровое изображение с битовой маской того же размера, что и растровое изображение, которое вы хотите отобразить для своей кнопки. В битовой маске установлены биты, где вы хотите, чтобы пиксели в вашем растровом изображении кнопки были установлены на экране. Пиксели в растровом изображении кнопки, которые не отображаются, должны быть черными. Создайте битовый рисунок с битовой маской на экране с оператором AND, а затем ИЛИ с битовой картой вашей кнопки. Конечно, вам необходимо учитывать различные состояния кнопок (обычно кнопка имеет только два состояния).

Возможно, я смешал черные / белые или установить / не установить биты в приведенном выше объяснении, но растровые операции И / ИЛИ (SRCAND / SRCPAINT) являются правильными операциями для того, что вы пытаетесь получить.

- http://msdn.microsoft.com/en-us/library/aa930997.aspx

Надеюсь, это поможет.

0 голосов
/ 03 октября 2010

Ключевой вызов API, который вам нужно знать, это SetWindowRgn. Это то, что вы называете, чтобы сказать окнам, что окно не прямоугольное, а неправильная область. Если вы поищете в этом вопросе, вы найдете много примеров кода.

Один многообещающий пример - этот проект . Это зависит от MFC, но вы можете использовать его, чтобы узнать, как вам нужно позвонить, в каком порядке, чтобы получить желаемый эффект.

0 голосов
/ 25 сентября 2010

Вы можете Google найти методы для BitBlting изображений, используя память DC и различные настройки ROP2 для достижения маскирующего эффекта. Ваше круглое изображение, представляющее кнопку, будет использовать определенный цвет для представления прозрачности. У меня нет конкретного кода под рукой, но он нетривиален.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...