How to remove or disable Close (X)-button of the Form?

M

Mika M

Customer wants the Close (X)-button of the forms top right corner to be
Disabled or removed from Windows Form-application, which is made using
VB.NET, but leave MinimizeBox and MaximizeBox.

I think this is not so clever to do like this way, but have to do like
customer wants - so how to do this? It seems to be not just like
changing property like with MinimizeBox and MaximizeBox. Any succestions?
 
C

Cor Ligthert

Mika,

When you are sure your users wants it and you are not distributing the
program too others, (because otherwise you will most probably directly be
confrontated with bug reports which are probably justifiable correct) you
can just use the closing event and set in that e.cancel = true (or false I
always am in doubt about the last just try).

I would in your situation let the user sign a contract that he wanted this.
What you can do as well is showing in a the messagebox from the clossing
event that this is by order from your client disabled. (A little more polite
however not to misunderstand text than of course).

Instead of that all you can as well overpaint the X (and keep the cancel)
however that will be a lot more work.

I hope this helps?

Cor
 
G

Guest

#Region " Windows Form Designer generated code "

'disables close
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
Const CS_NOCLOSE As Integer = &H200
cp.ClassStyle = cp.ClassStyle Or CS_NOCLOSE
Return cp
End Get
End Property
 
H

Herfried K. Wagner [MVP]

Mika M said:
Customer wants the Close (X)-button of the forms top right corner to be
Disabled or removed from Windows Form-application, which is made using
VB.NET, but leave MinimizeBox and MaximizeBox.

Add this to your form:

\\\
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
Const CS_DBLCLKS As Int32 = &H8
Const CS_NOCLOSE As Int32 = &H200
cp.ClassStyle = CS_DBLCLKS Or CS_NOCLOSE
Return cp
End Get
End Property
///

Alternatively you can remove the according menu items from the system
menu using p/invoke.
 
M

Mika M

#Region " Windows Form Designer generated code "
'disables close
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
Const CS_NOCLOSE As Integer = &H200
cp.ClassStyle = cp.ClassStyle Or CS_NOCLOSE
Return cp
End Get
End Property

Thanks Mark! Seems to work like I need!
 
C

Cor Ligthert

Mick,

When I saw your article I thought I have to say Sorry Sorry Sorry however
you gave me the change here.

Until now I thought that I had seen only awfull painting solutions, because
this simple one I would have remembered me I thought.

Again Sorry Sorry Sorry

:)))

Cor
 
M

Mick Doherty

No need to apologise. I just couldn't believe you hadn't seen it before
since it's been here several times in the past and I'm almost positive that
you've read every message since you started interacting with the group. By
the amount of responses you give it certainly looks that way.
 
G

Guest

Declarations:

Private Declare Function GetSystemMenu Lib "user32" Alias
"GetSystemMenu" (ByVal hwnd As Integer, ByVal bRevert As Integer) As Integer
Private Declare Function DeleteMenu Lib "user32" Alias "DeleteMenu"
(ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As Integer)
As Integer

Private Const MF_BYPOSITION As Integer = &H400&


Put this in form load:

DeleteMenu(iMenu, 6, MF_BYPOSITION) ' Disable the 'X' (Control Box)
DeleteMenu(iMenu, 5, MF_BYPOSITION) ' Remove the seperator bar

The above will disable your ControlBox for you
 
H

Herfried K. Wagner [MVP]

Crouchie1998 said:
Private Declare Function GetSystemMenu Lib "user32" Alias
"GetSystemMenu" (ByVal hwnd As Integer, ByVal bRevert As Integer) As
Integer
Private Declare Function DeleteMenu Lib "user32" Alias "DeleteMenu"
(ByVal hMenu As Integer, ByVal nPosition As Integer, ByVal wFlags As
Integer)
As Integer

Private Const MF_BYPOSITION As Integer = &H400&


Put this in form load:

DeleteMenu(iMenu, 6, MF_BYPOSITION) ' Disable the 'X' (Control Box)
DeleteMenu(iMenu, 5, MF_BYPOSITION) ' Remove the seperator bar

The above will disable your ControlBox for you

ACK. I have published a similar solution on my website some time ago
(<URL:http://dotnet.mvps.org/dotnet/code/windowsandforms/#NoClose>), but I
prefer the 'CreateParams' solution.
 
G

Guest

I first used the above solution in VB 6, but 2 years ago when I moved to
VB.NET I charged the code accordingly.
 

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