GDI+命中问题,我放了一张Gif图片就无法命中,不放就可以
- Delphi(Pascal) code
unit Unit1;interfaceuses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Winapi.GDIPAPI,Winapi.GDIPOBJ,Winapi.GDIPUTIL, Vcl.StdCtrls, Vcl.ExtCtrls,Vcl.Imaging.pngimage,Vcl.Imaging.GIFImg;type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure FormPaint(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; i:Integer=10; path,Path1,Path2: TGPGraphicsPath; g:TGPGraphics; p: TGPPen; pen:TGPpen; newimg:TImage;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin if Timer1.Enabled then Timer1.Enabled:=False else Timer1.Enabled:=True;end;procedure TForm1.FormCreate(Sender: TObject); var gif:TGIFImage;begingif:=TGIFImage.Create;gif.LoadFromFile('F:\Program Files\duowan\yy-4\4.16.0.5\yygame_image\未命名.gif');gif.Animate:=True; newimg:=TImage.Create(Self); newimg.Picture.Assign(gif); newimg.Left:=10; newimg.Top:=20; newimg.AutoSize:=true; //newimg.Parent:=Form1; //GIF图片随着线冒一起动 newimg.Transparent:=True;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);begintryif path.IsOutlineVisible(x,y,p,g) then Text:='在基础线上';if Path1.IsVisible(MakePoint(x,y)) then Text:='在圆内';if path2.IsOutlineVisible(x,y,pen,g) then Text:='在线上';except //end;end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);beginif Button=mbLeft thenbeginif path.IsOutlineVisible(x,y,p,g) then ShowMessage('左键在基础先上按下并弹起');//if Path2.IsOutlineVisible(x,y,pen,g) then ShowMessage('左键在线上按下并弹起');end;end;procedure TForm1.FormPaint(Sender: TObject);begin g := TGPGraphics.Create(Canvas.Handle); p:= TGPPen.Create(aclGray, 2); path:=TGPGraphicsPath.Create; path.AddLine(10,20,300,20); Path1 := TGPGraphicsPath.Create; Path1.AddEllipse(MakeRect(i+2,15,5,5)); Path2 := TGPGraphicsPath.Create; Path2.AddLine(10,20,I,20); g.DrawPath(p,path); g.DrawPath(Pen,Path1); g.DrawPath(Pen,Path2); p.Free; g.Free;end;procedure TForm1.Timer1Timer(Sender: TObject);var image:TGPImage;beginI:=I+1;Repaint;g := TGPGraphics.Create(Canvas.Handle);image:=TGPImage.Create('F:\Program Files\duowan\yy-4\4.16.0.5\yygame_image\yg_ico_gametool_n.png');Pen := TGPPen.Create(aclWhite,2);g.DrawPath(Pen,Path1);g.DrawPath(Pen,Path2);g.DrawImage(image,MakeRect(i,15,10,10));newimg.Left:=i;end;新手,代码写的很乱。。
其实是想自己画一个播放器的那个条条,QQ音乐上面后面也带了GIF图片的效果,实现是可以,但是无法命中,去除GIF图片后就可以命中,求高手帮帮忙
[解决办法]
不是很理解你的“命中”是指命中什么东西,如果是因newimg阻挡了窗体点击,可以按下面代码处理:
- Delphi(Pascal) code
......procedure TForm1.FormCreate(Sender: TObject);var gif:TGIFImage;begin gif:=TGIFImage.Create; gif.LoadFromFile('F:\Program Files\duowan\yy-4\4.16.0.5\yygame_image\未命名.gif'); gif.Animate:=True; newimg:=TImage.Create(Self); newimg.Picture.Assign(gif); newimg.Left:=10; newimg.Top:=20; newimg.AutoSize:=true; //newimg.Parent:=Form1; //GIF图片随着线冒一起动 newimg.Transparent:=True; newimg.OnMouseMove:=FormMouseMove; newimg.OnMouseUp:=FormMouseUp;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);var x1,y1:integer;begin x1:=x; y1:=y; if Sender.ClassName='TImage' then begin x1:=x1+newimg.Left; y1:=y1+newimg.Top; end; try if path.IsOutlineVisible(x1,y1,p,g) then Text:='在基础线上'; if Path1.IsVisible(MakePoint(x1,y1)) then Text:='在圆内'; if path2.IsOutlineVisible(x1,y1,pen,g) then Text:='在线上'; except // end;end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var x1,y1:integer;begin x1:=x; y1:=y; if Sender.ClassName='TImage' then begin x1:=x1+newimg.Left; y1:=y1+newimg.Top; end; if Button=mbLeft then begin if path.IsOutlineVisible(x1,y1,p,g) then ShowMessage('左键在基础先上按下并弹起'); //if Path2.IsOutlineVisible(x1,y1,pen,g) then ShowMessage('左键在线上按下并弹起'); end;end......