Form Close Button Enable/Disable   zodpovězená otázka

WinForms

Zdravím, jak ve VB.Net za běhu měnit vlastnost Enabled tlačítka na zavření formuláře?


    Friend Property FormCloseButtonDisabled() As Boolean
        Get
            Return _FormCloseButtonDisabled
        End Get
        Set(ByVal value As Boolean)
            _FormCloseButtonDisabled = value
        End Set
    End Property

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

Vyhovuje, dokonce nelze zavřít ani pomocí Alt+F4 , ale jak obnovit a překreslit tlačítko

po změně vlastnosti? Ve WndProc? SendMessage plus WM_NCACTIVATE?

Vzhled pomocí GetSystemMenu a EnableMenuItem a funkci v události formuláře FormClosing?

Vlastnost ControlBox skryje komplet vše včetně Min a Max, to není to pravé.

Nepřehlížím jenom nějakou mi neznámou vlastnost pro CloseButton?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přikládám ještě vb6 to vb.Net pokus :

    Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal revert As Integer) As Integer
    Private Declare Function EnableMenuItem Lib "user32" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
    Private Const SC_CLOSE As Integer = &HF060
    Private Const MF_BYCOMMAND As Integer = &H0
    Private Const MF_GRAYED As Integer = &H1
    Private Const MF_ENABLED As Integer = &H0

    Private _FormCloseButtonDisabled As Boolean
    Friend Property FormCloseButtonDisabled() As Boolean
        Get
            Return _FormCloseButtonDisabled
        End Get
        Set(ByVal value As Boolean)
            _FormCloseButtonDisabled = value


            Select Case EnableMenuItem(GetSystemMenu(Me.Handle.ToInt32, 0), SC_CLOSE, IIf(value, MF_BYCOMMAND Or MF_GRAYED, MF_BYCOMMAND))
                Case MF_ENABLED
                Case MF_GRAYED
                Case &HFFFFFFFF
                    Throw New Exception("The Close menu item does not exist.")
                Case Else
            End Select


        End Set
    End Property

Tady lze zrušit zavření (Form1) pomocí Alt+F4 :

Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If e.CloseReason = CloseReason.UserClosing Then e.Cancel = FormCloseButtonDisabled
End Sub

Tlačítko (Button1) na testování:

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        FormCloseButtonDisabled = Not FormCloseButtonDisabled
    End Sub

Jinak?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takhle to děláte naprosto správně, moc jsem nepochopil co je za problém.

Pokud vlastnosti formuláře potřebujete měnit zaběhu, tak CreateParams použít nelze.

Toto je stejné jak ve VB6 tak pro VB.NET, oboje pro formuláře používá na pozadí stejné Windows Win32 API.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Class Form1

  Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Integer, ByVal revert As Integer) As Integer
  Private Declare Function EnableMenuItem Lib "user32" (ByVal menu As Integer, ByVal ideEnableItem As Integer, ByVal enable As Integer) As Integer
  Private Const SC_CLOSE As Integer = &HF060
  Private Const MF_BYCOMMAND As Integer = &H0
  Private Const MF_GRAYED As Integer = &H1
  Private Const MF_ENABLED As Integer = &H0

  'disabluji tímto
  Private Sub btnDisable_Click(sender As System.Object, e As System.EventArgs) Handles btnDisable.Click
    EnableMenuItem(GetSystemMenu(Me.Handle.ToInt32, 0), SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)
  End Sub

  'enabluji tímto
  Private Sub btnEnable_Click(sender As System.Object, e As System.EventArgs) Handles btnEnable.Click
    EnableMenuItem(GetSystemMenu(Me.Handle.ToInt32, 0), SC_CLOSE, MF_BYCOMMAND Or MF_ENABLED)
  End Sub

End Class
nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback