TFrame
、、その上、TPanel
およびその上で構成されるオブジェクトがありますTImage
。TImage
ビットマップは、ピアノロールを含むものに割り当てられます。このフレームオブジェクトはTImage
、グリッドを含む画像を含むに配置されます。例については、画像を参照してください。
質問:フレームを部分的に透明にして、グリッドを含む背景画像(メインフォーム上)が漠然と見えるようにすることは可能ですか?理想的には、透明度の量はユーザーが設定できます。ビットマップの深さは32ビットですが、アルファチャネルを試してみても役に立ちませんでした。パネルは厳密には必要ありません。オブジェクトの周囲にすばやく境界線を付けるために使用されます。それを画像に描くことができました。
アップデート1小さなコード例が追加されました。本体は縦線で背景を描きます。2番目のユニットには、水平線を描画する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.
Update 3 WMEraseBkGndメッセージが完全な透過性を実現するように、コントロールが部分的に透過的になるソリューションをもたらすメッセージまたはAPI呼び出しがあることを期待していました。彼らのソリューションでは、SertacとNGLNの両方が、AlphaBlend関数を使用して透明度をシミュレートすることを示しています。この関数は2つのビットマップをマージするため、背景画像の知識が必要です。これで、TFrameに追加のプロパティがあります。BackGround: TImage
これは親コントロールによって割り当てられます。それは望ましい結果をもたらします(それが機能するのを見るのはとてもプロフェッショナルです:-)
RRUZはGraphics32ライブラリを指します。私が見たところ、それは素晴らしい結果を生み出します。私にとって、学習曲線は急すぎます。
よろしくお願いします!