我不确定这是否是特定于delphi的问题。我有一个带有顶部对齐工具栏和alClient对齐OleContainer的表单。当我打开表单并将Word加载到olecontainer时,它正确对齐,Word对象就像您期望的那样出现。
如果然后打开任何单词侧面板(例如F1打开右侧的帮助面板,按Ctrl + F打开左侧的搜索等),这些正确打开并相应地减小单词文档的大小以适应自己,但是当您关闭侧面板时,word文档不会调整大小以回收该面板占用的空间。添加一个函数来重新对齐容器什么都不做。
很明显,侧面板(实际上是带本身)这个词并没有在ole容器内打开。
我在Google上搜索并发现了一个建议,即在客户端对齐的面板中创建一个子表单并将容器表示为子表单,但是当Word侧面板关闭时,这并没有克服文档重新排列问题。
答案 0 :(得分:0)
在关闭侧面板后,我想出了一种解决重新对准问题的方法。它涉及调用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侧窗格的两个类名称都相同。