Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0114: Schließen-Schaltfläche einer Form deaktivieren

 von 

Beschreibung

In diesem Tipp wird in zwei Varianten gezeigt wie man die Schließen-Schaltfläche einer Form deaktivieren und wieder aktivieren kann. In der ersten Variante, basierend auf einem Artikel von Microsoft, ist es über eine Klasse möglich die Schließen-Schaltfläche einer Form anzusteuern. In der zweiten Variante wird gezeigt wie man die Schließen-Schaltfläche schon beim Öffnen der Form deaktivieren kann, was jedoch mit Vorsicht zu genießen ist, da sie sich anschließend nicht wieder aktivieren lässt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

Download des Beispielprojektes [13,78 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Public Class Form1
    Private Sub ShowCloseButtonState()
        If CloseButton.Enabled(Me) Then
            Me.Text = "XButton is enabled"
        Else
            Me.Text = "XButton is disabled"
        End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button3.Click

        Dim f2 As New Form2
        f2.Show()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Me.CheckBox1.Checked = True
        Me.ShowCloseButtonState()
    End Sub

    Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

        CloseButton.Enabled(Me) = Me.CheckBox1.Checked
        Me.ShowCloseButtonState()
    End Sub
End Class

' ##############################################################################
' ################################# Form2.vb ###################################
' ##############################################################################
Public Class Form2
    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        Me.Close()
    End Sub

    Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim Param As CreateParams = MyBase.CreateParams
            Const CS_NOCLOSE As Int32 = &H200
            Param.ClassStyle = Param.ClassStyle Or CS_NOCLOSE
            Return Param
        End Get
    End Property
End Class
' ##############################################################################
' ################################ XButton.vb ##################################
' ##############################################################################
Public NotInheritable Class CloseButton
    Private Declare Function GetSystemMenu Lib "user32" _
        (ByVal hWnd As IntPtr, ByVal bRevert As Integer) As IntPtr
    Private Declare Function GetMenuState Lib "user32" _
        (ByVal hMenu As IntPtr, ByVal uId As Integer, _
            ByVal uFlags As Integer) As Integer
    Private Declare Function EnableMenuItem Lib "user32" _
        (ByVal hMenu As IntPtr, ByVal wIDEnableItem As Integer, _
            ByVal wEnable As Integer) As Integer

    Private Const MF_ENABLED As Integer = &H0
    Private Const MF_DISABLED As Integer = &H2
    Private Const SC_CLOSE As Integer = &HF060

    Public Shared Property Enabled(ByVal form As Form) As Boolean
        Get
            Return CloseButton.IsEnabled(form)
        End Get
        Set(ByVal value As Boolean)
            CloseButton.ChangeState(form, value)
        End Set
    End Property

    Private Shared Function IsEnabled(ByVal form As Form) As Boolean
        Dim systemMenu As IntPtr = GetSystemMenu(form.Handle, 0)
        Dim state As Integer = GetMenuState(systemMenu, SC_CLOSE, 0)
        If (state And MF_DISABLED) = MF_DISABLED Then
            Return False
        Else
            Return True
        End If
    End Function

    Private Shared Sub ChangeState(ByVal form As Form, ByVal state As Boolean)
        Dim systemMenu As IntPtr = GetSystemMenu(form.Handle, 0)
        Dim flag As Integer
        If state Then
            flag = MF_ENABLED
        Else
            flag = MF_DISABLED
        End If
        EnableMenuItem(systemMenu, SC_CLOSE, flag)
    End Sub
End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.