发信人: chenjz@GZ() 
整理人: teleme(2001-03-29 21:58:30), 站内信件
 | 
 
 
 标  题: Delphi中API编程----在Delphi中调用API函数 发信站: 网易虚拟社区 (Tue Aug 29 11:56:37 2000), 站内信件
                  Delphi中API编程
                            ----在Delphi中调用API函数
 (作者:葛为民 冯焱 2000年06月09日 10:39)
 
 
   Delphi作为一种面向对象的可视化开发工具,以其开发程序的高速度和编译 代码的高 
 
 效率越来越受到广大编程人员的喜爱。尽管Delphi已经提供了非常强大的开发组 件(VCL), 
 
 但灵活使用API函数一定可以使你的程序增色不少。 
 
   状态键的检查 
 
   当今不少流行软件的编辑窗口(包括Delphi的代码编辑窗口)的底部都有一 个状态条 
 
 用来显示一些状态信息,比如当前光标的位置等。通常键盘的状态键包括[NumL ock], 
 
 [ScrollLock],[CapsLock]和[Insert]这四个键,在编辑窗口中显示状态 键的状态可以 
 
 使你的界面更友好,更有利于方便用户。 
 
   使用delphi强大的开发功能和API提供的GetKeyboardState()函数,你可以 轻松地 
 
 在你的程序中实现状态键检测这一功能。 
 
   也许有些读者要问:我可以使用delphi提供的OnKeyPress函数捕捉按键动作 来完成这 
 
 一功能,又有什么必要调用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()函数来确定这一位的状态。为了使程 序显示 
 
 正确的状态键的状态,你需要定期调用GetKeyboardState()函数来不断的查询 键盘状态, 
 
 实现这一功能最简单的方法是使用Timer组件。 
 
   下面举一个小例子来说明如何具体实现这一调用功能,在这个例子中我们将 检查 
 
 [NumLock]键的状态并把它显示在屏幕底部的状态栏。 
 
   从Component模板Win95页中选择StatusBar组件,按如下所示设置它的属性  
 
  AlignalBottom 
 
  Height20 
 
   从system页中的选择Timer组件并把它放入窗体,双击Timer组件弹出OnTime r事件 
 
 的代码编辑窗口,按如下所示添加代码: 
 
   procedureTForm1.Timer1Timer(Sender:TObject); 
 
   varKeyStates:TKeyboardState; 
 
   begin 
 
   GetKeyboardState(KeyStates); 
 
   begin 
 
   if Odd(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事件中,加入代码后的主窗体的formcr eate过程 
 
 的代码如下所示: 
 
   procedureTMainForm.FormCreate(Sender:TObjec t); 
 
   begin 
 
  ... 
 
   Application.OnShowHint.ΚGetHintInfo; 
 
   end; 
 
   然后把以下过程声明加入到主窗体的public段 
 
   procedureGetHintInfo(VarHintStr:sting;VarCanShow:boolean;varH intInfo:THintInfo); 
 
   最后,在主窗体的implementation部分加入过程的实现代码,加入完代码的 过程如下 
 
 所示: 
 
   procedureTMainForm.GetHintInfo(varHintStr:string;varCanShow: boolean; 
 
 varHintInfo:THintInfo);var 
 
   II:TlconInfo; 
 
   Bmp:Windows.TBitmap; 
 
   begin 
 
   withHintInfodobegin//应该保证有控件使用定义了Hint属性 
 
   ifHintControlΚNILthenexit; 
 
   HintPos:ΚHintControl.ClientToScreen(Cursor Pos); 
 
   //把光标坐标系由相对于提示改为相对于屏幕 
 
   GetIconInto(Screen.Cursors[HintControl.Cursor],II); 
 
   //获得有关提示控制使用的有关光标的信息 
 
   GetObject(II.hbmMask,SizeOf(Windows.TBitmap),ΝBmp); 
 
   //获得有关光标的位图(bitmap)信息 
 
   if II.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中滚动纵 向滚 
 
 动条时页码序号总是显示鼠标在左方,用以上代码实现这一功能可以说是易如反 掌。 
  -- 我能翻译善写作熟电脑会说话可是为什么没工作?
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.221.250]
  | 
 
 
 |