Проблемы с выравниванием нечетного контейнера MS Word при закрытии боковых панелей Word - PullRequest
0 голосов
/ 08 июня 2018

Я не уверен, является ли это специфической проблемой Delphi.У меня есть форма с верхней выровненной панели инструментов и AlClient выровненный OleContainer.Когда я открываю форму и загружаю Word в olecontainer, он выравнивается правильно, и объект Word отображается так, как вы ожидаете.

Если вы затем откроете любую из боковых панелей слова (например, F1, чтобы открыть панель справки насправа, Ctrl + F, чтобы открыть поиск слева и т. д.) они открываются правильно и соответственно уменьшают размер документа word, чтобы приспособиться к ним, но когда вы закрываете боковую панель, размер документа word не изменяется, чтобы освободить пространство, занимаемое этимпанель.Добавление функции для перестройки контейнера ничего не делает.

Понятно, что боковые панели со словами (и, собственно, сама лента) не открываются внутри контейнера ole.

Я искал в Googleи нашел предложение создать вложенную форму в выровненной по клиенту панели и поместить контейнер в родительскую форму в подчиненную форму, но это не решает проблему с выравниванием документа, когда боковая панель Word закрыта.

1 Ответ

0 голосов
/ 20 июня 2018

Я придумал какое-то решение проблемы с перестройкой после закрытия боковых панелей.Он включает в себя вызов метода doVerb контейнера ole для обновления документа в контейнере.Однако это визуально непривлекательно и немного отнимает много времени, и его следует вызывать только при необходимости, то есть когда панель на стороне 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.

...