Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контролы произвольной формы, способы реализации 
:(
    Опции темы
UniBomb
Дата 13.3.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Иногда очень хочеться сделать кнопки/едиты/панели и прочий стафф произвольной формы. Причём иногда даже не просто треугольными/круглыми/ромбическими а, скажем, в виде кляксы какой-нибудь. Или сектор круга с дыркой.

Я знаю только один способ - сделать несколько битмапов (с различными видами типа "нажато", "в фокусе" и т.д.) и переписать событие OnPaint в котором перерисовывать контрол этими битмапами. Этот вариант плох, т.к. независимо от текущего стиля винды этот контрол будет отображаться одинаково.


А какие ещё есть (и есть ли вообще) способы создания контролов нетрадиционой формы?

Это сообщение отредактировал(а) UniBomb - 30.9.2009, 12:09
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 13.3.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Гляньте CreatePolygonRgn 
PM MAIL ICQ   Вверх
UniBomb
Дата 13.3.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Anikmar, глянул... думаю как это можно использовать...
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 13.3.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Как использовать - уйма примеров, погуглите.

Добавлено через 3 минуты и 52 секунды
Например, тут
PM MAIL ICQ   Вверх
mrbrooks
Дата 13.3.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Anikmar, дело все в том, что работа с полигонами, дает адекватный результат только с формами, к другим контролам (кнопки к примеру) такой подход у меня в свое время ни к чему не привел.
PM MAIL   Вверх
Anikmar
Дата 13.3.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата

mrbrooks
Anikmar, дело все в том, что работа с полигонами, дает адекватный результат только с формами, к другим контролам (кнопки к примеру) такой подход у меня в свое время ни к чему не привел. 


Ну естественно надо вручную нажатие отрабатывать, но ведь кнопка по своей сути тоже окошко.
У Архангельского был вполне адекватный пример кнопок произвольной формы, просто нет под рукой книжки.

PM MAIL ICQ   Вверх
mrbrooks
Дата 13.3.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(Anikmar @  13.3.2009,  14:17 Найти цитируемый пост)
У Архангельского был вполне адекватный пример кнопок произвольной формы, просто нет под рукой книжки.

У него я сталкивался только для формы. Надо посмотреть в электронной версии.
PM MAIL   Вверх
Anikmar
Дата 13.3.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



На счет обычной кнопки не знаю, а  TBitBtn работает 100%
Код

    HRGN HReg;
    POINT ps[5];

    ps[0].x = 91;
    ps[0].y = 0;

    ps[1].x = 160;
    ps[1].y = 183;

    ps[2].x = 0;
    ps[2].y = 70;

    ps[3].x = 183;
    ps[3].y = 70;

    ps[4].x = 23;
    ps[4].y = 183;

    HReg = CreatePolygonRgn(ps,5,2);
    SetWindowRgn(BitBtn1->Handle, HReg, True);


И будет вам звездочка  smile 


PM MAIL ICQ   Вверх
UniBomb
Дата 14.3.2009, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Anikmar, способ хорош, но по отношению к контролам его далеко не всегда можно применять. Просто потому, что SetWindowRgn обрезает ту часть контрола, которая лежит вне созданного региона, как следсвие и краёв контрола невидно. А так как цвет кнопок, панелей и куча чего ещё и форма имеет один и тот же цвет clBtnFace), то такой контрол просто невидно. Я запустив твой пример я долго не могу понять почему ничего не происходит. Оказалось я просто не увидел кнопку)))

И ещё - твоим медодом неполучиться создавать контролы более круглых форм (например кнопка в виде полумесяца, в виде облачка и т.д.). Так что я всё ещё думаю как это можно использовать...
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 14.3.2009, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата(UniBomb @  14.3.2009,  03:02 Найти цитируемый пост)
И ещё - твоим медодом неполучиться создавать контролы более круглых форм (например кнопка в виде полумесяца, в виде облачка и т.д.). Так что я всё ещё думаю как это можно использовать... 

Вы посмотрите внимательно на всю группу функций по созданию региона:

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. 

И создавайте овальные, круглые, треугольные, по форме любого изображения (тут немного повозиться придется)

А по поводу того, что вы не увидели кнопку - я просто забыл сказать, что нужно картинку какую-нибудь задать для кнопки и сделать ее достаточно большого размера (звездочка здоровая в примере).
PM MAIL ICQ   Вверх
UniBomb
Дата 14.3.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



Цитата(Anikmar @  14.3.2009,  03:15 Найти цитируемый пост)
забыл сказать, что нужно картинку какую-нибудь задать для кнопки

Слушай, а чем тогда этот метод отличается от того, о котором я предлогал? Получаеться что метод OnPaint заменяеться функциями задания регионов, но ведь недостаток тотжу - при разных стилях винды такие контролы всё равно будут одинаково выглядеть.
PM MAIL ICQ Skype   Вверх
artsb
Дата 14.3.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Что-то не совсем понятно... Вы хотите сделать контролы как в винде или какие-то свои?..


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
UniBomb
Дата 14.3.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 1754
Регистрация: 24.10.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 97



artsb, тема предполагает все случаи))) Я в том плане, что оба описанных метода не перекрывают своими недостатками свои достоинства...
PM MAIL ICQ Skype   Вверх
THandle
Дата 14.3.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



UniBomb, поищи по ThemeAPI, возможно поможет smile
PM   Вверх
artsb
Дата 15.3.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(UniBomb @  14.3.2009,  21:35 Найти цитируемый пост)
artsb, тема предполагает все случаи))) Я в том плане, что оба описанных метода не перекрывают своими недостатками свои достоинства... 

Кажысь понял о чём вы. smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.