中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
寻找windows的任务栏  
作者:未知 时间:2005-08-07 21:00 出处:编程爱好者网站 责编:chinaitpower
              摘要:寻找windows的任务栏  
译:DBoy

    有些时候也许你想知道当前windows的任务栏在窗口的什么位置,这当然也可以用Delphi来实现。Windows API 函数允许您得到有关任务栏(也可称为应用程序栏)的信息。访问下面的微软MSDN地址可以了解到更多有关于这个函数调用的信息:       http://msdn.microsoft.com/library/psdk/shellcc/shell/Functions/SHAppBarMessage.htm 。这篇文档主要集中在为该函数传递ABM_GETTASKBARPOS消息上。
    你可以按照下面的方法自己创建一个应用程序,或从以下的Borland代码中心网址下载到程序的原代码:http://codecentral.borland.com/codecentral/ccweb.exe/download?id=15681 。
    首先,也许你很想知道这个API究竟是在哪个单元声明的。在MSDN中它被声明在shellapi.h里,而在Delphi中它被声明在shellapi.pas里。因此你要把shellapi添加到你的uses列表中。然后请看下面的函数示例:
// FindTaskBar 返回任务栏的位置,写到ARect中。
function FindTaskBar(var ARect: TRect): Integer;
var
AppData: TAppBarData;
begin
  // ’Shell_TrayWnd’ 是任务栏窗口的名子
  AppData.Hwnd := FindWindow(’Shell_TrayWnd’, nil);
  if AppData.Hwnd = 0 then
    RaiseLastWin32Error;
  AppData.cbSize := SizeOf(TAppBarData);
  //当有错误发生时, SHAppBarMessage 会返回False (0)
  if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) = 0 then
    raise Exception.Create(’SHAppBarMessage returned false when trying ’ +
      ’to find the Task Bar’’s position’);
  // 否则的话,我们就成功了,把结果写到Result中。
  Result := AppData.uEdge;
  ARect := AppData.rc;
end;

    当你把以上代码加到你的应用程序时,你就可以使用该函数了。添加一个TLabel和TButton到你的Form中,在Button的click事件中加入以下的代码。
var
  Rect: TRect;
  DestLeft: Integer;
  DestTop: Integer;
begin
  DestLeft := Left;
  DestTop := Top;
  case FindTaskBar(Rect) of
    ABE_BOTTOM:
    begin
      DestLeft := Trunc((Screen.Width - Width) / 2.0);
      DestTop := Rect.Top - Height;
    end;
    ABE_LEFT:
    begin
      DestTop := Trunc((Screen.Height - Height) / 2.0);
      DestLeft := Rect.Right;
    end;
    ABE_RIGHT:
    begin
      DestTop := Trunc((Screen.Height - Height) / 2.0);
      DestLeft := Rect.Left - Width;
    end;
    ABE_TOP:
    begin
      DestLeft := Trunc((Screen.Width - Width) / 2.0);
      DestTop := Rect.Bottom;
    end;
  end;
  Label1.Caption := Format(’Found at Top: %d Left: %d Bottom: %d Right: %d)’,
    [Rect.Top, Rect.Left, Rect.Bottom, Rect.Right]);
  // Move us to the task bar
  while (Left <> DestLeft) or (Top <> DestTop) do
  begin
    if Left < DestLeft then
      Left := Left + 1
    else if Left <> DestLeft then
      Left := Left - 1;

    if Top < DestTop then
      Top := Top + 1
    else if Top <> DestTop then
      Top := Top - 1;

    Application.ProcessMessages;
  end;
end;

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有