MS Word 关闭单词侧面板时出现奇怪的容器对齐问题



我不确定这是否是德尔菲特有的问题。我有一个带有顶部对齐的工具栏和 alClient 对齐的 OleContainer 的表单。当我打开表单并将 Word 加载到容器中时,它会正确对齐,Word 对象会按预期显示。

如果您随后打开任何单词侧面板(例如 F1 打开右侧的帮助面板,按 Ctrl+F 打开左侧的搜索等(,这些侧面板会正确打开并相应地减小 Word 文档的大小以适应自身,但是当您关闭侧面板时,Word 文档不会调整大小以回收该面板占用的空间。添加函数以重新对齐容器不会执行任何操作。

很明显,侧板这个词(实际上是功能带本身(并没有在 ole 容器内打开。

我在 Google 上搜索并发现了在客户端对齐面板中创建一个子表单并将容器父级设置为子表单的建议,但这并不能克服关闭 Word 侧面板时的文档重新对齐问题。

我想出了一种解决侧面板关闭后重新对齐问题的方法。它涉及调用 ole 容器的 doVerb 方法,以便刷新容器中的文档。但是,这在视觉上没有吸引力且略显耗时,仅应在必要时调用,即当 Word 侧窗格实际关闭时。这不容易被发现。没有 VBA 事件等。它涉及一个鼠标钩子,用于通过分析鼠标下方的窗口来拦截鼠标向下。不幸的是,各种Word侧窗格上的退出按钮的窗口类和窗口标题与整个工具栏相同,后者通常还包含一个下拉菜单,以允许移动,调整大小和关闭。下拉菜单具有不同的类名,但每个菜单项与菜单具有相同的类名。简而言之,仅从类名无法判断是否已单击退出按钮。我想出的难题是添加一个间隔约为 250 毫秒的计时器。挂钩功能启用计时器,计时器事件检查侧面板是否消失。我已经列出了我为此设计的代码。我相信它完全可以改进。

在挂钩过程中:

var 
hw: hwnd;
clsName, wText: array [0 .. 255] of Char;
PT: tpoint;
begin
GetCursorPos(pt);
HW:= WindowFromPoint (PT);
GetClassName (HW, clsName, 256);
GetWindowText (HW, wText, 256);
if (uppercase(clsName) = 'MSOCOMMANDBAR')
Or ((uppercase(clsName) = 'MSOCOMMANDBARPOPUP') 
And (uppercase(wText) = 'WORKPANE OPTIONS MENU')) then begin
HookMsg.Result := 0;           
Timer1.Enabled := true;
end;     
end;

在 onTimer 事件中:

var
PT: TPoint;
HW: hwnd;
clsName, wText: array [0 .. 255] of Char;
begin
timer1.Enabled:=false;
GetCursorPos(PT);
Hdl := WindowFromPoint (PT);
GetClassName (HW, clsName, 256);
GetWindowText (HW, wText, 256);
if (uppercase(clsName) <> 'MSOCOMMANDBAR')
And (uppercase(clsName) <> 'MSOCOMMANDBARPOPUP') 
And (uppercase(wText) <> 'WORKPANE OPTIONS MENU') then
OLEContainer1.DoVerb(ovSHow);
end;

据我所知,所有Word侧窗格的两个类名都是相同的。

最新更新