2009-02-01 69 views
0

我有一个小程序,可以在运行时打开和关闭大量不同的文档文档。它从网上加载一些文件,因此需要一段时间,我宁愿让用户看一个小进度条,或者至少有一个表单中的消息告诉他们等待。使用Office VBA的进度条

但是,我似乎无法将该窗体保留在所有其他Office窗口之上。

我对实际进度条的代码没有问题,只是在代码打开和关闭窗口时将该死的东西放在最上面。我试图隐藏应用程序,但这似乎阻止了一些代码运行。

无论我是否设置了模态或非模态,窗体都会在主窗口后面显示,偶尔会显示在顶窗上而不会重绘。

我可能刚刚错过了“stayontop”属性或什么?

感谢

回答

1

我不认为有任何内置的方式,使在VBA顶部的形式入住,但一个问题是,你调用DoEvents当你在表单上更新什么?我的经验是,除非您在循环中敲入Next语句之前调用DoEvents,否则表单不会重新绘制。

如果这不是你的问题,你可以使用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 2009-02-02 20:38:46