2013-06-09 20 views
5

È possibile realizzare, ad esempio, un TMemo trasparente al 20% o un altro componente vcl? come TButton o TEdit?Componente VCL Opacità/trasparenza

Mentre googling per soluzione che ho trovato questo:

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

From Here, poi ho pensato, se disegno immagine sul modulo (OnPaint) quindi impostare AlphaBlend ON, ho potuto ottenere questo effetto, ma con nessun successo, quando l'intera forma è trasparente, l'effetto principale necessario non è raggiunto, nessuna immagine bg dietro al memo.

enter image description here

L'effetto che voglio ottenere: (è fatto in Photoshop) enter image description here

è possibile? se è, come? (Non chiedo codice completo src a nessuno, solo articolo o piccolo esempio se possibile, o direzione, qualunque sia il modo in cui riesco a capirlo)

thnx per attenzione.


ho trovato la soluzione, creare la forma alphablended sul modulo con sfondo dell'immagine, quindi aggiungere memo sul modulo aggiunto e allinearlo al cliente, non il modo migliore, ma funziona bene: 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; 

ma c'è un altro problema, quando si preme il memo, sotto forma di fondo perde lo stato attivo, quando ho impostato genitore nuove forme a Form1, sopra problema è risolto, ma effetto di trasparenza è andato (la finestra è ancora trasparente, ma si può vedere attraverso la finestra di bg senza sfondo visibile) come posso risolvere questo problema?

+1

se TMemo è derivato da TWinControl, quindi ha proprietà '.Handle: HWND'. Forse puoi usarlo con Win32 GDI API per forzare TMemo alpha-blended. Tuttavia, questo potrebbe avere effetti collaterali o requisiti di compatibilità imprevisti. –

+0

come viene realizzato il tema precedente? qualche idea? – user2200585

+0

leggi la domanda modificata – user2200585

risposta

1

Penso che questa domanda venga posta molto spesso (forse non qui, ma l'ho vista molte volte prima). La cosa strana è che la risposta quasi mai si presenta anche se è lì, nascosta tra tutte le persone che parlano della domanda. Forse la domanda qui aiuterà a migliorare il processo di ricerca in futuro, semplicemente perché è stackoverflow :-)

In ogni caso, ecco la risposta che ho trovato l'anno scorso (vedi codice sotto). Non mio, ma funziona per me - link a author. In sostanza, il codice definisce un richedit derivato con gestore di eventi personalizzato per il messaggio 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

Ho dimenticato di menzionare, questo approccio dovrebbe funzionare anche per TMemo, ecc. – SpaghettiCook

+0

Non voglio rendere il bg completamente trasparente, voglio farlo 60-70% o giù di lì, questo è il problema. – user2200585

+0

@ user2200585, dovresti considerare il modo in cui una forma normale gestisce la trasparenza, ovvero AlphaBlend. – Peter

Problemi correlati