读书人

GDI+命中有关问题小弟我放了一张Gif

发布时间: 2012-09-11 10:49:03 作者: rapoo

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...... 

读书人网 >.NET

热点推荐