Кнопка закрытия окна в VB.Net

vitaly3000

Местный
Регистрация
6 Сен 2004
Сообщения
46
Реакции
3
Credits
76
Нужна помощь по такому вопросу в Visual Basic .Net.

Есть MDI программа. В ней несколько дочерних окон, где нужно отключить кнопку закрытия окна (наподобие MinimizeBox=false).

Для Visual Basic 6.0 есть такой код:

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

Const SC_Close = &HF060
Const MF_BYCOMMAnd = &H0

Public Sub DisableXbutton(ByVal frmHwnd As Long)
Dim hMenu As Long

hMenu = GetSystemMenu(frmHwnd, 0&)
If hMenu Then
Call DeleteMenu(hMenu, SC_Close, MF_BYCOMMAND)
DrawMenuBar (frmHwnd)
End If
End Sub

Private Sub Form_Load()
DisableXbutton (Me.hwnd)
End Sub


Но этот код не работает в VB.Net.

Если программно для конкретной формы переписать событие OnClosing, то это событие влияет также и на основное окно (что совершенно путает работу программы)!

Что неправильно я делаю, или как можно по-другому решить эту проблему?

PS: Подобных примеров кода, как показал выше, в Инете много, но они все подобные и не работают в VB.Net.
 

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Насколько я помню, аргументы System.Windows.Forms.FormClosingEventArgs передаются по цепочке и работу программы совсем не путает, так как описаны в документации. То есть при нажатии крестика главной формы событие FormClosing срабатывает сначала у всех дочерних форм, а параметр при этом передаётся уже с установленным ранее Cancel.

Просто в событии FormClosing главной формы сделай e.Cancel = False и всё будет нормально :)!
Я обычно дополнительно ставил свои флажки на совершение действий при закрытии проги.

А все старые примеры к библиотеке .NET Windows Forms никакого отношения не имеют :) Поэтому, как совсем убрать кнопку - не знаю, такой задачи не вставало.
 

vitaly3000

Местный
Регистрация
6 Сен 2004
Сообщения
46
Реакции
3
Credits
76
С обработкой события при закрытии дочерней формы разобрался - переписал обработку событий при закрытии каждой формы.

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

ploki

Местный
Регистрация
16 Май 2005
Сообщения
237
Реакции
180
Credits
0
Вспомнил! Инерция мышления мешала.
Есть же нужное свойство формы - ControlBox!
Только иконки тоже не будет!
 
Последнее редактирование модератором:

vitaly3000

Местный
Регистрация
6 Сен 2004
Сообщения
46
Реакции
3
Credits
76
ploki написал(а):
Вспомнил! Инерция мышления мешала.
Есть же нужное свойство формы - ControlBox!
Только иконки тоже не будет!

Такое решение испробовал, но оно тоже не катит :-(. Если развернуть дочернее окошко, а потом его свернуть, то получится искомый эффект - и иконка появится и кнопки минимизации и максимизации онка будут, и даже кнопка закрытия окна будет затемнена. Но нужно, чтобы пользователь не заморачивался такими действиями - ему не нужно сворачивать-разворачивать окошки.
 

vitaly3000

Местный
Регистрация
6 Сен 2004
Сообщения
46
Реакции
3
Credits
76
Разобрался. Если кому будет интересно, то вот кусок кода:


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


Затем вызывается функция для скрытия кнопки закрытия окна:
EnableMenuItem(GetSystemMenu(Handle.ToInt32, 0), SC_CLOSE, MF_BYCOMMAND Or MF_GRAYED)

Только надо этот вызов производить при создании формы, а также при событии OnResize.