2009-02-01 3 views
0

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

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

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

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

Возможно, я просто пропустил свойство «stayontop» или что-то еще?

Благодаря

ответ

1

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

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

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 

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

+0

Спасибо, будет играть с этим. – user51498

Смежные вопросы