procedure TForm10.FormDestroy(Sender: TObject);
begin
SetWindowLong (TreeView1.Handle,GWL_WNDPROC,Long Int(OldWndProc));
if New WndProc<>nil then
FreeObjectInstance(NewWndProc);
end;
procedure TForm10.FormCreate(Sender: Tobject);
begin
NewWndproc :=MakeObjectInstance(TreeView_WndProc);
//保留树1原窗口过程
OldWndProc :=Pointer(GetWindowLong(TreeView1.Handle,GWL_WNDPROC));
//设置TREEVIEW1新的窗口过程
SetWindowLong(TreeView1.Handle,GWL_WNDPROC,LongInt(NewWndProc));
end;
procedure TForm10.TreeView_WndProc(var msg: TMessage);
begin
case Msg.Msg of
WM_ERASEB KGND
begin
Msg.Result :=1;
exit;
end;
WM_SIZE,WM_HSCROLL,WM_VSCROLL,WM_LBUTTONDOWN,WM_MOUSEWHEEL:
begin
InvalidateRect(TreeView1.Handle,nil,False);
end;
WM_PAINT:
begin
TreeView_DrawBKGnd(TreeView1);
end;
end;
//其他情况下,调用原窗口过程处理消息
Msg.Result :=CallWindoeProc(OldWnd_Proc,TreeView1.Handle,Msg.Msg,Msg.WParam,Msg.LParam);
end;
procedure TForm10.TreeView_DrawBkGnd(Sender: TTreeView);
begin
var
PS:TPAINTSTRUCT;
DC:HDC;
hMemDC1,hMemDC2:HDC;
hMemBmp1,hMemBmp2,hOldBmp1,hOldBmp2:HBITMAP;
end;
tvWidth,tvHeight,bmpWidth,bmpHeight: integer; i,j,k,w:integer;
Bitmap:TBitmap;
begin
Bitmap := Image1.Picture.Bitmap;
tvWidth :=Sender.ClientWidth;
tvHeight:=Sender.ClientHeight;
try
BeginPaint(Sender.Handle,PS
finally
DC:=PS.hdc; hMemDC1 := CreateCompatibleDC(DC);
hMemBmp1 := CreateCompatibleBitmap(DC,tvWidth,tvHeight);
//建立与设备兼容的位图
hOldBmp1 :=SelectObject(hMemDC1,hMemBmp1);
//调用原窗口过程处理WM-PAINT,让treeview在hmemdc1绘制:前景图:
CallWindowProc(OldWndProc,Sender.Handle,WM_PAINT,hMemDC1,0));
//创立另一临时设备场景
hMemDC2 :=CreateCompatibleDC(DC);
hMemBmp2 := CreateCompatibleBitmamp(DC,tvWidth,tvHeight);
hOldBmp3 := SelectObject(hMemDC2,hMemBmp2);
BmpWidth := Bitmap.Width;
BmpHeight :=Bitmap.Height;
//采用平铺的方法话背景图片
k := tvWidth div BmpWidth;
w := tvHeight div BmpHeight;
for i := 0 to k do
for j := 0 to w do
BitBlt(hMemDC2,i*BmpWidth,j*BmpHeight,BmpWidth,BmpHeight,Bitmap,Canvas.Handle,0,0,SRCOOPY);
StretchBlt(hMemDC2,0,0,tvWidth,tvHeight,bitmap.Canvas.Handle0,0,BmpWidth,BmpHeight,SRCCOPY);
直接借用msimg32.dll提供的函数画透明图比较方便
Transparentblt(hMemDC2,0,0,tvWidth,tvHeight,hMemDC1,0,0,tvWidth,tvHeight,ColorToRGB(Sender.Color)):
BitBlt(DC,0,0,tvWidth,tvHeight,hMemDC2,0,0,SRCCOPY);
SelectObject(hMemDC1,hOldBMP1);
DeleteObject(hMemDC1);
DeleteObject(hMemBmp1);
SelectObject(hMemDC2,hOldBMP2);
DeleteObject(hMemDC2);
DeleteObject(hMemBmp2);
finally
EndPaint(Sender.HandlePS):
end;
end;
procedure TForm10.TreeView2CustomDraw(Sender: TCustomTreeView; const ARect: TRect;
var DefaultDraw: Boolean);
begin
Sender.Canvas.StretchDraw(ARect,Image1.Picture.Bitmap);
end;
end;