Индикатор выполнения с использованием Office VBA - PullRequest
0 голосов
/ 02 февраля 2009

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

Однако я не могу сохранить эту форму поверх всех других окон Office.

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

Независимо от того, установлен ли у меня модальный или немодальный набор, форма идет за активным окном, и когда она иногда отображается сверху, она не перекрашивается.

Возможно, я только что пропустил свойство "stayontop" или что-то в этом роде?

Спасибо

1 Ответ

1 голос
/ 02 февраля 2009

Я не думаю, что есть какой-либо встроенный способ заставить форму оставаться на вершине в VBA, но один вопрос - вы вызываете DoEvents, когда обновляете что-либо в своей форме? По моему опыту, форма не перерисовывается, если, например, вы не вызовете DoEvents, прежде чем выполнить оператор Next в цикле.

Если это не ваша проблема, вы можете использовать вызовы API Windows, чтобы поместить окно вверху, хотя я не уверен, что оно остается сверху, используя этот код:

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long

Const SWP_NOMOVE = 2
Const SWP_NOSIZE As Long = 1
Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2

Private Declare Function SetWindowPos Lib "user32" _
      (ByVal hwnd As Long, _
      ByVal hWndInsertAfter As Long, _
      ByVal x As Long, _
      ByVal y As Long, _
      ByVal cx As Long, _
      ByVal cy As Long, _
      ByVal wFlags As Long) As Long

Private Function SetTopMostWindow(hwnd As Long, Topmost As Boolean) As Long

   If Topmost = True Then 'Make the window topmost
      SetTopMostWindow = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, FLAGS)
   Else
      SetTopMostWindow = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS)
      SetTopMostWindow = False
   End If
End Function

Private Function GetFormHwnd() As Long
    GetFormHwnd = FindWindow(CLng(0), Me.Caption)
End Function

Public Sub SetFormAsTopMostWindow()
    Call SetTopMostWindow(GetFormHwnd(), True)
End Sub

Я поместил это в модуль кода формы, и, похоже, он работает при перемещении других приложений; он остается на вершине.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...