|
一、概述
Delphi作为一种面向对象的可视化开发工具,以其开 发程序的高速度和编译代码的高效率越来越受到广 大编程 人员的喜爱。Delphi本身提供了包括界面设计、数据库操 作、报表打印和Internet等在内的数十个 组件,开发者使 用它们可以非常容易、快速地制作出所要的应用系统,同 时所需要的编程量却非常地小。 除此之外,delphi同时秉 承了borland公司产品一贯的编译效率高,速度快特色。 Delphi2.0版本以上的产品完全支持32位应用程序的 开发,完全支持windows95和windowsNT提供的所 有API函 数。应用程序接口(API)是windows提供的任何Windows应 用可以访问的函数的集合。尽管 Delphi已经提供了非常强 大的开发组件(VCL),但灵活使用API函数一定可以使你 的程序增色不少。 二、状态键的检查 当今不少流行软件的编辑窗口(包括Delphi的代码编 辑窗口)的底部都有一个状态条用来显示一些状态 信息, 比如当前光标的位置、页码消息和状态键的状态。什么是 状态键呢?我们知道键盘上大多数按键只 有在按下时才能 为系统所识别,而状态键的共同特点就是他们好似一个开 关,每按一次就切换到相反状态 直至下一次按键为止。通 常键盘的状态键包括[NumLock],[ScrollLock],[C apsLock]和 [Insert]这四个键,在编辑窗口中显示状 态键的状态可以使你的界面更友好,更有利于方便用户。 使用delphi强大的开发功能和API提供的GetKeyboa rdState()函数,你可以轻松地在你的程序中 实现状态 键检测这一功能。 也许有些读者要问:我可以使用delphi提供的OnKe yPress函数捕捉按键动作来完成这一功能,又有 什么必要 调用API函数呢?这就涉及到状态键的另一个特点:即它 的状态与程序运行无关。比如说你在word 中按下insert键 后再切换到delphi中输入代码,这个键的状态仍然保持不 变。而如果只使用OnKeyPress函 数,那么当你的程序在后 台运行时就无法捕捉到在前台程序中发生的按键动作,所 以当切换到你程序时也 就无法正确反映状态键的状态。因 此需要使用API的GetKeyboardState()函数来检查键盘状 态。当调用 GetKeyboardState()函数时,你需要在程序 中开辟一个256字节的缓冲区用来存储键盘上各个键的状 态 (最简单的方法你可以声明一个TKeyboardState变量 )你可以根据缓冲区中相应位置的值来判断键盘状 态,下 表显示了系统常量和其相应的按键。(你如果想查看所有 的键值列表可以在help菜单选择 windowsAPI中输入关键 字virtualkeycodes,然后按下Show键) 常量按键名称 VK-INSERT[Insert]键 VK-NUMLOCK[NumLock]键 VK-CAPITAL[CapsLock]键 VK-SCROLL[ScrollLock]键 键盘缓冲区每一位都有特定的格式,对于状态键来说 ,最低位是1时表示状态键处于ON状态,你可以使 用delph i提供的Odd()函数来确定这一位的状态。为了使程序显 示正确的状态键的状态,你需要定期调用 GetKeyboardS tate()函数来不断的查询键盘状态,实现这一功能最简 单的方法是使用Timer组件。 下面举一个小例子来说明如何具体实现这一调用功能 ,在这个例子中我们将检查[NumLock]键的状态 并把它 显示在屏幕底部的状态栏。 从Component模板Win95页中选择StatusBar组件,按 如下所示设置它的属性 AlignalBottom Height20 从system页中的选择Timer组件并把它放入窗体,双 击Timer组件弹出OnTimer事件的代码编辑窗口,按 如下所 示添加代码: procedureTForm1.Timer1Timer(Sender:TObject ); varKeyStates:TKeyboardState; begin GetKeyboardState(KeyStates); begin ifOdd(KeyStates[VK-NUMLOCK])then StatusBar1.Panels.Items[0].Text:Κ′NUM ′ else StatusBar1.Panels.Items[0].Text:Κ″ end; end; 我们可以检验一下程序的运行结果。运行程序,可以 看到状态条中正确显示了当前的状态,切换到另一 个程序 改变[numlock]键的状态再切换回运行程序,可以看到 状态条的状态已经改变。一般说来,在程序 中加入状态条 显示相应信息对于用户来说是十分方便的。 三、改变提示框(hint)的特性 许多程序在特定的控件上都有提示框,当鼠标在这些 控件上停一定时间以后就可以显示提示框。在 Delphi中实 现提示框是非常容易的,只要设定相应的属性即可,这里 就不详细讨论了。但通常的提示框都 是以黄色矩形框的形 式显示在对应控件的左下角,以下这段代码说明了如何使 用API改变delphi中提示属性 的一些特性。有一点需要声 明的是代码中使用到的GetIconInfo函数只适用win32(也 就是说你只能在 delphi2.0以上的版本中使用以下代码) 。 把以下代码加入到主窗体的Oncreate事件中,加入代 码后的主窗体的formcreate过程的代码如下所 示: procedureTMainForm.FormCreate(Sender:TObjec t); begin ... Application.OnShowHint.ΚGetHintInfo; end; 然后把以下过程声明加入到主窗体的public段 procedureGetHintInfo(VarHintStr:sting;VarCa nShow:boolean;varHintInfo:THintInfo); 最后,在主窗体的implementation部分加入过程的实 现代码,加入完代码的过程如下所示: procedureTMainForm.GetHintInfo(varHintStr:s tring;varCanShow:boolean;varHintInfo:THintIn fo); var II:TlconInfo; Bmp:Windows.TBitmap; begin withHintInfodobegin//应该保证有控件使用定义 了Hint属性 ifHintControlΚNILthenexit; HintPos:ΚHintControl.ClientToScreen(Cursor Pos); //把光标坐标系由相对于提示改为相对于屏幕 GetIconInto(Screen.Cursors[HintControl.Cur sor],II); //获得有关提示控制使用的有关光标的信息 GetObject(II.hbmMask,SizeOf(Windows.TBitm ap),ΝBmp); //获得有关光标的位图(bitmap)信息 ifII.hbmColorΚ0then inc(HintPos.Y,Bmp.bmHeightdiv2) //如果光标不包括彩色位图,增加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中滚动纵向滚动条时页码序号总是 显示鼠 标在左方,用以上代码实现这一功能可以说是易如反掌。 |