C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Полупрозрачность компонента  (Прочитано 5279 раз)
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 »

Цитата: POV от 26 Ноябрь 2012, 11:05:00
Ладно, вот вопрос совсем простой .. эквивалентны ли строчки?
Код
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 »

Цитата: volvo877 от 27 Ноябрь 2012, 11:50:21
Учите уже основы языка, с которым работаете, прежде, чем садиться программировать, а?

Я проверю. Но по-любому звучит надуманно. Конструктор может, как заблагорассудилось его автору, наполнить множество.
Записан
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 »

Цитата: volvo877 от 27 Ноябрь 2012, 10:22:28
Цитировать
Йес )


С чего бы? Берем чистый 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() при захвате изображения требуют почти секунду на могучей машине!!! Однако если фон под компонентом не меняется, то не страшно - захватывается фон один раз, и далее всё работает быстро. Для последующих обновлений фона сделал публичный метод принудительного захвата.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.159 секунд. Запросов: 19.