2

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

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

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

4

2 回答 2

7

您正在寻找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;
于 2013-03-26T23:45:38.330 回答
0

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

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

于 2013-03-26T23:35:23.800 回答