2013-06-09 38 views
5

Czy jest możliwe wykonanie np. Przezroczystego TMemo lub innego komponentu VCL w 20%? jak TButton czy TEdit?Komponent VCL Nieprzezroczystość/przezroczystość

Podczas googlowania do sporządzania roztworu Znalazłem to:

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

From Here, potem pomyślałem, gdybym narysować obraz na formularzu (OnPaint), a następnie ustawić AlphaBlend ON, mogę osiągnąć ten efekt, ale z bez powodzenia, gdy cała forma jest przejrzysta, główny pożądany efekt nie jest osiągany, nie ma bg pic za pamięcią.

enter image description here

efekt chcę osiągnąć: (nie jest to zrobić w photoshopie) enter image description here

Czy to możliwe? jeśli tak, jak? (nie pytam o pełny kod src, tylko artykuł lub mały przykład, jeśli to możliwe, lub kierunek, niezależnie od tego, jak rozumiem)

thnx za uwagę.


Znalazłem rozwiązanie, należy utworzyć formularz alphablended na postaci z obrazu tła, a następnie dodać notatkę na dodatkową formę oraz dostosowanie go do klienta, nie jest najlepszym sposobem, ale to działa dobrze: enter image description here

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; 

ale jest inny problem, po naciśnięciu na notatki, forma tło traci ostrość, kiedy ustawiony rodzica nowych form do Form1, powyższy problem został rozwiązany, ale przejrzysty efekt znika (okno jest nadal przezroczysta, ale można przejrzeć okno bg bez widocznego tła) Jak mogę rozwiązać ten problem?

+1

jeśli TMemo pochodzi od TWinControl to ma właściwość '.Handle: HWND'. Być może możesz go użyć z interfejsem API Win32 GDI, aby zmusić TMemo do mieszania alfa. Może to jednak mieć nieoczekiwane skutki uboczne lub wymagania zgodności. –

+0

jak powyższy temat jest wykonany? jakieś pomysły? – user2200585

+0

przeczytać edytowane pytanie – user2200585

Odpowiedz

1

Myślę, że to pytanie jest często zadawane (może nie tutaj, ale widziałem to wiele razy wcześniej). Dziwne jest to, że odpowiedź prawie nigdy nie pojawia się, chociaż jest tam, ukryta wśród wszystkich ludzi omawiających to pytanie. Może to pytanie pomoże ulepszyć proces wyszukiwania w przyszłości, po prostu dlatego, że jest stackoverflow :-)

W każdym razie, oto odpowiedź, którą znalazłem w zeszłym roku (patrz kod poniżej). Nie moje, ale działa dla mnie - link do author. Zasadniczo kod definiuje wyprowadzony richedit za pomocą niestandardowej procedury obsługi zdarzeń dla komunikatu 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. 
+0

Zapomniałem wspomnieć, że to podejście powinno również działać dla TMemo, itp. – SpaghettiCook

+0

Nie chcę, aby bg było całkowicie przezroczyste, chcę zrobić to 60-70% lub więcej, to jest problem. – user2200585

+0

@ user2200585, powinieneś spojrzeć na sposób, w jaki normalny formularz obsługuje przezroczystość alfaBlend. – Peter