ImageVerifierCode 换一换
格式:DOC , 页数:10 ,大小:68KB ,
资源ID:6975537      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6975537.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(delphi的Hint详解.doc)为本站会员(wspkg9802)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

delphi的Hint详解.doc

1、Delphi 的 Hint Delphi 中使用提示是如此简单,只需将欲使用 Hint 的控件作如下设置: ShowHint := True; Hint := 提示信息; 不必写一行代码,相当方便。 但有时我们又想自己定制提示的效果,使其看起来更美观更具个人特色,没关系,Delphi 完全有办法让你写出自己喜欢的 Hint 效果。 Delphi 的 Hint 功能实现归类在 Application 类中,所以我们可以在Application 类中看到数个关于 Hint 的属性,这些属性可以设置 Hint 窗口的颜色,停留时间,出现时间等,设置了这些属性,将对整个工程的 Hint功能起到影响。这

2、样做的好处当然是统一了 Hint 的风格,并且让其他类不必去理会 Hint 的实现。 我们可以建一个简单的工程,并放一个按钮,将按钮的 ShowHint 设为True,再对 Hint 设一个值。运行程序,当光标指到按钮上时,便会出现一个提示窗口。 但如果我们在主窗口的创建事件中写下: procedure TForm1.FormCreate(Sender: TObject); begin Application.ShowHint := False; end; 这些再运行程序,就不再有提示出现了,由此可知 Application 的ShowHint 控制整个工程的 Hint 是否显示。 如果你对于

3、平常所见的 Hint 窗口的颜色感到厌烦,那么可以设Application 的 HintColor 为其他颜色。但此时有一个问题,如果HintColor 设为黑色,则提示字体也为黑色,就看不到提示信息了。为此,我们得了解另一个全局对象,事实上当程序运行时,会创建三个全局对象:Application,Screen,Mouse,三个对象的职责非常明显。Screen 封闭了运行的工程在屏幕上的状态,它有一个 HintFont 的属性,允许你设置提示信息的字体。 我们可以写如下的代码: procedure TForm1.Button1Click(Sender: TObject); begin Appl

4、ication.HintColor := clBlack; Screen.HintFont.Color := clWindow; Screen.HintFont.Size := 14; end; 运行程序看看效果,提示字体变为白色,且变大了。 另外 Application 有这三个属性: HintHidePause,HintPause,HintShortPause,控制着提示窗显示的时间等。HintHidePause 指定提示窗口在屏幕上显示的时间,以毫秒为单位。HintPause 则指定当你将光标移到有提示的控件上时,经过多长时间才会出现提示窗口,以毫秒为单位。而 HintShortPaus

5、e 呢表示当你快速移动光标经过一组有 Hint 的控件时,显示 Hint 的间隔。比如有两个有 Hint 的控钮,当你的光标快速从 Btn1 移到 Btn2 时,Hint 经过 HintShortPause 毫秒才会显示出来。 Application 中有一个比较特殊的属性 Hint,我们不禁要奇怪,Hint 指定的是那个控件的提示呢。其实 Hint 属性的一个很大的用途是给那些没有办法直接出现 Hint 窗口的控件一个机会,使它们能够通过别的方式出现提示。比如菜单,我们没有办法使菜单出现 Hint 窗口,但我们可以使菜单的 Hint 出现在状态栏上的。 我们在上面的工程主窗口中加一个状态栏,

6、并在加一个菜单控件,设置几个菜单项,并给每个菜单荐的 Hint 属性设置一些字符串。 然后写下: procedure TForm1.FormCreate(Sender: TObject); begin Application.OnHint := WhenHint; end; procedure TForm1.WhenHint(sender: TObject); begin StatusBar1.SimpleText := Application.Hint; end; 运行程序,当你指到菜单项时,看,状态栏上出现了提示了。 上面可以看到,通过一些简单的代码,就可以使得提示别具特色。但人们是永远不

7、会满足的,他们总想能不能做更好看的 Hint 呢,甚至对 Hint 的窗口风格提出了要求。Delphi 的工程师们早想到了这一点,他们通过类的继承设定了一个提示窗口的父类,即我们看到的那个 Hint 窗口,我们可以通过继承它并覆盖它所提供的虚拟方法来写自己的提示窗口。 去读一读 HintWindow 的源码吧,你只要覆盖几个虚拟方法,你就可以做出很漂亮的提示出来了。 Delphi 的 Hint 虽然简单易用,但却不够灵活,因为它提供了统一的风格,所以你不能指定某个提示为错误指示,可某个提示为警告提示。关于这个,我们要用 API 来实现,在网上找一个漫画式提示,有很多文章可用。这里不再说述。 上

8、一篇介绍了 Hint 的简单应用,这一篇将给出一个定制 Hint 窗口的例子。这个自定义 Hint 窗口的效果不错,以玻璃为边框,并且有阴影的效果。 不过这之前,我们必须介绍一个如何定制,Hint 的父类为 THintWindow,在Controls 单元中定义。我们看看几个虚拟方法,CreateParams 设定窗口的风格,我们要覆盖掉它,使其没有边框。NCPaint 画窗口的边框,我们也要覆盖它,因为我们不需要边框吗。Paint 比较重要,为画 Hint 窗口客户区内容,当然要覆盖。不过最重要的当属 ActivateHint,它会设定好窗口的大小,并显示它,我们就在这里定制一个类玻璃的窗口

9、效果。下面给出该类的实现: unit wdHintWnd; interface uses Windows, Classes, Controls, Graphics, Forms, SysUtils, ExtCtrls; type TwdHintWnd = class(THintWindow) private FWndBmp: TBitmap; /窗口位图 FHintBmp: TBitmap; /提示信息位图 protected procedure CreateParams(var Params: TCreateParams); override; procedure Paint; overri

10、de; procedure NCPaint(DC: HDC); override; 画提示的图象 procedure DrawHintImg(Bmp:TBitmap; AHint: string); 取得提示窗口对应的桌面区域的图象 procedure GetDesktopImg(Bmp: TBitmap; R: TRect); 对桌面区域图象作处理, 使其看起来像一块玻璃且带有一点阴影 procedure EffectHandle(WndBmp, HintBmp: TBitmap); public constructor Create(Aowner: TComponent); overrid

11、e; destructor Destroy; override; procedure ActivateHint(Rect: TRect; const AHint: string); override; end; implementation TwdHintWnd procedure TwdHintWnd.ActivateHint(Rect: TRect; const AHint: string); var P: TPoint; begin /在这里取得一个适当的尺寸显示文字 FHintBmp.Width := Rect.Right - Rect.Left; FHintBmp.Height :=

12、 Rect.Bottom - Rect.Top + 4; DrawHintImg(FHintBmp, AHint); FWndBmp.Width := Rect.Right - Rect.Left + 23; FWndBmp.Height := Rect.Bottom - Rect.Top + 27; Inc(Rect.Right, 23); Inc(Rect.Bottom, 27); BoundsRect := Rect; if Left Screen.DesktopWidth then Left := Screen.DesktopWidth - Width; if Top + Height

13、 Screen.DesktopHeight then Top := Screen.DesktopHeight - Height; GetDesktopImg(FWndBmp, BoundsRect); EffectHandle(FWndBmp, FHintBmp); P := ClientToScreen(Point(0, 0); SetWindowPos(Handle, HWND_TOPMOST, P.X, P.Y, 0, 0, SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE); end; constructor TwdHintWnd.Creat

14、e(Aowner: TComponent); begin inherited; FWndBmp := TBitmap.Create; FWndBmp.PixelFormat := pf24bit; FHintBmp := TBitmap.Create; end; procedure TwdHintWnd.CreateParams(var Params: TCreateParams); begin inherited; /去掉窗口边框 Params.Style := Params.Style and not WS_BORDER; end; destructor TwdHintWnd.Destro

15、y; begin FWndBmp.Free; FHintBmp.Free; inherited; end; procedure TwdHintWnd.GetDesktopImg(Bmp: TBitmap; R: TRect); var C: TCanvas; begin C:= TCanvas.Create; try C.Handle := GetDC(0); Bmp.Canvas.CopyRect(Rect(0, 0, Bmp.Width, Bmp.Height), C, R); finally C.Free; end; end; procedure TwdHintWnd.EffectHan

16、dle(WndBmp, HintBmp: TBitmap); var R: TRect; i, j: Integer; P: PByteArray; Transt, TranstAngle: Integer; begin R := Rect(0, 0, WndBmp.Width - 4, WndBmp.Height - 4); Frame3D(WndBmp.Canvas, R, clMedGray, clBtnShadow, 1); /作窗口底下的阴影效果 Transt := 60; for j:= WndBmp.Height - 4 to WndBmp.Height - 1 do begin

17、 P := WndBmp.ScanLinej; TranstAngle := Transt; for i:= 3 to WndBmp.Width - 1 do begin /如果正处于右下角 if i WndBmp.Width - 5 then begin P3*i := P3*i * TranstAngle div 100; P3*i + 1 := P3*i + 1 * TranstAngle div 100; P3*i + 2 := P3*i + 2 * TranstAngle div 100; TranstAngle := TranstAngle + 10; if TranstAngle

18、 90 then TranstAngle := 90; end else begin P3*i := P3*i * Transt div 100; P3*i + 1 := P3*i + 1 * Transt div 100; P3*i + 2 := P3*i + 2 * Transt div 100; end; end; Transt := Transt + 10; end; /作窗口右边的阴影效果 for j := 3 to WndBmp.Height - 5 do begin P := WndBmp.ScanLinej; Transt := 60; for i:= WndBmp.Width

19、 - 4 to WndBmp.Width -1 do begin P3*i := P3*i * Transt div 100; P3*i + 1 := P3*i + 1 * Transt div 100; P3*i + 2 := P3*i + 2 * Transt div 100; Transt := Transt + 10; end; end; WndBmp.Canvas.Draw(10, 10, HintBmp); end; procedure TwdHintWnd.NCPaint; begin /重载不让画边框 end; procedure TwdHintWnd.Paint; begin

20、 Canvas.CopyRect(ClientRect, FWndBmp.Canvas, ClientRect); end; procedure TwdHintWnd.DrawHintImg(Bmp: TBitmap; AHint: string); var R: TRect; begin Bmp.Canvas.Brush.Color := Application.HintColor; Bmp.Canvas.Pen.Color := Application.HintColor; Bmp.Canvas.Rectangle(0, 0, Bmp.Width, Bmp.Height); Bmp.Can

21、vas.Font.Color := Screen.HintFont.Color; R := Rect(0, 0, Bmp.Width, Bmp.Height); Inc(R.Left, 2); Inc(R.Top, 2); DrawText(Bmp.Canvas.Handle, PChar(AHint), -1, R, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly); end; initialization Application.ShowHint := False; HintWindowC

22、lass := TwdHintWnd; Application.ShowHint := True; end. 只需将该单元加入你的工程当中,然后运行程序,便可看到效果了,试试看,漂亮吧。 程序中重要部分已经作了注释,这里只说明几个重要的地方,首先是initialization 部分,这里将 Application 的 ShowHint 设为 False,看一下 VCL 源码,知道 Application 将一个 HintWindow 给消毁了,而 HintWindowClass定义如下: THintWindowClass = class of THintWindow;它是 THintWindo

23、w 的类引用,在 Forms 单元中它初始化为 THintWindow: HintWindowClass: THintWindowClass = THintWindow; 在这里我们将其替换为 TwdHintWnd,最后将 ShowHint 设为True,Application 便用 HintWindowClass 创建一个 Hint 窗口,此时创建的便是我们定制的类了,以后的提示窗口就将用我们上面的窗口来显示。 在 ActivateHint 方法,我们将作效果的处理,原理是取得提示窗口在桌面上的位置对应的位图,然后画到提示窗口上,再将提示信息的位置拷贝到提示窗口中间,这样就有了透明的效果了。

24、其次画出玻璃的边,最后在窗口右边和下边作阴影效果。 关于阴影效果的实现,用到的是图像的 Alpha 技术,可以到网上找一找,这里就不多说了,只给出图像透明度的公式: Dst.Red = Src.Red * alpha + (1-alpha) * Dst.Red; Dst.Green = Src.Green * alpha + (1-alpha) * Dst.Green; Dst.Blue = Src.Blue * alpha + (1-alpha) * Dst.Blue; Alpha 的值为 0 到 1 之间,为 1 时表示完全不透明,不过我们将用于混合的颜色为黑色,即 0,所以上面代码看到的是如下的样子: P3*i := P3*i * TranstAngle div 100; 玻璃提示窗口的原理大概如此,当然其透明效果是一个假象,遇到后有动的物体就暴露无疑了。不过作为一个提示窗口,我想已经足够了。

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报