Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Прозрачный TPanel


Автор: mr.Anderson 17.4.2007, 17:56
Подождите гнать меня в поиск! Я там был... Нашел, как делать форму прозрачной (а как просто-то, оказывается). Нашел, как вытворять всевозможные эффекты с TImage. А как можно сделать TImage полупрозрачным? Эффекты через AlphaFX делать можно, но как полупрозрачным его сделать?

Автор: Klin 17.4.2007, 17:59
Цитата(mr.Anderson @  17.4.2007,  18:56 Найти цитируемый пост)
 А как можно сделать TImage полупрозрачным? 

Не понял, так тебе TPanel или TImage полупрлзрачный надо?

Автор: mr.Anderson 17.4.2007, 18:06
Да в принципе какая разница. Смысл: на панели лежит имейдж и на нем написан текст (через TLabel). Нужно, чтобы TLabel остался нормальной контрастности, а вот TImage стал бледнее. Естественно, нужно, чтобы уровень прозрачности можно было регулировать.

Автор: Klin 17.4.2007, 18:08
Цитата(mr.Anderson @  17.4.2007,  19:06 Найти цитируемый пост)
Да в принципе какая разница. 

Здрасти, у Image есть transparent у Panel нет. А в принципе,  проблема или через Canvas решается или рисунок можно использовать GIF и там уровень прозрачности сделать.

Автор: SenkraD 17.4.2007, 18:09
Если TPanel, то возможно так (мож надо ещё форме прозрачность разрешить)
Код

    SetWindowlong(Panel1->Handle, GWL_EXSTYLE,
        GetWindowLong(Panel1->Handle, GWL_EXSTYLE) & ~WS_EX_LAYERED);
    SetWindowlong(Panel1->Handle, GWL_EXSTYLE,
        GetWindowLong(Panel1->Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(Panel1->Handle, 0, 125, LWA_ALPHA);

Автор: Klin 17.4.2007, 18:12
Нет, ему не весь же надо исправить. Можно так сделать. У рисунка есть цвет прозрачности, этим цветом через Canvas сделать на нем "решетку" из мелких точек и получиться эфект прозрачности, хотя если способ SenkraD, и на рисунок использовать можно, то лучше сделать как предлагает он.

Автор: mr.Anderson 17.4.2007, 18:14
Klin, Transparent - это не совсем то. Транспарент поможет только обрезать границы у BMP-картинки (кстати, он плоховато это делает). А мне нужно весь рисунок сделать полупрозрачным, а не только границы обрезать.

SenkraD, попробую, спасибо, но и впрямь похоже надо TImage сделать прозрачным, а не панель... Чего-то я ступил. smile

Автор: Klin 17.4.2007, 18:15
только этот способ под 98 работать не будет :(

Автор: mr.Anderson 17.4.2007, 18:16
Да и фиг с ним в принципе. smile

Автор: Klin 17.4.2007, 18:18
Цитата(mr.Anderson @  17.4.2007,  19:14 Найти цитируемый пост)
Транспарент поможет только обрезать границы у BMP-картинки

На Jpeg вообще-то  тоже работает. Но я говорил сделать в редакторе GIF и ему прозрачность назначить и тогда Transparent будет не края резать, а прозрачность изменять (сам проверял)

Автор: mr.Anderson 17.4.2007, 18:20
Стоп-стоп... Как это сделать для TImage, если у него нет хендла?

Добавлено через 43 секунды
Klin, можно с этого места поподробнее? Что значит "сделать в редакторе GIF и ему прозрачность назначить"

Автор: Klin 17.4.2007, 18:21
гы-гы у Image Handle нет smile

Добавлено через 40 секунд
блин опередил, щас напишу

Автор: mr.Anderson 17.4.2007, 18:21
Klin, а я о чем? smile

Добавлено через 36 секунд
smile Тут у на тренировка на скорость печати... Сорри за оффтопик...

Автор: Klin 17.4.2007, 18:24
Точно по действия не помню, но примерно так:
1) Создаешь нужный рисунок
2) Накладываешь на него к примеру фиолетовый
3) Изменяешь прозрачность фиолетового на глаз
4) Сохраняешь его как GIF с прозрачным фиолетовым

Вроде все, но там в свойствах его (при сохранении) должно быть что-то типа "Indefie ?". 


p.s. Я думаю, что с хэндлом че-нибудь придумать можно....

Автор: mr.Anderson 17.4.2007, 18:26
И лучше именно это что-нить придумать, т.к. с рисунком я так и не понял толком, чего делать. smile Еще варианты есть? Плз.

Добавлено через 5 минут и 53 секунды
Кстати,метод не сработал даже с панелью (WinXP).

Автор: mr.Anderson 17.4.2007, 21:20
Вопрос актуален.

Автор: Klin 18.4.2007, 21:33
Пытался попробовать со способом SenkraD`а, но пока изменить могу только окно. Кстати у Image (почти у него) хэндл есть:
Код

Image1->Picture->Bitmap->Handle;

Почти получилось с другим вариантом, но он делает его полностью прозрачным

Автор: SparF 5.9.2007, 23:40
Цитата(SenkraD @  17.4.2007,  18:09 Найти цитируемый пост)
Если TPanel, то возможно так (мож надо ещё форме прозрачность разрешить)
Код

    SetWindowlong(Panel1->Handle, GWL_EXSTYLE,
        GetWindowLong(Panel1->Handle, GWL_EXSTYLE) & ~WS_EX_LAYERED);
    SetWindowlong(Panel1->Handle, GWL_EXSTYLE,
        GetWindowLong(Panel1->Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
    SetLayeredWindowAttributes(Panel1->Handle, 0, 125, LWA_ALPHA);


Попробовал так, что-то ноль реакции - есть какие-нть предположения, что можно сделать?  smile

Добавлено через 4 минуты и 23 секунды
Добавлю  - нужен полностью прозрачный TPanel (под ним будет картинка, а на нем - кнопки двигаются графические, так вот картинку при текущем раскладе под панелью совсем не видно)....

Автор: Alexeis 6.9.2007, 00:09
Цитата(SparF @  5.9.2007,  23:40 Найти цитируемый пост)
Попробовал так, что-то ноль реакции - есть какие-нть предположения, что можно сделать? 

  И не удивительно, если внимательно читать справку, то слои можно устанавливать только парент окну, но не чайлду. Что-то подобное можно сделать, если использовать 2 формы. 1я дырявая (видны только компоненты) у нее своя прозрачность, а вторая пустая форма с другой прозрачностью расположена ниже этой дырявой формы. В разделе по делфи мы уже испробовали этот вариант. Работает довольно стабильно, правда на слабых машинах такое окошко хорошо притормаживает при перемещении. Но это все равно только 2 прозрачности. Чтобы установить каждому нужно каждый контрол поместить на свою форму smile

Автор: SparF 6.9.2007, 00:36
Цитата(Alexeis @  6.9.2007,  00:09 Найти цитируемый пост)
Чтобы установить каждому нужно каждый контрол поместить на свою форму

Изврат однако))))))))))))))
тогда поставлю вопрос по другому (надеюсь за оффтоп не примут)
Как еще можно несложно добиться эффекта появления движущейся кнопки из-за невидимой черты (кнопки двигаются в пределах невидимого/прозрачного прямоугольника на форме, что-то вроде бегущей строки из кнопок)
PS заранее спасибо.

Автор: Alexeis 6.9.2007, 00:42
Выползать из под панели и заползать под другую панель. Панели не имеет бордюра.

Добавлено через 1 минуту и 31 секунду
Для этого нужно всего лишь установить им правильный z order.

Автор: SparF 6.9.2007, 01:00
Цитата(Alexeis @  6.9.2007,  00:42 Найти цитируемый пост)
Выползать из под панели и заползать под другую панель. Панели не имеет бордюра

Да, пожалуй, это единственный вариант.
Alexeis, спасибо)))))

Добавлено через 1 минуту и 36 секунд
....правда в этом случае не будет видна фоновая картинка формы.... =(

Добавлено через 7 минут и 33 секунды
....мда...по-человечески походу никак, придется дробить картинку на несколько частей, и части по бокам формы делать выше кнопок...

Автор: Alexeis 6.9.2007, 09:12
  Тогда можно вообще отказаться от панелей и переопределить перерисовку движущейся кнопки. В нужный момент (по OnPaint) просто рисовать фрагмент фоновой картинки на кнопке.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)