我想显示一个系统托盘图标事件的表单,它只在任务栏旁边显示一些信息,并在一段时间后自行消失。我遇到的主要问题是以正确位置和可见的方式定位表单。我找到了几种方法来确定图标的位置,但在测试中我发现它们基于操作系统不一致(我在另一个应用程序中尝试过这个并最终放弃并使用居中模式形式)。例如:
procedure GetWorkAreaRect(var outrect: TRect);
// returns the dimensions of the work area.
begin
Systemparametersinfo(SPI_GETWORKAREA, 0, @outrect, 0);
end;
可行的问题是从那里确定将表单放在哪里(上、下、左、右)。有什么建议么?
编辑:问题在于相对于系统托盘图标定位表单,不一定确定系统托盘图标的位置。我又做了一次尝试,只要满足某些条件,它就可以工作。最值得注意的是,如果任务栏设置为自动隐藏,它就不起作用,因为假设点击是在工作区域之外进行的。当表单设置为自动隐藏时,情况并非如此。
function PositionForm(X, Y, Width, Height: Integer): TPoint;
// receives mouse-click position in X and Y, form width and height in width and height
// returns Left and Top in TPoint.X and TPoint.Y.
var
workrect: TRect;
resrect: TPoint;
begin
GetWorkAreaRect(workrect);
if Y > WorkRect.Bottom then // taskbar is on bottom
begin
resRect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Bottom - Height;
end
else
if X > WorkRect.Right then // taskbar is on right
begin
resrect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Bottom - Height;
end
else
if X < WorkRect.Left then // taskbar is on left
begin
resrect.X := WorkRect.Left;
resrect.Y := WorkRect.Bottom - Height;
end
else
if Y < WorkRect.Top then // taskbar is on top
begin
resrect.X := WorkRect.Right - Width;
resrect.Y := WorkRect.Top;
end;
Result := ResRect;
end;
所以从表面上看,问题似乎是找到一种独立的方法来确定任务栏所在的位置......或者是否可以将逻辑扩展到上面来解决这个问题?