Splash Screen Problem

  • Thread starter Thread starter Smonczka
  • Start date Start date
S

Smonczka

I am making a splash screen that pops up when a long running macro is
started. I was wondering is there a way to eliminate (not show) the
caption bar on the window when it pops up.

Thanks,
Steve Monczka
(e-mail address removed)
 
If you don't mind some complicated API stuff:

Option Explicit

Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName _
As String) As Long

Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" (ByVal hwnd As Long, _
ByVal nindex As Long, ByVal dwnewlong As Long) As Long

Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hwnd As Long, _
ByVal nindex As Long) As Long

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 Declare Function GetWindowRect Lib "user32" ( _
ByVal hwnd As Long, lpRect As RECT) As Long

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Enum ESetWindowPosStyles
SWP_SHOWWINDOW = &H40
SWP_HIDEWINDOW = &H80
SWP_FRAMECHANGED = &H20
SWP_NOACTIVATE = &H10
SWP_NOCOPYBITS = &H100
SWP_NOMOVE = &H2
SWP_NOOWNERZORDER = &H200
SWP_NOREDRAW = &H8
SWP_NOREPOSITION = SWP_NOOWNERZORDER
SWP_NOSIZE = &H1
SWP_NOZORDER = &H4
SWP_DRAWFRAME = SWP_FRAMECHANGED
HWND_NOTOPMOST = -2
End Enum

Private Const WS_SYSMENU = &H80000
Private Const WS_CAPTION = &HC00000
Private Const GWL_STYLE = (-16)

Private Sub UserForm_Initialize()
Dim lStyle As Long, hwnd As Long, tR As RECT
hwnd = FindWindowA(vbNullString, Me.Caption)
GetWindowRect hwnd, tR
Me.Caption = ""
lStyle = GetWindowLong(hwnd, GWL_STYLE)
lStyle = lStyle And Not WS_SYSMENU
lStyle = lStyle And Not WS_CAPTION
SetWindowLong hwnd, GWL_STYLE, lStyle
SetWindowPos hwnd, _
0, tR.Left, tR.Top, _
tR.Right - tR.Left, tR.Bottom - tR.Top, _
SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
Me.Repaint
End Sub

Kind of ugly but I just slapped it together from a variety of sources.

I'm assuming you have some OnTime code to dismiss the form.
 
That's really cool.

Is there a good source for Windows API calls? I've been able to cu
and paste other people's work, but where is a good place to star
learning about it?

Thanks
 
Put the code in the Userform Module code.
If you use Excel 97 then you will need to change the Enum bit to
Constants.
Just remove the

Private Enum ESetWindowPosStyles

and

End Enum
 
Ivan said:
Put the code in the Userform Module code.
If you use Excel 97 then you will need to change the Enum bit t
Constants.
Just remove the

Private Enum ESetWindowPosStyles

and

End Enum

and precede it with Const!

or better

#If VBA6 Then
Private Enum ESetWindowPosStyles
SWP_SHOWWINDOW = &H40
SWP_HIDEWINDOW = &H80
SWP_FRAMECHANGED = &H20
SWP_NOACTIVATE = &H10
SWP_NOCOPYBITS = &H100
SWP_NOMOVE = &H2
SWP_NOOWNERZORDER = &H200
SWP_NOREDRAW = &H8
SWP_NOREPOSITION = SWP_NOOWNERZORDER
SWP_NOSIZE = &H1
SWP_NOZORDER = &H4
SWP_DRAWFRAME = SWP_FRAMECHANGED
HWND_NOTOPMOST = -2
End Enum
#Else
Const SWP_SHOWWINDOW = &H40
Const SWP_HIDEWINDOW = &H80
Const SWP_FRAMECHANGED = &H20
Const SWP_NOACTIVATE = &H10
Const SWP_NOCOPYBITS = &H100
Const SWP_NOMOVE = &H2
Const SWP_NOOWNERZORDER = &H200
Const SWP_NOREDRAW = &H8
Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Const SWP_NOSIZE = &H1
Const SWP_NOZORDER = &H4
Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Const HWND_NOTOPMOST = -2
#End I
 
Vasant, I ink you overcomplicate things:
all the rectangles and setwindowpos can go.

after the SetWindowLong you just need a SetFocus
Declare Function SetFocus Lib "user32.dll" (ByVal hWnd As Long) As Long



--
keepITcool
| www.XLsupport.com | keepITcool chello nl | amsterdam


Vasant Nanavati wrote :
 
forgot the code:
styles can be adapted from Vasant code..
this is my NoClose Routine

in the forms' init event:
call formnoclose(me)

in a module:
Private Declare Function FindWindowEx Lib "user32.dll" _
Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetWindowLong Lib "user32.dll" _
Alias "GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" _
Alias "SetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" ( _
ByVal hWnd As Long) As Long
Private Declare Function SetFocus Lib "user32.dll" ( _
ByVal hWnd As Long) As Long


Sub FormNoClose(objForm As Object)
Dim lpWnd&
Const GWL_STYLE = -16&
Const WS_SYSMENU = &H80000

lpWnd = GetHWnd(objForm.Caption)
If lpWnd Then
SetWindowLong lpWnd, GWL_STYLE, GetWindowLong(lpWnd, GWL_STYLE) And
Not WS_SYSMENU
DrawMenuBar lpWnd
SetFocus lpWnd
End If
End Sub

Function GetHWnd(ByVal sCaption$) As Long
If sCaption = vbNullString Then sCaption = Application.Caption
GetHWnd = FindWindowEx(0&, 0&, vbNullString, sCaption)
End Function



--
keepITcool
| www.XLsupport.com | keepITcool chello nl | amsterdam


keepITcool wrote :
 
Thanks Ivan.
I am using office XP. I copied the code to the normal bas module.
But how to implement it in a lengthy macro that runs for almost 3min?
Now I also feel that the code provided by vasant may be only for
removing the caption bar. Is it true?
Regards,
Madiya
 
keepITcool, I'm sure you 're correct. I just couldn't get the darn form to
repaint without all the RECT stuff, or the DrawMenuBar routine used by
Stephen Bullen.

Don't mean to sound defensive, but I was trying to get a quick answer to the
OP while waiting for a flight at the airport <g>. As I acknowledged, it was
pretty ugly. Never thought about SetFocus.

Regards,

Vasant
 
Hi Ivan,
Thanks for reply. But I still failed to understand how to use this bit
of code. What shell I do after putting in the normal bas module?
I am using office XP.
Reghards
 
Aah, but there is a difference. Yours removes the close button, but Vasant's
removes the whole caption bar, as requested.
 
Madiya said:
Hi Ivan,
Thanks for reply. But I still failed to understand how to use this bit
of code. What shell I do after putting in the normal bas module?
I am using office XP.
Reghards

Hi Madiya
You will need to put any of the above codes in the Userform code module
and not the Std module.
Note; you will also need a backdoor in that with out a titlebar you
will have no close button.

somthing like

Private Sub UserForm_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Unload Me
End Sub

Will allow you to clode out the Form by doubleclickingh it.
 
Ahh???

...as i said: "styles can be adapted from Vasant's code"


but if removing the caption, I do prefer an edge..
as in :

Sub FormNoCaption(objForm As Object)
Dim lpWnd&
Const GWL_STYLE = -16&
Const GWL_EX_STYLE = -20&
Const WS_CAPTION = &HC00000
Const WS_EX_CLIENTEDGE As Long = &H200&

lpWnd = GetHWnd(objForm.Caption)
If lpWnd Then
SetWindowLong lpWnd, GWL_STYLE, _
(GetWindowLong(lpWnd, GWL_STYLE) And Not WS_CAPTION)
SetWindowLong lpWnd, GWL_EX_STYLE, _
(GetWindowLong(lpWnd, GWL_EX_STYLE) Or WS_EX_CLIENTEDGE)
DrawMenuBar lpWnd
SetFocus lpWnd
End If
End Sub


note my code skips (lengthy) setwindowpos and the rectangles
and uses with drawmenubar/setfocus instead.
plus wraps it in a convenient reusable sub.

for playing with windows:
forget Spy++ .. get a copy of WinSpector
from http://www.windows-spy.com/

this (with many other options) allows for on the fly experiments..




--
keepITcool
| www.XLsupport.com | keepITcool chello nl | amsterdam


Bob Phillips wrote :
 
Thanks Ivan.
Its a great help. I started using it in my earlier running application.
I close the form at the end of my code as well as in error handeling.
My users will surely like it.
Thanks again.
Regards,
 
Thanks Ivan.
Its a great help. I started using it in my earlier running application.
I close the form at the end of my code as well as in error handeling.
My users will surely like it.
Thanks again.
Regards,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

Timed Macros? 2
Splash Screen / userform 1
Splash Screen Behavior 2
Splash Screen Timing 4
Splash screen properties 1
Splash Screen 2
Creating Splash Screen in Excel 2004 MacIntosh 8
Excel Splash Screen 6

Back
Top