Is it possible to disable the close button (ie grey it out and remove it from the control menu) on an MDIchild form without disabling anything else.
Regards
Jon
Printable View
Is it possible to disable the close button (ie grey it out and remove it from the control menu) on an MDIchild form without disabling anything else.
Regards
Jon
Hi friend
try setting the MDIChild's ControlBox propery to False
from your parent form.
it is not possible to disable the X button
but by overriding the mousemove method of MDIChild form
you might succeed in disabling it manually,
but appearance cudn't be greyed out
thanks
- somnath
This works for a Form. Try it with an MDI Child.VB Code:
' From Pete Cozens Example on the CodeGuru Site ' Private Const SC_CLOSE As Long = &HF060& Private Const MIIM_STATE As Long = &H1& Private Const MIIM_ID As Long = &H2& Private Const MFS_GRAYED As Long = &H3& Private Const WM_NCACTIVATE As Long = &H86 Private Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Private Declare Function GetSystemMenu Lib "user32" ( _ ByVal hWnd As Long, ByVal bRevert As Long) As Long Private Declare Function GetMenuItemInfo Lib "user32" Alias _ "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _ ByVal b As Boolean, lpMenuItemInfo As MENUITEMINFO) As Long Private Declare Function SetMenuItemInfo Lib "user32" Alias _ "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, _ ByVal bool As Boolean, lpcMenuItemInfo As MENUITEMINFO) As Long Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Declare Function IsWindow Lib "user32" _ (ByVal hWnd As Long) As Long '******************************************************************************* ' Enables / Disables the close button on the titlebar and in the system menu ' of the form window passed. '------------------------------------------------------------------------------- ' Return Values: ' ' 0 Close button state changed succesfully / nothing to do. ' -1 Invalid Window Handle (hWnd argument) Passed to the function ' -2 Failed to switch command ID of Close menu item in system menu ' -3 Failed to switch enabled state of Close menu item in system menu ' '------------------------------------------------------------------------------- ' Parameters: ' ' hWnd The window handle of the form whose close button is to be enabled/ ' disabled / greyed out. ' ' Enable True if the close button is to be enabled, or False if it is to ' be disabled / greyed out. ' '------------------------------------------------------------------------------- ' Example: ' ' Add a form window to your project, and place a button on the form. Add the ' following in the form's code window: ' ' Option Explicit ' ' Private m_blnCloseEnabled As Boolean ' ' Private Sub Form_Load() ' m_blnCloseEnabled = True ' Command1.Caption = "Disable" ' End Sub ' ' Private Sub Command1_Click() ' m_blnCloseEnabled = Not m_blnCloseEnabled ' EnableCloseButton Me.hwnd, m_blnCloseEnabled ' ' If m_blnCloseEnabled Then ' Command1.Caption = "Disable" ' Else ' Command1.Caption = "Enable" ' End If ' End Sub ' '------------------------------------------------------------------------------- Public Function EnableCloseButton(ByVal hWnd As Long, Enable As Boolean) _ As Integer Const xSC_CLOSE As Long = -10 ' Check that the window handle passed is valid EnableCloseButton = -1 If IsWindow(hWnd) = 0 Then Exit Function ' Retrieve a handle to the window's system menu Dim hMenu As Long hMenu = GetSystemMenu(hWnd, 0) ' Retrieve the menu item information for the close menu item/button Dim MII As MENUITEMINFO MII.cbSize = Len(MII) MII.dwTypeData = String(80, 0) MII.cch = Len(MII.dwTypeData) MII.fMask = MIIM_STATE If Enable Then MII.wID = xSC_CLOSE Else MII.wID = SC_CLOSE End If EnableCloseButton = -0 If GetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function ' Switch the ID of the menu item so that VB can not undo the action itself Dim lngMenuID As Long lngMenuID = MII.wID If Enable Then MII.wID = SC_CLOSE Else MII.wID = xSC_CLOSE End If MII.fMask = MIIM_ID EnableCloseButton = -2 If SetMenuItemInfo(hMenu, lngMenuID, False, MII) = 0 Then Exit Function ' Set the enabled / disabled state of the menu item If Enable Then MII.fState = (MII.fState Or MFS_GRAYED) MII.fState = MII.fState - MFS_GRAYED Else MII.fState = (MII.fState Or MFS_GRAYED) End If MII.fMask = MIIM_STATE EnableCloseButton = -3 If SetMenuItemInfo(hMenu, MII.wID, False, MII) = 0 Then Exit Function ' Activate the non-client area of the window to update the titlebar, and ' draw the close button in its new state. SendMessage hWnd, WM_NCACTIVATE, True, 0 EnableCloseButton = 0 End Function
Wow Thank you much appreciated
I've never tried that with an MDI Child Finchy. May I assume, by your response, that it did, in fact, work?
Ahh
Thought it did but actually only greys out Close on the control menu. It doesn't disable the x in the top right
Thanks anyways
Update
It does actually work but not when the mdichild form is maximised
interesting...
When the child form is maximized, the X and the Close option on the menu are both available????? :confused:
That is interesting...
sorry I didn't make it very clear
when the mdichild form is maximised:
the 'close' on the control menu is greyed out and is disabled
the 'x' is not greyed out and is enabled
when the mdichild form is in any other state:
both 'close' and 'x' are greyed out and are disabled