задний фон
Модератор: Модераторы
задний фон
у меня есть форма на ней имейдж. у имейджа включаю свойство транспарент что бы фон не было видно. Как мне скрыть фон у формы, что бы только картинка была видна без ее фона.
В смысле? "Форма по картинке"? Используйте регионы. Но это платформозависимо. Только для виндовс.
Мне нужно дырку в форме сделать=) в том то и дело, что мне для линукса надо.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
работает только для win или qt. Для GTK на форуме видел не LCL решение
Код: Выделить всё
Form1.AlphaBlend := TRUE;
Form1.AlphaBlendValue := Random(255);
Brainenjii писал(а):работает только для win или qt. Для GTK на форуме видел не LCL решениеКод: Выделить всё
Form1.AlphaBlend := TRUE;
Form1.AlphaBlendValue := Random(255);
Это будет делать прозрачность для всей формы. А нужно, насколько я понял, для определенного региона.
Мне кажется без вмешательства в Form.Paint не обойтись. Но как правильно сделать я не в курсе.
Добавлено спустя 15 минут 5 секунд:
Хотя, как оказалось, метод Paint в CustomControls ничего не делает
Интересно, в какой момент и где происходит прорисовка формы?
Мне нужно дырку в форме сделать=) в том то и дело, что мне для линукса надо.
Вопрос что понимать под "дыркой".
Возможное решение (в теории):
1. Взять текущее окно и рабочий стол на котором показана форма.
2. Определить координаты окна.
3. Скрыть окно (если это нужно).
4. Скопировать область рабочего стола "под окном".
5. Скомпоновать с фоном.
Визуально - это будет "дырка". Но "дотянуться" до рабочего стола через неё не удастся.
Я сомневаюсь, что есть кроссплатформенные решения. С другой стороны...
Кажется, есть плееры под Линупс, типа xmms, только у которых скины со всякими рюшечками.
О, посмотрел. Да, обёртка для xine. Форма сделана по картинке.
От оконного менеджера не зависит никоим образом.
Вариант - скачать исходники и найти как это делается:
http://www.xine-project.org/home
Также, может, по теме что-то в найдётся через поисковик.
Для винды же - использовать регионы. Универсального решения нету.
Интересно, в какой момент и где происходит прорисовка формы?
В обработчике сообщения WM_PAINT. Процедура WMPaint.
Добавлено спустя 7 минут 49 секунд:
Alexx2000 писал(а):Вот на этот пример можно посмотреть - lazarus\examples\shapedcontrols, теоретически платформонезависимо.
Хм... Кстати, любопытно. Есть два перегруженных метода. Один для винды работает точно через регионы.
Второй, я чего-то не разобрался. Но, скорее всего, тоже.
Код: Выделить всё
procedure TWinControl.SetShape(AShape: TBitmap);
begin
if not HandleAllocated then
Exit;
if (AShape <> nil) and (AShape.Width = Width) and (AShape.Height = Height) then
TWSWinControlClass(WidgetSetClass).SetShape(Self, AShape.Handle)
else
if AShape = nil then
TWSWinControlClass(WidgetSetClass).SetShape(Self, 0)
end;
procedure TWinControl.SetShape(AShape: TRegion);
begin
LCLIntf.SetWindowRgn(Handle, AShape.Reference.Handle, True);
end;
Alexx2000 писал(а):Вот на этот пример можно посмотреть - lazarus\examples\shapedcontrols, теоретически платформонезависимо.
Спасибо! Натолкнуло на мысль - добавить рюшек к софтине
Удалено
