![]() |
|
|
![]()
|
|
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Иногда очень хочеться сделать кнопки/едиты/панели и прочий стафф произвольной формы. Причём иногда даже не просто треугольными/круглыми/ромбическими а, скажем, в виде кляксы какой-нибудь. Или сектор круга с дыркой.
Я знаю только один способ - сделать несколько битмапов (с различными видами типа "нажато", "в фокусе" и т.д.) и переписать событие OnPaint в котором перерисовывать контрол этими битмапами. Этот вариант плох, т.к. независимо от текущего стиля винды этот контрол будет отображаться одинаково. А какие ещё есть (и есть ли вообще) способы создания контролов нетрадиционой формы? Это сообщение отредактировал(а) UniBomb - 30.9.2009, 12:09 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Гляньте CreatePolygonRgn
|
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Anikmar, глянул... думаю как это можно использовать...
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
||||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Anikmar, дело все в том, что работа с полигонами, дает адекватный результат только с формами, к другим контролам (кнопки к примеру) такой подход у меня в свое время ни к чему не привел.
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Ну естественно надо вручную нажатие отрабатывать, но ведь кнопка по своей сути тоже окошко. У Архангельского был вполне адекватный пример кнопок произвольной формы, просто нет под рукой книжки. |
|||
|
||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
На счет обычной кнопки не знаю, а TBitBtn работает 100%
И будет вам звездочка |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Anikmar, способ хорош, но по отношению к контролам его далеко не всегда можно применять. Просто потому, что SetWindowRgn обрезает ту часть контрола, которая лежит вне созданного региона, как следсвие и краёв контрола невидно. А так как цвет кнопок, панелей и куча чего ещё и форма имеет один и тот же цвет clBtnFace), то такой контрол просто невидно. Я запустив твой пример я долго не могу понять почему ничего не происходит. Оказалось я просто не увидел кнопку)))
И ещё - твоим медодом неполучиться создавать контролы более круглых форм (например кнопка в виде полумесяца, в виде облачка и т.д.). Так что я всё ещё думаю как это можно использовать... |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Вы посмотрите внимательно на всю группу функций по созданию региона: CombineRgn Combines two regions and stores the result in a third region. CreateEllipticRgn Creates an elliptical region. CreateEllipticRgnIndirect Creates an elliptical region. CreatePolygonRgn Creates a polygonal region. CreatePolyPolygonRgn Creates a region consisting of a series of polygons. CreateRectRgn Creates a rectangular region. CreateRectRgnIndirect Creates a rectangular region. CreateRoundRectRgn Creates a rectangular region with rounded corners. EqualRgn Checks the two specified regions to determine whether they are identical. ExtCreateRegion Creates a region from the specified region and transformation data. FillRgn Fills a region by using the specified brush. FrameRgn Draws a border around the specified region by using the specified brush. GetPolyFillMode Retrieves the current polygon fill mode. GetRegionData Fills the specified buffer with data describing a region. GetRgnBox Retrieves the bounding rectangle of the specified region. InvertRgn Inverts the colors in the specified region. OffsetRgn Moves a region by the specified offsets. PaintRgn Paints the specified region by using the brush currently selected into the device context. PtInRegion Determines whether the specified point is inside the specified region. RectInRegion Determines whether any part of the specified rectangle is within the boundaries of a region. SetPolyFillMode Sets the polygon fill mode for functions that fill polygons. SetRectRgn Converts a region into a rectangular region with the specified coordinates. И создавайте овальные, круглые, треугольные, по форме любого изображения (тут немного повозиться придется) А по поводу того, что вы не увидели кнопку - я просто забыл сказать, что нужно картинку какую-нибудь задать для кнопки и сделать ее достаточно большого размера (звездочка здоровая в примере). |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
Слушай, а чем тогда этот метод отличается от того, о котором я предлогал? Получаеться что метод OnPaint заменяеться функциями задания регионов, но ведь недостаток тотжу - при разных стилях винды такие контролы всё равно будут одинаково выглядеть. |
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Что-то не совсем понятно... Вы хотите сделать контролы как в винде или какие-то свои?..
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
| UniBomb |
|
|||
|
Новичок ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 1754 Регистрация: 24.10.2006 Где: Санкт-Петербург Репутация: 3 Всего: 97 |
artsb, тема предполагает все случаи))) Я в том плане, что оба описанных метода не перекрывают своими недостатками свои достоинства...
|
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 25 Всего: 372 |
UniBomb, поищи по ThemeAPI, возможно поможет
|
|||
|
||||
| artsb |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Кажысь понял о чём вы. -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |