У меня есть объект, состоящий из TFrame
, на нем TPanel
и на этом TИзображение
. Битовая карта назначается TImage
, содержащему пианино. Этот объект кадра помещается в TImage
, содержащий изображение, содержащее сетку. Смотрите изображение для примера.
Вопрос: Можно ли сделать рамку частично прозрачной, чтобы фоновое изображение, содержащее сетку (на главной форме), было смутно видно? В идеале степень прозрачности может быть установлена пользователем. Битмап имеет глубину 32 бита, но эксперименты с альфа-каналом не помогли. Панель не является строго обязательной. Он используется для быстрого создания рамки вокруг объекта. Я мог бы нарисовать это на изображении.
Обновление 1Добавлен небольшой пример кода. Основной блок рисует фон вертикальными линиями. Второй блок содержит TFrame и TImage на нем, который рисует горизонтальную линию. Я хотел бы видеть, что вертикальные линии частично просвечивают через изображение TFrame.
Обновление 2Что я не указал в исходном вопросе: TFrame является частью гораздо большего приложения и ведет себя независимо. Было бы полезно, если бы проблема прозрачности могла быть решена самим TFrame.
///////////////// Main unit, on mouse click draw lines and plot TFrame
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,
Unit2;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var background: TBitmap;
f: TFrame2;
i, c: Int32;
begin
background := TBitmap.Create;
background.Height := Image1.Height;
background.Width := Image1.Width;
background.Canvas.Pen.Color := clBlack;
for i := 0 to 10 do
begin
c := i * background.Width div 10;
background.Canvas.MoveTo (c, 0);
background.Canvas.LineTo (c, background.Height);
end;
Image1.Picture.Assign (background);
Application.ProcessMessages;
f := TFrame2.Create (Self);
f.Parent := Self;
f.Top := 10;
f.Left := 10;
f.plot;
end;
end.
///////////////////Unit containing the TFrame
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TFrame2 = class(TFrame)
Image1: TImage;
procedure plot;
end;
implementation
{$R *.dfm}
procedure TFrame2.plot;
var bitmap: TBitmap;
begin
bitmap := TBitmap.Create;
bitmap.Height := Image1.Height;
bitmap.Width := Image1.Width;
bitmap.PixelFormat := pf32Bit;
bitmap.Canvas.MoveTo (0, bitmap.Height div 2);
bitmap.Canvas.LineTo (bitmap.Width, bitmap.Height div 2);
Image1.Picture.Assign (bitmap);
end;
end.
Обновление 3Я надеялся, что будет какое-то сообщение или вызов API, которые приведут к решению, позволяющему элементу управления сделать себя частично прозрачным, как это делает сообщение WMEraseBkGnd для полной прозрачности. В своих решениях как Sertac, так и NGLN указывают на моделирование прозрачностис помощью функции AlphaBlend. Эта функция объединяет два растровых изображения и поэтому требует знания фонового изображения. Теперь мой TFrame имеет дополнительное свойство: BackGround: TImage
, которое назначается родительским элементом управления. Это дает желаемый результат (увидеть, как это работает, ооочень профессионально :-)
RRUZ указывает на библиотеку Graphics32. То, что я видел, дает фантастические результаты, для меня кривая обучения слишком крутая.
Спасибо всем за помощь!