W
wujingping
Unregistered / Unconfirmed
GUEST, unregistred user!
98 肯定是不行的!本人99年就放弃98改用NT了。<br>本人不保留,全贴出来了,刚改了一个比较大的bug,内存会直线上升,现在好了。<br>最好在有代码着色的工具里面看。一点保留都没有了!!<br><br>unit Unit1;<br><br>interface<br><br>uses<br> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br> Dialogs, StdCtrls, ExtCtrls, Menus, gdipapi, gdipobj; //最后两个是 GDI+ 引擎<br><br>type<br> TForm1 = class(TForm)<br> Timer1: TTimer;<br> procedure FormCreate(Sender: TObject);<br> procedure FormDestroy(Sender: TObject);<br> Procedure MoveForm(var M:TWMNCHITTEST); Message WM_NCHITTEST;<br> procedure Timer1Timer(Sender: TObject);<br> private<br> { Private declarations }<br> public<br> { Public declarations }<br> end;<br><br>const<br> WS_EX_LAYERED = $80000;<br> LWA_COLORKEY = 1;<br> LWA_ALPHA = 2;<br> ULW_COLORKEY = 1;<br> ULW_ALPHA = 2;<br> ULW_OPAQUE = 4;<br><br>var<br> Form1: TForm1;<br> bmp, old_bmp : HBITMAP;<br> DC : HDC;<br> bitmap:array[1..15] of tgpbitmap;<br> j:integer;<br><br>Function UpdateLayeredWindow(hWnd : HWND;<br> hdcDst : HDC; pptDst : PPoint; psize : PSize;<br> hdcSrc : HDC; pptSrc : PPoint;<br> crKey : COLORREF;<br> pblend : PBlendFunction;<br> dwFlags : DWORD): BOOL; stdcall;<br><br>implementation<br><br>{$R *.dfm}<br><br>Function UpdateLayeredWindow; external 'user32.dll';<br><br>Procedure TForm1.MoveForm (var M:TWMNCHITTEST); // 移动无标题窗口用的<br>begin<br> //继承,窗体可以继续处理以后的事件<br> inherited;<br> M.Result:=HTCAPTION;<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>var<br> i : integer;<br>begin<br>//-------为窗口添加必要的属性 WS_EX_LAYERED<br> if SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED) = 0 then ShowMessage(SysErrorMessage(GetLastError)); <br> //----调入15张图片,tgpbitmap是gdi+ 的类,支持带alpha 通道的png 文件<br> for i:=1 to 15 do bitmap:=tgpbitmap.Create('./images/dd.'+inttostr(i)+'.png');<br> form1.Width:=bitmap[1].GetWidth;<br> form1.Height:=bitmap[1].GetHeight;<br> J:=1;<br>end;<br><br>procedure TForm1.FormDestroy(Sender: TObject);<br>var<br> i:integer;<br>begin<br> SelectObject(DC, old_bmp);<br> DeleteObject(bmp);<br> DeleteDC(DC);<br> for i:=1 to 15 do bitmap.Free;<br>end;<br><br>procedure TForm1.Timer1Timer(Sender: TObject);<br>var<br> pt1, pt2 : TPoint;<br> sz : TSize;<br> bf : TBlendFunction;<br>begin<br> if j>15 then j:=1;<br> //----准备updatelayeredwindow 的参数<br> pt1 := Point(left, top); //窗口做上角的坐标<br> pt2 := Point(0, 0); //这个就不用说了,一看见(0,0)就应该明白了<br> sz.cx := bitmap[1].GetWidth; //尺寸不要超过图像大小,不然窗口就什么都没有了,连个影子都没有<br> sz.cy := bitmap[1].GetHeight; //同上<br> bf.BlendOp := AC_SRC_OVER; //这些死记就行了<br> bf.BlendFlags := 0; //同上<br> bf.SourceConstantAlpha := $ff; //同上<br> bf.AlphaFormat := AC_SRC_ALPHA; //同上<br> //-----------------------------------<br> DeleteObject(bmp); //前面就是在这里犯的错误,不然占用的内存会无限增大<br> bitmap[j].GetHBITMAP(0,bmp); // HBITMAP是windows标准位图格式,支持透明,这里是从tgpbitmap 转化成 HBITMAP<br> DeleteDC(DC);<br> DC := CreateCompatibleDC(Canvas.Handle); //API的含义我倒是明白,为什么写这句话我就不明白了,反正就是需要<br> old_bmp := SelectObject(DC, bmp); //同上<br> UpdateLayeredWindow(Handle, Canvas.Handle, @pt1, @sz, DC, @pt2,0, @bf,ULW_ALPHA); //最关键的地方,前面都在为这句作准备<br> // 有了这句话,WM_PAINT就不发生了,窗口也不画了,控件也看不见了,titlebar都不见了,还好,功能还在,虽然都看不见,还是可以点的,菜单不受影响。总之,全都自己来画吧。<br> j:=j+1;<br>end;<br><br>end.<br>