5

例えば ​​20% 透明な TMemo または他の vcl コンポーネントを作成することは可能ですか? TButton や TEdit のような?

解決策をグーグルで検索しているときに、次のことがわかりました。

http://img21.imageshack.us/img21/7865/screenshotizn.png

From Here、次に、フォーム (OnPaint) に画像を描画し、AlphaBlend をオンに設定すると、この効果を達成できると思いましたが、フォーム全体が透明な場合、主に必要な効果が得られず、メモの背後に背景画像がありません。 .

ここに画像の説明を入力

達成したい効果:(フォトショップで行われます) ここに画像の説明を入力

これは可能ですか?もしそうなら、どのように?(私は完全な src コードを誰にも求めていません。記事や可能であれば小さな例、または方向性など、私が理解できる方法は何でも)

注意のためのthnx。


私は解決策を見つけ、画像の背景を持つフォームにアルファブレンドフォームを作成し、追加されたフォームにメモを追加してクライアントに合わせますが、これは最善の方法ではありませんが、うまくいきます: ここに画像の説明を入力

procedure TForm1.Button1Click(Sender: TObject);
var
 MM : TMyMemo; frm : TForm;
begin
 frm := TForm.Create(Form1);
 frm.BorderStyle := bsNone;
 frm.AlphaBlend := true;
 frm.AlphaBlendValue := 150;
 frm.Left     := Form1.Left + 90;
 frm.Top      := Form1.Top + 90;
 frm.Width    := 300;
 frm.Height   := 300;
 frm.Position := poDesigned;
 frm.Visible := true;

 MM             := TMyMemo.Create(frm);
 MM.Parent      := frm;
 MM.BorderStyle := bsNone;
 MM.ParentColor := False;
 MM.Align       := alClient;
 MM.Color       := clBlack;
 MM.Font.Color  := clWhite;
 MM.Font.Name   := 'Sylfaen';
 MM.Font.Size   := 11;
 MM.Visible     := True;

 frme := True;
end;

しかし、別の問題があります。メモを押すと、背景フォームがフォーカスを失い、新しいフォームの親を Form1 に設定すると、上記の問題は解決されますが、透明効果はなくなります (ウィンドウはまだ透明ですが、bg ウィンドウが表示されずに見ることができます)背景)どうすればこの問題を解決できますか?

4

1 に答える 1

1

この質問は非常に頻繁に聞かれると思います (ここではないかもしれませんが、以前に何度も見たことがあります)。奇妙なことに、答えはそこにあり、質問を議論しているすべての人々の中に隠されているにもかかわらず、ほとんど出てこない. ここでの質問は、stackoverflow であるため、将来的に検索プロセスを改善するのに役立つかもしれません :-)

とにかく、これが昨年見つけた答えです(以下のコードを参照)。私のものではありませんが、私にとってはうまくいきます-作者へのリンク。基本的に、このコードは、WM_ERASEBACKGROUND メッセージのカスタム イベント ハンドラーを使用して、派生したリッチエディットを定義します。

unit TransparentRichEdit;

{ Component made by Proger_XP | http://Proger.i-Forge.net }

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ComCtrls, Graphics;

type
  TTransparentRichEdit = class (TRichEdit)
  protected
    FCanvas: TCanvas;
    FBackground: TPicture;

    procedure CreateWnd; override;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

    procedure SetBackground(const Value: TPicture);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Background: TPicture read FBackground write SetBackground;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Miscellaneous', [TTransparentRichEdit]);
end;

{ TTransparentRichEdit }

constructor TTransparentRichEdit.Create(AOwner: TComponent);
begin
  inherited;
  FCanvas := TCanvas.Create;
  FBackground := TPicture.Create;
end;

destructor TTransparentRichEdit.Destroy;
begin
  FBackground.Free;
  FCanvas.Free;
  inherited;
end;

procedure TTransparentRichEdit.CreateWnd;
begin
  inherited;
  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
end;

procedure TTransparentRichEdit.WMEraseBkgnd(var Message: TWMEraseBkgnd);
var
  UpdateRect: TRect;
  Rgn: HRGN;
  ToBeErased: Boolean;
  Mem: TBitmap;
begin
  ToBeErased:= false;
  Mem := TBitmap.Create;
  try
    Mem.Width := ClientWidth;
    Mem.Height := ClientHeight;

    FCanvas.Handle := Message.DC;
    Message.Result := 1;

    if not GetUpdateRect(Handle, UpdateRect, ToBeErased) then
      UpdateRect := Rect(0, 0, ClientWidth, ClientHeight);
    with UpdateRect do
      Rgn := CreateRectRgn(Left, Top, Right, Bottom);
    SelectClipRgn(FCanvas.Handle, Rgn);

    FCanvas.Draw(0, 0, FBackground.Graphic);
  finally
    Mem.Free;
  end;
end;

 procedure TTransparentRichEdit.SetBackground(const Value: TPicture);
 begin
   FBackground.Assign(Value);
   Repaint;
 end;

 end.
于 2013-06-10T10:35:05.833 に答える