用Delphi实现热点

这篇博客介绍了如何在Delphi中实现图形热点,包括创建椭圆形、四边形和三角形的区域,并通过`ptinregion`函数检测鼠标点击是否在热点区域内。用户点击按钮时,程序会释放区域资源并终止。
  1. unit nRdUnit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, ExtCtrls;
  6. type
  7.   TForm1 = class(TForm)
  8.     Image1: TImage;
  9.     Button1: TButton;
  10.     Label1: TLabel;
  11.     procedure Button1Click(Sender: TObject);
  12.     procedure FormCreate(Sender: TObject);
  13.     procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
  14.       Shift: TShiftState; X, Y: Integer);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20. var
  21.   Form1: TForm1;
  22.   elli_rgn,fourE_rgn,tri_rgn:hrgn;//指向椭圆形、四边形、三角形的区域变量
  23. implementation
  24. {$R *.DFM}
  25. procedure TForm1.Button1Click(Sender: TObject);
  26. begin
  27.   //释放三个区域指针变量所占内存
  28.   DeleteObject(Elli_rgn);
  29.   DeleteObject(tri_rgn);
  30.   DeleteObject(fourE_rgn);
  31.   application.terminate;
  32. end;
  33. procedure TForm1.FormCreate(Sender: TObject);
  34. var
  35.     thepoint:array [1..8of tpoint;//存储多边形顶点坐标
  36.     count:integer;
  37.     pointnum:array [1..2of integer;
  38. begin
  39. //四边形顶点坐标,首末点封闭
  40.   thepoint[1]:=point(135,99);
  41.   thepoint[2]:=point(105,183);
  42.   thepoint[3]:=point(129,201);
  43.   thepoint[4]:=point(188,92);
  44.   thepoint[5]:=point(135,99);
  45.   count:=5;//四边形顶点数目,首末点为一点
  46.   fourE_rgn:=CreatePolygonRgn(thepoint,count,WINDING);//生成四边形区域
  47.   elli_rgn:=CreateEllipticRgn(64,221,231,263);// 生成椭圆形区域
  48.   //第一个三角形顶点坐标
  49.   thepoint[1]:=point(118,67);
  50.   thepoint[2]:=point(32,28);
  51.   thepoint[3]:=point(17,90);
  52.   thepoint[4]:=point(118,67);
  53.   //第二个三角形顶点坐标
  54.   thepoint[5]:=point(155,44);
  55.   thepoint[6]:=point(202,91);
  56.   thepoint[7]:=point(277,44);
  57.   thepoint[8]:=point(155,44);
  58.   pointnum[1]:=4;//第一个三角形顶点数目
  59.   pointnum[2]:=4;//第二个三角形顶点数目
  60.   count:=2;//三角形数目
  61. //生成由两个三角形构成的三角形区域
  62. tri_rgn:=CreatePolyPolygonRgn(thepoint,pointnum,count,WINDING);
  63. end;
  64. procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  65.   Shift: TShiftState; X, Y: Integer);
  66. var
  67.     flag1,flag2,flag3:boolean;
  68. begin
  69.    //三个标志变量以判明鼠标没有击中热点
  70.    flag1:=false; flag2:=false;  flag3:=false;
  71.    //热点的判断
  72.    if  ptinregion(Elli_rgn,x,y) then label1.caption:='椭圆'
  73.        else  flag1:=true;
  74.    if ptinregion(tri_rgn,x,y) then label1.caption:='三角形'
  75.        else flag2:=true;
  76.    if ptinregion(fourE_rgn,x,y) then label1.caption:='四边形'
  77.        else flag3:=true;
  78.    if  (flag1 and flag2 and flag3) then  label1.caption:='鼠标没有击中热点';
  79. end;
  80. end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值