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

时间:2018-06-08 14:53:47

标签: delphi ms-word ole

我不确定这是否是特定于delphi的问题。我有一个带有顶部对齐工具栏和alClient对齐OleContainer的表单。当我打开表单并将Word加载到olecontainer时,它正确对齐,Word对象就像您期望的那样出现。

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

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

我在Google上搜索并发现了一个建议,即在客户端对齐的面板中创建一个子表单并将容器表示为子表单,但是当Word侧面板关闭时,这并没有克服文档重新排列问题。

1 个答案:

答案 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侧窗格的两个类名称都相同。