Отключить кнопку "Закрыть", не скрывая панель управления

У меня есть приложение, в котором я не хочу, чтобы пользователь мог закрыть форму. Ладно, достаточно просто. Просто установите ControlBox = false для формы.

Тем не менее, я хотел бы сохранить значок приложения в верхнем левом углу формы. Незначительное, я знаю, но детали что-то значат для меня.

Настройка Controlbox = false также убирает значок приложения в верхнем левом углу формы. Это можно обойти??

2 ответа

Решение

Вот код, который я использовал.

Моя версия VB.Net.

Private Const CP_NOCLOSE_BUTTON As Integer = &H200
Protected Overrides ReadOnly Property CreateParams() As Windows.Forms.CreateParams
    Get
        Dim mdiCp As Windows.Forms.CreateParams = MyBase.CreateParams
        mdiCp.ClassStyle = mdiCp.ClassStyle Or CP_NOCLOSE_BUTTON
        Return mdiCp
    End Get
End Property

Мне нужна была опция, которая отключала бы условное закрытие (как стандарт MessageBox делает для YesNo вопрос), поэтому принятый ответ не будет работать для меня, или, возможно, я не смог понять, как я мог заставить его работать. Я закончил с этим

Private Const MF_BYPOSITION As Int32 = &H400
Private Const MF_REMOVE As Int32 = &H1000
Private Declare Auto Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal bRevert As Int32) As IntPtr
Private Declare Auto Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As IntPtr) As Int32
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean
Private Declare Auto Function RemoveMenu Lib "user32.dll" (ByVal hMenu As IntPtr, ByVal nPosition As Int32, ByVal wFlags As Int32) As Int32

Public Sub DisableCloseButton(ByVal hwnd As IntPtr)
    Dim hMenu As IntPtr, n As Int32
    hMenu = GetSystemMenu(hwnd, 0)
    If Not hMenu.Equals(IntPtr.Zero) Then
        n = GetMenuItemCount(hMenu)
        If n > 0 Then
            RemoveMenu(hMenu, n - 1, MF_BYPOSITION Or MF_REMOVE)
            RemoveMenu(hMenu, n - 2, MF_BYPOSITION Or MF_REMOVE)
            DrawMenuBar(hwnd)
        End If
    End If
End Sub

Позвоните через

DisableCloseButton(MyForm.Handle)

Поскольку я использовал его для настраиваемого окна сообщения, я не проверял, как включить его снова.

Другие вопросы по тегам