给treeview加上背景
一般来说给treeview加个背景还是比较不容易的,我曾经按照网上的一些方法但是老是不成功。
前一段时间无意中看到了一段代码,是c#的,现在把它改成delphi下面的。代码比较乱
源码/Files/youkebing/app.rar
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls,ExtCtrls, jpeg;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
f:tFORM;
public
{ Public declarations }
end;
var
Form1: TForm1;
oldRichWnProc: TFarProc;
bFirst: Boolean=True;
//zt : THANDLE;
implementation
{$R *.dfm}
procedure cl(bitMap: TBitmap) ;
var
r:tRect;
begin
r.left:= 0;
r.Top:=0;
r.Right:= bitmap.Width;
r.Bottom:= bitmap.Height;
bitmap.Canvas.Brush.Bitmap := form1.Image1.Picture.Bitmap;
bitmap.Canvas.FillRect(r);
//BitBlt(bitmap.Canvas.Handle,0,0,bitmap.Width,bitmap.Height,form1.Image1.picture.bitmap.Canvas.Handle,0,0,SRCCOPY);
end;
function newRichWnProc(hWin:HWnd;uMsg:UINT;wPrm:WParam;lPrm:LParam):Longint;stdcall;
var
dc,yc: HDC;
cvs: TCanvas;
//nFstLine,nLineCount,nLineStart: integer;
//pt: TPoint;
rect,r :TRect;
//i : integer;
w,h : integer;
BitMap: TBitmap;
begin
case uMsg of
WM_ERASEBKGND:
begin
result:= 0;
exit;
end;
WM_PAINT :
begin
if(GetUpdateRect(hWin,rect,false)) then
begin
cvs:=TCanvas.Create;
cvs.Lock();
dc:=GetDc(hWin);
//yc := getdc(zt);
//cvs.Handle := yc;
GetClientRect(hWin,r);
w := r.Right-r.Left;
h := r.Bottom-r.Top;
r.Left:= 0;
r.Top:= 0;
r.Right:= w;
r.Bottom:= h;
bitmap := TBitmap.Create;
bitmap.Width := w;
bitmap.Height := h;
cl(bitmap);
sendmessage(hWin,WM_PRINTCLIENT,dc,0);
BitBlt(bitmap.Canvas.Handle,0,0,w,h,dc,0,0,SRCAND);
(BitBlt(dc,0,0,w,h,bitmap.Canvas.Handle,0,0,SRCCOPY));
ValidateRect(hWin, @rect);
cvs.Unlock;
cvs.Free;
ReleaseDC(hWin,dc);
result:= 0;
exit;
end;
end;
end;
result:=CallWindowProc(oldRichWnProc,hWin,uMsg,wPrm,lPrm);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
oldRichWnProc:=TFarProc(SetWindowLong(self.TreeView1.Handle,GWL_WNDPROC,Integer(@newRichWnProc)));
end;
end.