|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Полупрозрачность компонента
« : 19 Ноябрь 2012, 15:34:38 »
|
|
Не могу сообразить как средствами GDI+ сделать полупрозрачный компонент.. как это например сделано в AdvSmoothPanel - этот компонент имеет полупрозрачность относительно контейнера, на котором расположен.
У кого есть соображения?
P.S. Есть у меня соображения что компонент в свой буфер копирует изображение контейнера (ибо прочие компоненты не видны) и далее над ним изгаляется. Этот вариант не интересен.
|
|
|
|
|
|
S0mbre
Глобальный модератор
Сказали спасибо: +1113/-22
Offline
Сообщений: 2132
S0mbre
|
|
Re: Полупрозрачность компонента
« Ответ #1 : 19 Ноябрь 2012, 16:22:52 »
|
|
Какой именно компонент? Хочешь сделать стандартный компонент с прозрачностью или создать совершенно новый?
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #2 : 19 Ноябрь 2012, 16:33:32 »
|
|
Мне нужно получить панель.. контейнер в общем. Для кнопок.
Этому контейнеру надо быть полупрозрачным.
|
|
|
|
|
|
S0mbre
Глобальный модератор
Сказали спасибо: +1113/-22
Offline
Сообщений: 2132
S0mbre
|
|
Re: Полупрозрачность компонента
« Ответ #3 : 20 Ноябрь 2012, 08:03:02 »
|
|
Вот тут 3 разных решения на дельфи.
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #4 : 22 Ноябрь 2012, 15:42:26 »
|
|
WMEraseBkgnd не вызывается. Что я не так сделал? Перенес пример с паскаля на си и всё.
Это сделал. Но вот SetParent никак не хочется вызываться. Где ж косяк?
|
|
| « Последнее редактирование: 22 Ноябрь 2012, 16:29:22 от POV » |
Записан |
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #5 : 22 Ноябрь 2012, 16:48:26 »
|
|
Вот. Все методы начали вызываться. Но компонента от этого не стала выглядеть полупрозрачной. Есть у кого варианты?
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #6 : 22 Ноябрь 2012, 16:53:58 »
|
|
И еще, переделывая пример под билдер я не понимаю что именно делаю. Точно ли это полупрозрачность? Где параметр степени прозрачности?
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #7 : 26 Ноябрь 2012, 11:05:00 »
|
|
Ладно, вот вопрос совсем простой .. эквивалентны ли строчки?
ControlStyle := ControlStyle - [csOpaque]; и
ControlStyle = TControlStyle() >> csOpaque;
|
|
|
|
|
|
S0mbre
Глобальный модератор
Сказали спасибо: +1113/-22
Offline
Сообщений: 2132
S0mbre
|
|
Re: Полупрозрачность компонента
« Ответ #8 : 27 Ноябрь 2012, 08:31:32 »
|
|
Ладно, вот вопрос совсем простой .. эквивалентны ли строчки?
ControlStyle := ControlStyle - [csOpaque]; и
ControlStyle = TControlStyle() >> csOpaque;
Йес )
|
|
|
|
|
|
volvo877
Глобальный модератор
Сказали спасибо: +736/-1
Offline
Сообщений: 891
|
|
Re: Полупрозрачность компонента
« Ответ #9 : 27 Ноябрь 2012, 10:22:28 »
|
|
Йес )
С чего бы? Берем чистый TControlStyle(), из него извлекаем csOpaque (опять же остается пустота), и записываем в ControlStyle? А то, что там раньше было?
Вообще-то вот так делается:
ControlStyle = ControlStyle >> csOpaque;
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #10 : 27 Ноябрь 2012, 11:28:23 »
|
|
Со шрифтом такое не прокатывает. Там тоже множество.
Да и по умолчанию отнюдь там не чисто - можно из объявления типа поглядеть.
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #11 : 27 Ноябрь 2012, 11:29:47 »
|
|
Но в общем я задачу решил.. примерно как это во 2-м примере данном выше.
Только еще захват картинки под компонентом не корректно сделал - в Paint захватываю, а надо походе в WMEraseBkgnd. На досуге переделаю, отчитаюсь.
|
|
|
|
|
|
volvo877
Глобальный модератор
Сказали спасибо: +736/-1
Offline
Сообщений: 891
|
|
Re: Полупрозрачность компонента
« Ответ #12 : 27 Ноябрь 2012, 11:50:21 »
|
|
Со шрифтом такое не прокатывает.
"Бедному Ванечке - везде камушки" (С) Все получается, если делать правильно.
Да и по умолчанию отнюдь там не чисто - можно из объявления типа поглядеть.
Поглядеть - оно всегда можно. Вот напиши ControlStyle = TControlStyle() >> csOpaque;, и погляди в отладчике, чему оно станет равным после выполнения строки. Еще раз: конструктор (а ты вызываешь именно конструктор), плевать хотел на всё то, что у тебя хранилось в ControlStyle ранее. Он создает новое, пустое множество, и из него пытается извлечь указанное значение. Не получилось - фиг бы с ним, от этого множество не наполняется. А потом эту пустоту записывает в ControlStyle. Всё, что было там ранее - утеряно.
Учите уже основы языка, с которым работаете, прежде, чем садиться программировать, а?
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #13 : 27 Ноябрь 2012, 11:54:25 »
|
|
Учите уже основы языка, с которым работаете, прежде, чем садиться программировать, а?
Я проверю. Но по-любому звучит надуманно. Конструктор может, как заблагорассудилось его автору, наполнить множество.
|
|
|
|
|
|
Kray74
Посты на падонкаффском принципиально не читаю.
Участник
Сказали спасибо: +81/-1
Offline
Сообщений: 366
|
|
Re: Полупрозрачность компонента
« Ответ #14 : 27 Ноябрь 2012, 13:21:05 »
|
|
А вся беда от того, что Borland засунул перегрузку операторов, куда не надо.
|
|
|
|
|
|
S0mbre
Глобальный модератор
Сказали спасибо: +1113/-22
Offline
Сообщений: 2132
S0mbre
|
|
Re: Полупрозрачность компонента
« Ответ #15 : 27 Ноябрь 2012, 13:37:42 »
|
|
Йес )
С чего бы? Берем чистый TControlStyle(), из него извлекаем csOpaque (опять же остается пустота), и записываем в ControlStyle? А то, что там раньше было?
Вообще-то вот так делается:
ControlStyle = ControlStyle >> csOpaque;
Согласен, не совсем то. Если так:
ControlStyle := ControlStyle - [csOpaque]; То ControlStyle предварительно не очищается перед извлечением csOpaque. Это скорее эквивалентно
ControlStyle = ControlStyle >> csOpaque;
Но в некоторых случаях разницы нет. Например, если используются галочки для установки / сброса элементов из множества. Пример: использование TCheckListBox для установки элементов свойства BevelEdges в панели:
procedure TForm1.CLBClickCheck(Sender: TObject); begin case CLB.ItemIndex of 0: if CLB.Checked[0] then Panel1.BevelEdges := Panel1.BevelEdges + [beLeft] else Panel1.BevelEdges := Panel1.BevelEdges - [beLeft]; 1: if CLB.Checked[1] then Panel1.BevelEdges := Panel1.BevelEdges + [beTop] else Panel1.BevelEdges := Panel1.BevelEdges - [beTop]; 2: if CLB.Checked[2] then Panel1.BevelEdges := Panel1.BevelEdges + [beRight] else Panel1.BevelEdges := Panel1.BevelEdges - [beRight]; 3: if CLB.Checked[3] then Panel1.BevelEdges := Panel1.BevelEdges + [beBottom] else Panel1.BevelEdges := Panel1.BevelEdges - [beBottom]; end; end;
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #16 : 27 Ноябрь 2012, 20:22:28 »
|
|
Ну да, работает.. С чем-то я попутал...
|
|
|
|
|
|
POV
Участник
Сказали спасибо: +107/-7
Offline
Сообщений: 640
|
|
Re: Полупрозрачность компонента
« Ответ #17 : 05 Декабрь 2012, 17:14:40 »
|
|
Вопчем, компонент я сделал. Нормально так работает. Но получилось два "НО" (это на случай если кто захочет таким же извращением страдать):
1) При конструировании формы нельзя сделать компонент невидимым (соответственно, не работает Hide()). В итоге вместо полупрозрачности хрен знает что. Но при запуске проги все пучком.
2) Hide() И затем Show() при захвате изображения требуют почти секунду на могучей машине!!! Однако если фон под компонентом не меняется, то не страшно - захватывается фон один раз, и далее всё работает быстро. Для последующих обновлений фона сделал публичный метод принудительного захвата.
|
|
|
|
|
|