Si claro, juega un poco con esta function que te permite disable ( la X de cierre ) y eliminar items. Llamala antes de añadir tu systemmenu ( has de hacer una mezcla entre este ejemplo y el anterior ) o después, ves las posibilidades que tiene, y, por favor, pon después aquí tus conclusiones.
Ojo, el comportamiento de los sysmenus es distinto si se trata de dialogs o de windows creo recordar ( me refiero al orden en el que son guardados los items que ya trae por defecto )
- Code: Select all Expand view
#include "FiveWin.ch"
#define MF_BYPOSITION 1024 // 0x0400
#define MF_DISABLED 2
Function Main()
Local oDlg, ;
lExit := .F.,;
oIcon
Define ICON oIcon FILE "..\ICONS\FiveWin.Ico"
Define Dialog oDlg Title "Test" ICON oIcon
@ 30, 10 Button "Exit" Of oDlg Size 30, 15 Pixel Action ( lExit := .T., oDlg:End() )
ACTIVATE Dialog oDlg Centered ON Init DisableX( oDlg, .T.) ;
Valid lExit
Return Nil
//----------------------------------------------------------------------------//
FUNCTION DisableX(oWin, lDisable)
LOCAL hMenu := 0
LOCAL nCount := 0
DEFAULT lDisable := .T.
IF lDisable
hMenu = GetSystemMenu(oWin:hWnd, .F.)
nCount = GetMItemCount(hMenu)
? nCount
IF oWin:ClassName() = "TDIALOG"
//RemoveMenu(hMenu, 1, nOR( MF_BYPOSITION, MF_DISABLED) )
//RemoveMenu(hMenu, 1, nOR( MF_BYPOSITION, 0 ) )
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, 0 ) )
//RemoveMenu(hMenu, 2, nOR( MF_BYPOSITION, MF_DISABLED) )
//RemoveMenu(hMenu, 0, nOR( MF_BYPOSITION, MF_DISABLED) )
ELSE
RemoveMenu(hMenu, nCount - 1, nOR( MF_BYPOSITION, MF_DISABLED) )
RemoveMenu(hMenu, nCount - 2, nOR( MF_BYPOSITION, MF_DISABLED) )
ENDIF
ELSE
GetSystemMenu( oWin:hWnd, .T. )
ENDIF
RETURN nil