Delphi中API编程-编译实现


======================================================
注:本文源代码点此下载
======================================================

delphi作为一种面向对象的可视化开发工具以其开发程序的高速度和编译代码的高效率受到广大编程人员的青睐。尽管delphi已经提供了非常强大的开发组件(vcl),但灵活使用api函数一定可以使你的程序增色不少。

一、状态键的检查

不少流行软件的编辑窗口(包括delphi的代码编辑窗口)的底部都有一个状态条用来显示一些状态信息,比如当前光标的位置等。

通常键盘的状态键包括[numlock],[scrolllock],[capslock]和[insert]这四个键,在编辑窗口中显示状态键的状态可使你的界面更友好,更有利于方便用户。

要实现状态键检测这一功能,你可以使用微软提供的api函数:getkeyboardstate().对于这个函数,建议大家自己动手查具体含义,不过认识些英语的朋友硬是从字面理解也能知道其大致含义吧。当我们调用getkeyboardstate()函数时,你需要在程序中开辟一个256字节的缓冲区用来存储键盘上各个键的状态(最简单的方法你可以声明一个tkeyboardstate变量)你可以根据缓冲区中相应位置的值来判断键盘状态,下表显示了系统常量和其相应的按键。(你如果想查看所有的键值列表可以在help菜单选择windowsapi中输入关键字virtualkeycodes,然后按下show键)

常量按键名称

vk_insert[insert]键

vk_numlock[numlock]键

vk_capital[capslock]键

vk_scroll[scrolllock]键

键盘缓冲区每一位都有特定的格式,对于状态键来说,最低位是1时表示状态键处于 on状态,你可以使用delph i提供的odd()函数来确定这一位的状态。为了使程序显示正确的状态键的状态,你需要定期调用getkeyboardstate()函数来不断的查询键盘状态,而实现这一功能最简单的方法是使用timer组件。下面举一个小例子来说明如何具体实现这一调用功能,在这个例子中我们将检查[numlock]键的状态并把它显示在屏幕底部的状态栏。

下面就是具体的操作方法:新建个工程并分别托放statusbar和timer控件在主窗体上双击timer控件,在弹出的代码编辑窗口处添加以下代码

procedure tform1.timer1timer(sender: tobject);

var

keystates: tkeyboardstate;

begin

getkeyboardstate(keystates);

if odd(keystates[vk_numlock])then

statusbar1.panels[0].text := '开'

else

statusbar1.panels[0].text := '关';

end;

运行查看结果并人为改变numlock状态测试。同理其它键盘状态你可以如法炮制

二、改变提示框(hint)的特性

许多程序在特定的控件上都有提示框,当鼠标在这些控件上停一定时间以后就可以显示提示框。在delphi中实现提示框是非常容易的,只要设定相应的属性即可。但通常的提示框都是以黄色矩形框的形式显示在对应控件的右下角,以下这段代码说明了如何使用api改变delphi中提示属性的一些特性。

把下面这句代码加入到主窗体的oncreate事件中,加入代码后的主窗体的formcreate过程的代码如下所示:

procedure tform1.formcreate(sender: tobject);

begin

……

application.onshowhint := gethintinfo;

end;

然后自己编写gethintinfo过程:

procedure gethintinfo(var hintstr: string; var canshow: boolean; var hintinfo: thintinfo);

下面是该过程的实现部分:

procedure tform1.gethintinfo(var hintstr: string; var canshow: boolean; var hintinfo: thintinfo);

var

ii:ticoninfo;

bmp: windows.tbitmap;

begin

with hintinfo do

begin

//应该保证有控件使用定义了hint属性

flashwindow(form1.handle,true);

if hintcontrol=nil then exit;

hintpos := hintcontrol.clienttoscreen(cursorpos);

//把光标坐标系由相对于提示改为相对于屏幕

geticoninfo(screen.cursors[hintcontrol.cursor],ii);

//获得有关提示控制使用的有关光标的信息

getobject(ii.hbmmask,sizeof(windows.tbitmap),@bmp);

if ii.hbmcolor=0 then

//这里注意下,想要改变hint提示框的位置。试着改变hingpos的值(效果验证)

inc(hintpos.y,bmp.bmheight div 2) //如果光标不包括彩色位图,增加y方向

else

inc(hintpos.y,bmp.bmheight);

dec(hintpos.y,ii.yhotspot); //去掉y方向的热点位置.

deleteobject(ii.hbmmask);

deleteobject(ii.hbmcolor); //清除位置句柄.

end;

end;

通过改变hintpos.x和y的值可以在任意位置显示提示框。word7.0中滚动纵向滚动条时页码序号总是显示鼠标在左方,用以上代码实现这一功能可以说是易如反掌。

注:本人也是个windows编程的新手,对于上面的这些代码是我在百度上搜索到后自己重新编译后修改的,希望能给新手朋友们提供些方便。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
阅读更多
个人分类: javase
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭