【问题标题】:How to make a form align to the edge of the screen like the taskbar?如何使表单像任务栏一样与屏幕边缘对齐?
【发布时间】:2013-03-16 23:11:26
【问题描述】:

我正在构建一个“仪表板”应用程序,它在任何给定显示器的任何边缘始终可见,即使在其他应用程序最大化时也是如此。我不一定需要它“始终在顶部”(尽管我会),但我需要将其作为我自己的桌面工具栏的一部分,就像 Windows 任务栏一样。即使应用程序被最大化,窗口也在这个区域内,使这个窗口始终可见(并且桌面区域更小)。

我怎样才能让我的应用程序的主窗体像这样与屏幕边缘对齐?

PS - 我不需要回答所有额外的粗暴处理,例如屏幕分辨率更改...我只需要知道如何首先将其对齐为“屏幕的一部分”。

【问题讨论】:

  • 阅读工作区以找到屏幕边缘并将您的表单放在那里
  • @David 我在问如何像 Windows 任务栏一样对待它,而不仅仅是如何把它放在那里。那是容易的部分。正如我所说的那样,困难的部分是让它成为“屏幕的一部分”。

标签: delphi windows-7 delphi-xe2 toolbar


【解决方案1】:

如果不出意外,您可以手动确定此信息。查看Forms 单元中的全局Screen 对象以获取有关当前分辨率的信息。 (请务必检查 MonitorCountMonitors 属性。)

在此和一些基本算术之间,将表单设置为与显示器边缘对齐应该不会太难。

【讨论】:

  • 谢谢,但这是我不需要帮助的简单部分。请参阅 Ken 的回答。
【解决方案2】:

您正在寻找Application Desktop Toolbars,这是Windows 任务栏内部使用的。它涉及创建具有特定样式的窗口,正确设置它,然后使用SHAppBarMessage 与其通信。

它可能会变得相当复杂,但是有一些免费的源代码组件(一个在Torry,或者另一个在DelphiPages)有基本的外壳来帮助你入门。

第二个链接的AppBar.pas 单元中的一个示例(根据链接的文本,它是带有源代码的免费软件 - 我用它来创建一个应用程序启动器任务栏,其中包含带有应用程序图标和描述的按钮从.lnk 文件中读取):

type
  TAppBarMessage = (abmNew, abmRemove, abmQueryPos, abmSetPos, abmGetState, 
                    abmGetTaskBarPos, abmActivate, abmGetAutoHideBar, 
                    abmSetAutoHideBar, abmWindowPosChanged);

  TAppBarEdge = (abeLeft, abeTop, abeRight, abeBottom, abeUnknown, abeFloat);

...

function TAppBar.AppBarMessage(abMessage: TAppBarMessage; 
  abEdge: TAppBarEdge; lParam: LPARAM; bRect: Boolean; var rc: TRect): UINT;
var
  abd: TAppBarData;
begin
  // Initialize an APPBARDATA structure
  abd.cbSize := sizeof(abd);
  abd.hWnd := Handle;
  abd.uCallbackMessage := WM_APPBARNOTIFY;
  abd.uEdge := Ord(abEdge);

  if bRect then
    abd.rc := rc
  else
    abd.rc := Rect(0, 0, 0, 0);

  abd.lParam := lParam;
  Result := SHAppBarMessage(Ord(abMessage), abd);

  // If the caller passed a rectangle, return the updated rectangle
  if bRect then
    rc := abd.rc;
end;

【讨论】:

  • 谢谢,使用起来非常方便,省了很多麻烦!
  • 不幸的是,它不允许我将它拖到另一台显示器上:(它仍然可以解决问题
  • 对不起。 :-( 无能为力。我们切换到 Win2K8 作为我们的服务器操作系统,组策略允许我们推出一个文件夹,其中包含添加到 Start 菜单的应用程序的链接,所以我没有在支持多显示器方面做了任何事情——当时只有编码人员拥有它们,我们没有使用应用程序启动器。:-)
  • 我仍然可以使用源代码并弄清楚:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2021-09-29
相关资源
最近更新 更多