如何使表单像任务栏一样对齐屏幕边缘?

时间:2013-03-26 23:21:57

标签: delphi windows-7 delphi-xe2 toolbar

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

如何让我的应用程序的主窗体对齐到这样的屏幕边缘?

PS - 我不需要对所有额外的粗糙处理做出回答,例如屏幕分辨率的变化......我只需要知道如何将它作为“屏幕的一部分”首先对齐。< / p>

2 个答案:

答案 0 :(得分:6)

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

它可能变得相当复杂,但有一些免费组件可用于源(一个在Torry,或另一个在DelphiPages),它们具有基本的shell来帮助您入门。

来自第二个链接的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;

答案 1 :(得分:0)

如果没有别的,您可以手动确定此信息。有关当前解决方案的信息,请查看Screen单元中的全局Forms对象。 (务必检查MonitorCountMonitors属性。)

在它和一些基本算术之间,设置表格以对齐监视器的边缘应该不会太难。