这个问题我也研究过好久,png图片无损的转换成bmp好多软件都可以做得到,如果想把带透明信息的bmp无损的显示在窗口上那么必须用层次窗口函数UpdateLayeredWindow显示窗口,那么图片显示很完美,只是窗口不见了,图片又无法进行交互,给你一段代码,如果有兴趣研究一下,有了答案记得告诉我怎么做(小雨哥对这有研究网上搜看他最近有没有进展):unit Unit1;// 请勿删除代码来源声明 www.01cn.net// 请勿发到 playicq . . 小雨哥{ 借花献佛,小雨哥不会见怪吧! Modified by delcomp in 05/12/2005 Envirement: Win2k Sp4+ Delphi6.0 Enterprise The two images with alpha channel were transformed from png format source picture. }interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormShow(Sender: TObject); private Bitmap:TBitmap; procedure LayeredWindow(wnd: THandle; Bmp: TBitmap; Alpha: Byte); public procedure WMNCHitTest(var Message: TWMNCHitTest);message WM_NCHitTest; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; end;var Form1: TForm1;implementationuses Unit2;{$R *.DFM}procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);begin inherited; Message.Result := htCaption; // 获得鼠标点击移动的效果end;procedure TForm1.WMPaint(var Message: TWMPaint);begin //这个函数不会被执行!因为调用了UpdateLayeredWindow inherited;end;procedure TForm1.LayeredWindow(wnd: THandle; Bmp: TBitmap; Alpha: Byte);var Pt: TPoint; //ARect: TRect; Size: TSize; bf: TBlendFunction;begin{MSDN: UpdateLayeredWindow always updates the entire window. To update part of a window, use the traditional WM_PAINT and set the blend value using SetLayeredWindowAttributes.BOOL UpdateLayeredWindow( HWND hwnd, // handle to layered window HDC hdcDst, // handle to screen DC,If hdcDst is NULL, the default palette will be used. POINT *pptDst, // new screen position SIZE *psize, // new size of the layered window HDC hdcSrc, // handle to surface DC POINT *pptSrc, // layer position (源 DC 的 TopLeft) COLORREF crKey, // color key (透明颜色值) BLENDFUNCTION *pblend, // blend function (Alpha 混合函数) DWORD dwFlags // options (一组标志位常量,ULW_ALPHA:Alpha透明,ULW_COLORKEY:颜色透明));} //set the parameter of BlendFunction , refer to the MSDN bf.BlendOp := AC_SRC_OVER; bf.BlendFlags := 0; // 必须是 0 bf.SourceConstantAlpha := Alpha; //透明度 bf.AlphaFormat := AC_SRC_ALPHA; //GetWindowRect(wnd, ARect); Pt:= Point(0, 0); Size.cx:= Bmp.Width; Size.cY:= Bmp.Height; //对窗口设置新的扩展风格标志 SetWindowLong(wnd, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED); //调用 UpdateLayeredWindow 获得需要的异型窗口 if not UpdateLayeredWindow( wnd, GetDC(0), nil,//@ARect.TopLeft, @Size, Bmp.Canvas.Handle, @Pt, 0, @bf, ULW_ALPHA) then ShowMessage('Call Failed!');end;procedure TForm1.FormCreate(Sender: TObject);var Alpha:Byte;begin Bitmap:= TBitmap.Create; Bitmap.LoadFromFile('ball.bmp'); Alpha:= 255; // 图片 Alpha 值 LayeredWindow(Handle, Bitmap, Alpha);end;procedure TForm1.FormDestroy(Sender: TObject);begin Bitmap.Free;end;procedure TForm1.Button1Click(Sender: TObject);begin close;end;procedure TForm1.FormShow(Sender: TObject);begin //在另外窗口上显示本窗口的控件。因为 UpdateLayeredWindow覆盖本窗口所有内容 Button1.Parent:= Form2; Form2.show;end;end.