在我的 Windows 7 桌面上,我将 Windows 任务栏附加在屏幕的左侧(而不是底部的默认设置),并将自定义桌面工具栏(“True Launch Bar”)附加在屏幕的顶部。
在 Delphi XE8 VCL 项目中,我将主窗口位置值 (formMain.Top
和formMain.Left
) 保存在FormClose
事件中,然后在程序启动时使用FormCreate
事件中的这些值恢复主窗口位置。
这通常运作良好。但是,当程序在 MINIMIZED ( formMain.WindowState
= wsMinimized
) 时关闭时,窗体位置值是错误的(即被工具栏的宽度/高度减小),因此窗口在程序启动时恢复到错误的位置。
那么我该如何解决这个问题呢?
编辑:我尝试了大卫提到的其他解决方案:
var
WindowPlacement: TWindowPlacement;
R: TRect;
....
WindowPlacement.Length := SizeOf(WindowPlacement);
Win32Check(GetWindowPlacement(formMain.Handle, @WindowPlacement));
R := WindowPlacement.rcNormalPosition;
CodeSite.Send('formMainLeft by WinAPI', R.Left); // normal: 323 minimized: 323
CodeSite.Send('VCL formMain.Left', formMain.Left); // normal: 423 minimized: 323
但是,这会产生相同的问题,因为它没有考虑工具栏占用的空间,因为它只获取 WORK AREA 值。
此外,这不是大卫提到的重复问题,而是类似问题。这个问题源于最小化状态下的错误屏幕值,而另一个问题是关于整体恢复状态和大小。
另请注意:我不想恢复窗口状态(例如最小化)和位置,但只有窗口位置,所以我不能SetWindowPlacement
像大卫在另一个问题中提到的那样使用。
EDIT2:我现在已经用这段代码解决了这个问题:
if formMain.WindowState = wsMinimized then
begin
MinimizedOffsetTop := Screen.WorkAreaTop;
MinimizedOffsetLeft := Screen.WorkAreaLeft;
end
else if formMain.WindowState = wsNormal then
begin
MinimizedOffsetTop := 0;
MinimizedOffsetLeft := 0;
end;
SettingsIni.WriteInteger('Persistence', 'Top', formMain.Top + MinimizedOffsetTop);
SettingsIni.WriteInteger('Persistence', 'Left', formMain.Left + MinimizedOffsetLeft);
(在窗口最大化的情况下,我不保存和恢复窗口位置,而只保存和恢复最大化窗口状态)。