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

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Location
Красноярск
Нужна помощь по такому вопросу в 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

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Насколько я помню, аргументы System.Windows.Forms.FormClosingEventArgs передаются по цепочке и работу программы совсем не путает, так как описаны в документации. То есть при нажатии крестика главной формы событие FormClosing срабатывает сначала у всех дочерних форм, а параметр при этом передаётся уже с установленным ранее Cancel.

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

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

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Location
Красноярск
С обработкой события при закрытии дочерней формы разобрался - переписал обработку событий при закрытии каждой формы.

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

ploki

Member
Joined
May 16, 2005
Messages
237
Reaction score
180
Location
Москва
Вспомнил! Инерция мышления мешала.
Есть же нужное свойство формы - ControlBox!
Только иконки тоже не будет!
 
Last edited by a moderator:

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Location
Красноярск
ploki said:
Вспомнил! Инерция мышления мешала.
Есть же нужное свойство формы - ControlBox!
Только иконки тоже не будет!

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

vitaly3000

Member
Joined
Sep 6, 2004
Messages
46
Reaction score
3
Location
Красноярск
Разобрался. Если кому будет интересно, то вот кусок кода:


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.
 
Top