装扮工具提示条
delphi技巧之装扮工具提示条
什么是工具提示条?在windows程序中,当鼠标移动到工具条相应的按钮上时,会弹出一个小窗口来说明该按钮的作用,这个小窗口就叫做工具提示条。一般情况下它的背景色为淡黄色,字体色为黑色。面对这样千篇一律的面孔不知你是不是有些厌烦,是否想过给它化化妆,使其改头换面呢?下面我们就以delphi为工具,对它动些小手术。
在delphi中,我们可以设置控件的hint和showhint属性来显示工具提示条。当然,这并不是我们所希望的效果。幸好delphi在application对象中给我们提供了hintcolor属性,用它可以设置工具提示条的背景颜色。在程序主窗体的创建事件中写入application.hintcolor:=clred,然后运行一下,怎么样?效果不错吧,背景变成红色了。接下来的问题是,我们如何来改变显示文字的颜色。(嗯,让我好好想想)
delphi中有一个thintwindow类,看名字就知道它是干什么的了。不错,delphi就是通过它来实现工具提示条的。在它的创建方法(create)中只有四条语句:
constructor thintwindow.create(aowner: tcomponent);
begin
inherited create (aowner);
color := $80ffff;
canvas.font := screen.hintfont;
canvas.brush.style := bsclear;
end;
它首先重载了父类的创建方法,然后设置了背景颜色、字体和画刷样式。从这里可以设想一下,如果我们创建一个thintwindow的派生类,并重载它的创建方法,然后在此方法中重新定义字体,不就实现了我们所希望的效果吗?那就让我们行动起来吧。
首先新建一应用程序,在form1窗体上添加一个用于测试的按钮button1,设置showhint属性为true,hint属性为“这是一个按钮”,然后在代码页的implementation部分前面声明myhint类:
type
myhint=class (thintwindow)
constructor create (aowner: tcomponent); override;
end;
该类只有一个方法,用override关键字来表示重载了父类(thintwindow)的创建方法。接着在implementation部分写入此方法的代码:
constructor myhint.create(aowner: tcomponent);
begin
inherited create(aowner); //重载父类方法
with canvas do begin //设置字体
font.name := 楷体_gb2312;
font.color :=clyellow;
font.size :=20;
brush.style := bsclear;
end;
end;
在此过程中我们重新定义了字体的名称、颜色及大小,现在就可以使用这个新类了。那么如何使用呢?这里还要说明一点:在delphi中有一个隐含的变量hintwindowclass,它的作用就是指定在程序运行时显示的工具提示条所使用的类,其声明如下:
var hintwindowclass: thintwindowclass = thintwindow;
在程序中我们可以动态改变此变量,如在主窗体的创建事件中写入:hintwindowclass:=myhint;这样就可以让它使用我们新创建的类了。好了,现在来运行一下程序,看看效果如何?工具提示条的字体变成了楷体,尺寸也变大了,颜色……,怎么颜色没有改变呢?新的问题出现了,还是再看看thintwindow的代码吧。
问题就出在thintwindow的paint方法上,其代码如下:
procedure thintwindow.paint;
var
r: trect;
begin
r := clientrect;
inc (r.left, 2);
inc (r.top, 2);
canvas.font.color := clinfotext; //请注意这一句
drawtext(canvas.handle, pchar(caption), -1, r, dt_left or dt_noprefix or dt_wordbreak or drawtextbidimodeflagsreadingonly);
end;
原来thintwindow在它的paint方法中又重新改变了字体颜色。没办法,只好重写paint方法了。在myhint类中再声明一个重载方法:procedure paint; override;然后将thintwindow的paint方法的代码照搬过来,再将canvas.font.color := clinfotext;这一句删除掉。至此就大功告成了,再运行一下程序看看,这下一点问题都没有了。
也许你会说:“其实我们也不用重载thintwindow的create方法,只需重载paint方法即可,然后在其中设置背景及字体,这样会省事得多啦。”当然,这样也行得通,不过你会发现有一点小小的遗憾,是什么?自己试试吧。(什么?没有?!当我没说!)
- · 如何在状态栏中加入图标(或图片),还有动态的时间
- · 利用Delphi编写Windows外壳扩展
- · 利用未公开函数实现Shell操作监视
- · 利用Delphi消息处理建立类似Windows开始菜单
- · Delphi中的图形显示技巧
- · Form产生时的事件次序;
- · Delphi中布尔类型辨析
- · AccesS密码的打击
- · Delphi嵌入式汇编一例
- · 在Delphi中实现任意形状的窗体
- · sql server 2005中的DDL触发器
- · asp.net 2.0下嵌套masterpage页的可视化编辑
- · PHP程序加速探索之缓存输出
- · 用C#代码编写的SN快速输入工具
- · (PHP)模板引擎Smarty介绍
- · 用PHP操纵Oracle的LOB类型的数据
- · C# 2.0中泛型编程初级入门教程
- · asp.net 2.0中加密web.config
- · ADO.NET操纵数据库
- · 关于asp.net c#中对cookie的操作
- · asp.net 2.0里当readonly遇上enableviewstate=false
- · C# 2.0与泛型
- · 让3721也无奈的弹出窗口(代码)
- · 玩透9种网页弹出窗口(精)
- · 网站左右两边浮动广告JS代码
- · 一个IP只提示一次设为首页的代码
- · 常用ASP脚本程序集锦*精(适合初学者)
- · 鼠标自动移动/点击
- · PHP程序加速探索之加速工具软件
- · SQLServer2000数据访问基类
- · 图解MySQL数据库的安装和操作
- · 一些ASP初学者常用的代码
- · ASP经典问答收藏之一
- · 一段防注入的通用脚本
- · 简单的防盗链(代码)
- · PHP窜红:革命尚未成功 Java仍需努力
- · 使用PHP编写基于Web的文件管理系统
- · 理解PHP中的MVC编程之控制器
- · 理解PHP中的MVC编程之MVC框架简介
- · SQL Server Express 数据库自动部署问题及解决
- · 用PHP文件上传的具体思路及实现
- · 回顾与展望PHP 5.0的变化与PHP 6.0展望
- · 一个产生中文累计数的代码片断
- · 在SQL Server 2005中解决死锁
- · 30分钟正则表达式指导
- · 不算不知道 44% 数据库开发者使用MySQL
- · 立即释放.net下的com组件
- · XHTML的目标,规则和细节
- · SQL Server 2005 提供的分页查询支持
- · ASP.NET程序中常用的三十三种代码
- · Sql server存储过程和C#分页类简化你的代码
- · SQL Server 2005新功能-TSQL
- · 在SQL Server 2005中编辑SQL Server 2000 DTS
- · .NET 连接到 Oracle的oci.dll加载错误解决方案
- · 如何在调用线程的时候传递参数
- · 专家预言:PHP将比Java更好更受欢迎
- · 在IIS6.0下ASP .NET 的版本冲突问题
- · 解决SqlTransaction用尽的问题(SQL处理超时)
- · 以前编写Like谓词被忽略的使用方法
- · 在编写存储过程时使用 Set NoCount On

