Здесь на форуме нашел модуль компонента - прозрачного Memo. В Делфи7 работает замечательно. А вот с Делфи 2007 (Code Gear) не хочет быть прозрачным  как исправить его под 2007 версию? Вот код: | Код | unit TransMemo;
interface
uses SysUtils, Classes, Controls, StdCtrls, Windows, Messages, Forms;
type TCrackWinControl = class(TWinControl);
TTransparentMemo = class(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;
procedure Register;
implementation
const BorderRec: array[TBorderStyle] of Integer = (1, -1);
procedure Register; begin RegisterComponents('TransMemo', [TTransparentMemo]); end;
{ TTransparentMemo }
constructor TTransparentMemo.Create(AOwner: TComponent); begin inherited Create(AOwner); FAlignText := taLeftJustify; FTransparent := False; FPainting := False; end;
destructor TTransparentMemo.Destroy; begin inherited Destroy; end;
procedure TTransparentMemo.SetAlignText(Value: TAlignment); begin if FAlignText <> Value then begin FAlignText := Value; RecreateWnd; Invalidate; end; end;
procedure TTransparentMemo.SetTransparent(Value: Boolean); begin if FTransparent <> Value then begin FTransparent := Value; Invalidate; end; end;
procedure TTransparentMemo.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 := ClientOrigin; Windows.ScreenToClient(Parent.Handle, p); p.x := -p.x; p.y := -p.y; MoveWindowOrg(DC, p.x, p.y); SendMessage(Parent.Handle, $0014, DC, 0); TCrackWinControl(Parent).PaintControls(DC, nil); RestoreDC(DC, i); end; end else inherited; end;
procedure TTransparentMemo.WMPaint(var Message: TWMPaint); begin inherited; if FTransparent then if not FPainting then RepaintWindow; end;
procedure TTransparentMemo.WMNCPaint(var Message: TMessage); begin inherited; end;
procedure TTransparentMemo.CNCtlColorEdit(var Message: TWMCtlColorEdit); begin inherited; if FTransparent then SetBkMode(Message.ChildDC, 1); end;
procedure TTransparentMemo.CNCtlColorStatic(var Message: TWMCtlColorStatic); begin inherited; if FTransparent then SetBkMode(Message.ChildDC, 1); end;
procedure TTransparentMemo.CMParentColorChanged(var Message: TMessage); begin inherited; if FTransparent then Invalidate; end;
procedure TTransparentMemo.WMSize(var Message: TWMSize); begin inherited; Invalidate; end;
procedure TTransparentMemo.WMMove(var Message: TWMMove); begin inherited; Invalidate; end;
procedure TTransparentMemo.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 TTransparentMemo.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;
procedure TTransparentMemo.Change; begin RepaintWindow; inherited Change; end;
procedure TTransparentMemo.SetParent(AParent: TWinControl); begin inherited SetParent(AParent); end;
end.
|
этот код из темы http://forum.vingrad.ru/topic-137700.html опубликовал YanisЭто сообщение отредактировал(а) Teleport - 31.8.2008, 00:05
|