Minimize and maximize buttons userforms

R

RB Smissaert

How do I add minimize and maximize buttons to a VBA userform?
I have this code that does it, but when I change the caption of the userform
the buttons don't work anymore. I am slowly coming to the conclusion that
it probably is not worth the trouble and that it is better to make your own
buttons.

Public Declare Function FindWindow _
Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As Long, _
ByVal lpWindowName 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 Sub UserForm_Initialize()

Dim hWnd as Long

hWnd = FindWindow(vbNullString, UserForm1.Caption)
SetWindowLong hWnd, -16, &H20000 Or &H10000 Or &H84C80080

End Sub


RBS
 
R

RB Smissaert

Sorry, the FindWindow API declaration should be:

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

RBS
 
B

Bob Phillips

If you change the name of the form, you cannot use the old name in the
initialize code.

Why not use?

Private Sub UserForm_Initialize()
Dim hWnd As Long

hWnd = FindWindow(vbNullString, Me.Caption)
SetWindowLong hWnd, -16, &H20000 Or &H10000 Or &H84C80080

End Sub



--

HTH

RP
(remove nothere from the email address if mailing direct)
 
R

RB Smissaert

I am not changing the name of the form, just the caption.
Doing Me.Caption won't make a difference.

RBS
 
R

RB Smissaert

Thanks, but I had a look at these controls a long time ago and decided they
weren't worth the extra overhead.
I have downloaded and installed again and had a look if they suffer from the
same problem, that is that changing
the form caption makes the minimize and maximize buttons stop working.
Unfortunately it shows exactly the same problem.

RBS
 
R

RB Smissaert

Forgot to say that if you try to set the min/max buttons again after
changing the form's caption
you get some really strange effects. Definitely not healthy to do that with
the code as it is.

RBS
 
R

RB Smissaert

Maybe I am on the right path now with this. If I do this:

Unload UserForm1
UserForm1.Caption = "Testing"
AddMaxMin
UserForm1.Show 0

Sub AddMaxMin()

Dim hWnd As Long

hWnd = FindWindow(vbNullString, UserForm1.Caption)
SetWindowLong hWnd, -16, &H20000 Or &H10000 Or &H84C80080

End Sub

It seems to work. Will see if this is all really workable.


RBS
 
R

RB Smissaert

I think I have this now all worked out.
This is the code that does it:


Private Declare Function GetWindowLong _
Lib "user32" Alias _
"GetWindowLongA" (ByVal hWnd As Long, _
ByVal nIndex As Long) 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 Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
Private Const GWL_STYLE = (-16)

Sub AddMinMax()

Dim hWnd As Long
Dim lngStyle As Long

hWnd = FindWindow(vbNullString, MainForm.Caption)

lngStyle = GetWindowLong(hWnd, GWL_STYLE)
lngStyle = lngStyle Or WS_MAXIMIZEBOX
lngStyle = lngStyle Or WS_MINIMIZEBOX
SetWindowLong hWnd, GWL_STYLE, lngStyle

DrawMenuBar hWnd

End Sub

Just have to run AddMinMax from the Userform Activate event and after any
code that alters the caption
of the userform via Userform.Caption =
It works very nice indeed.
Just have to make my keyboard shortcuts now to run these menubar buttons.


RBS
 
B

Bob Phillips

Two questions.

Why do you need to change the caption?

Where is DrawMenuBar defined?

--

HTH

RP
(remove nothere from the email address if mailing direct)
 
R

RB Smissaert

Two answers.

I use the userform title bar (caption) to display all kind of messages for
the users.

Public Declare Function DrawMenuBar Lib "user32" _
(ByVal hwnd As Long) As Long

RBS
 
B

Bob Phillips

I appreciate that it doesn't solve the problem, but would it not have been
better (easier?) to have a status area and display your messages there
rather than change the caption. I tend to subscribe to KISS personally.

--

HTH

RP
(remove nothere from the email address if mailing direct)
 
R

RB Smissaert

This is a very busy userform and I don't want to add another label or
textbox.
Also the titlebar is just nice for this purpose as it stands out and is
clear.
It is no trouble as all I have to do is add the line AddMinMax after any
code
that alters the caption.
I tend to subscribe to KISS personally

What is that?

RBS
 
B

Bob Phillips

KISS - Keep It Simple Stupid :)

Bob

RB Smissaert said:
This is a very busy userform and I don't want to add another label or
textbox.
Also the titlebar is just nice for this purpose as it stands out and is
clear.
It is no trouble as all I have to do is add the line AddMinMax after any
code
that alters the caption.


What is that?

RBS
 
R

RB Smissaert

I had heard about "It is the economy stupid", but not this one.
It is is simple enough for me though.
The only thing I haven't figured out yet is how to get the focus in a
treeview
control when I press the restore up button from the minimized position.
Tried numerous construction, but no success yet.

RBS
 

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

Top