unit Unit9; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm9 = class(TForm) RichEdit1: TRichEdit; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); public FRichWindowProc: TWndMethod; procedure RichWindowProc(var message: TMessage); end; var Form9: TForm9; implementation {$R *.dfm} procedure TForm9.FormCreate(Sender: TObject); begin SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CLIPCHILDREN); SetWindowLong(RichEdit1.Handle, GWL_EXSTYLE, GetWindowLong(RichEdit1.Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT); FRichWindowProc := RichEdit1.WindowProc; RichEdit1.WindowProc := RichWindowProc; end; procedure TForm9.RichWindowProc(var message: TMessage); var Buffer: HDC; Bitmap, OldBitmap: HBITMAP; Origin: TPoint; begin if message.Msg <> WM_ERASEBKGND then FRichWindowProc(message) else begin message.Result := 1; Buffer := CreateCompatibleDC(TWMEraseBkGnd(message).DC); Bitmap := CreateCompatibleBitmap(TWMEraseBkGnd(message).DC, RichEdit1.Width, RichEdit1.Height); OldBitmap := SelectObject(Buffer, Bitmap); Origin := ScreenToClient(RichEdit1.ClientOrigin); MoveWindowOrg(Buffer, -Origin.X, -Origin.Y); Perform(WM_ERASEBKGND, Buffer, 0); Perform(WM_PAINT, Buffer, 0); MoveWindowOrg(Buffer, Origin.X, Origin.Y); BitBlt(TWMEraseBkGnd(message).DC, 0, 0, RichEdit1.Width, RichEdit1.Height, Buffer, 0, 0, SRCCOPY); SelectObject(Buffer, OldBitmap); DeleteDC(Buffer); DeleteObject(Bitmap); end; end; procedure TForm9.FormDestroy(Sender: TObject); begin RichEdit1.WindowProc := FRichWindowProc; end; end. |