有谁知道使文本框的背景色设置与窗体上的图像颜色一致,像MSN那有有背景图的那种

解决方案 »

  1.   

    仿佛很难的样子
    edit没有canvas的
    期待高手
      

  2.   

    不知道有没有第三方的来设置透明度,现在暂时还想不出解决办法……
    upup...
      

  3.   

    unit Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, jpeg, ExtCtrls, StdCtrls, Mask, RzEdit;type
      TCtrl = class(TWinControl);
      TEdit = class(StdCtrls.TEdit)
      private
        FAlignText: TAlignment;
        FTransparent: Boolean;
        FPainting: Boolean;
        procedure SetAlignText(Value: TAlignment);
        procedure SetTransparent(Value: Boolean);
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
        procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
        procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
        procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
        procedure WMSize(var Message: TWMSize); message WM_SIZE;
        procedure WMMove(var Message: TWMMove); message WM_MOVE;
      protected
        procedure RepaintWindow;
        procedure CreateParams(var Params: TCreateParams); override;
        procedure Change; override;
        procedure SetParent(AParent: TWinControl); override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
        property Transparent: Boolean read FTransparent write SetTransparent default false;
      end;
      TMemo = class(StdCtrls.TMemo)
      private
        FAlignText: TAlignment;
        FTransparent: Boolean;
        FPainting: Boolean;
        procedure SetAlignText(Value: TAlignment);
        procedure SetTransparent(Value: Boolean);
        procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
        procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
        procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
        procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
        procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
        procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
        procedure WMSize(var Message: TWMSize); message WM_SIZE;
        procedure WMMove(var Message: TWMMove); message WM_MOVE;
      protected
        procedure RepaintWindow;
        procedure CreateParams(var Params: TCreateParams); override;
        procedure Change; override;
        procedure SetParent(AParent: TWinControl); override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
        property Transparent: Boolean read FTransparent write SetTransparent default false;
      end;
      TForm1 = class(TForm)
        Image1: TImage;
        Edit1: TEdit;
        Edit2: TEdit;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}const
      BorderRec: array[TBorderStyle] of Integer = (1, -1);function GetScreenClient(Control: TControl): TPoint;
    var
      p: TPoint;
    begin
      p := Control.ClientOrigin;
      ScreenToClient(Control.Parent.Handle, p);
      Result := p;
    end;{ TEdit }procedure TEdit.Change;
    begin
      RepaintWindow;
     inherited Change;
    end;procedure TEdit.CMParentColorChanged(var Message: TMessage);
    begin
      inherited;
     if FTransparent then
     Invalidate;
    end;procedure TEdit.CNCtlColorEdit(var Message: TWMCtlColorEdit);
    begin
      inherited;
     if FTransparent then
     SetBkMode(Message.ChildDC, 1);
    end;procedure TEdit.CNCtlColorStatic(var Message: TWMCtlColorStatic);
    begin
      inherited;
     if FTransparent then
     SetBkMode(Message.ChildDC, 1);
    end;constructor TEdit.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FAlignText := taLeftJustify;
      FTransparent := True;
      FPainting := False;
      BorderStyle := bsNone;
      Font.Color := clRed;
      Font.Style := Font.Style + [fsBold];
      //Self.Align := alTop;
    end;procedure TEdit.CreateParams(var Params: TCreateParams);
    const
      Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
    begin
      inherited CreateParams(Params);
      Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
    end;destructor TEdit.Destroy;
    begin
      inherited Destroy;
    end;
      

  4.   

    procedure TEdit.RepaintWindow;
    var
     DC: hDC;
     TmpBitmap, Bitmap: hBitmap;
    begin
     if FTransparent then
     begin
      FPainting := true;
      HideCaret(Handle);
      DC := CreateCompatibleDC(GetDC(Handle));
      TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
      Bitmap := SelectObject(DC, TmpBitmap);
      PaintTo(DC, 0, 0);
      BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, 1, 1, SRCCOPY);
      SelectObject(DC, Bitmap);
      DeleteDC(DC);
      ReleaseDC(Handle, GetDC(Handle));
      DeleteObject(TmpBitmap);
      ShowCaret(Handle);
      FPainting := false;
     end;
    end;
    procedure TEdit.SetAlignText(Value: TAlignment);
    begin
      if FAlignText <> Value then
      begin
        FAlignText := Value;
        RecreateWnd;
        Invalidate;
      end;
    end;procedure TEdit.SetParent(AParent: TWinControl);
    begin
      inherited SetParent(AParent);
    end;procedure TEdit.SetTransparent(Value: Boolean);
    begin
      if FTransparent <> Value then
      begin
        FTransparent := Value;
        Invalidate;
      end;
    end;procedure TEdit.WMEraseBkGnd(var Message: TWMEraseBkGnd);
    var
     DC: hDC;
     i: integer;
     p: TPoint;
    begin
     if FTransparent then
     begin
      if Assigned(Parent) then
      begin
       DC := Message.DC;
       i := SaveDC(DC);
       p := GetScreenClient(self);
       p.x := -p.x;
       p.y := -p.y;
       MoveWindowOrg(DC, p.x, p.y);
       SendMessage(Parent.Handle, $0014, DC, 0);
       TCtrl(Parent).PaintControls(DC, nil);
       RestoreDC(DC, i);
      end;
     end else inherited;
    end;procedure TEdit.WMMove(var Message: TWMMove);
    begin
      inherited;
     Invalidate;
    end;procedure TEdit.WMNCPaint(var Message: TMessage);
    begin
      inherited;
    end;procedure TEdit.WMPaint(var Message: TWMPaint);
    begin
      inherited;
     if FTransparent then
     if not FPainting then
     RepaintWindow;
    end;procedure TEdit.WMSize(var Message: TWMSize);
    begin
      inherited;
     Invalidate;
    end;
      

  5.   

    丫,不能一次全部贴下,就贴了tedit的部分。memo的就去掉了。
    把uses里的rzedit去掉,里面没用到。在当前窗体中加如的任何edit,都为透明的了!
      

  6.   

    谢谢,不过有点长,说说原理行吗?是不是把当前EDIT所遮挡的窗体背景作当前EDIT的背景吗?