13.10.2005, 22:02
общий
это ответ
Здравствуйте, Dushin Igor!
>>Или может быть можно вообще убрать этот крестик?
Можно, только не убрать, а деактивировать. Это можно сделать с помощью функций WinAPI для работы с меню.
Удаление пунктов из системного меню DeleteFromSystemMenu. Можно также удалить пункт меню Закрыть. При этом кнопка Х станет неактивной, т.е. на нее нельзя будет нажать.
Приложение:
‘Объявления. Возможно будут лишние, т.к. брал из общего модуля работы с системными функциями окна.Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare Function GetSystemMenu Lib "user32" (ByVal hWnd As Long, ByVal bRevert As Long) As LongDeclare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As LongDeclare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As String) As LongPrivate Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hWnd As Long, ByVal fAccept As Long)Private Declare Sub DragFinish Lib "shell32.dll" (ByVal HDROP As Long)Private Declare Function DragQueryFile Lib "shell32.dll" Alias "DragQueryFileA" (ByVal HDROP As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long‘Private Declare Function DragQueryPoint& Lib "shell32.dll" (ByVal HDROP As Long, lpPoint As POINTAPI)Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As LongPrivate Declare Function GetMenuItemID Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As LongPrivate Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As LongPublic Const MF_BYCOMMAND = &H0Public Const MF_BYPOSITION = &H400Public Const MF_SEPARATOR = &H800Public Const MF_POPUP = &H10Public Const GWL_WNDPROC = -4Public Const WM_SYSCOMMAND = &H112Public Const WM_COMMAND = &H111Public Const WM_CONTEXTMENU = &H70Public Const SCOFFSET = &H2000Private Const WM_DROPFILES& = &H233Public Enum FlagsConsts BYPOSITION = MF_BYPOSITION BYCOMMAND = MF_BYCOMMANDEnd EnumPublic lpPrevWndProc As LongPublic gHW As LongPublic CurrentID As LongPrivate blSubClassed As BooleanPrivate hMenu As Long‘Добавление в системное меню новых пунктовPublic Sub AddToSystemMenu(Текст As String, Optional Разделитель As Boolean = False, _Optional РазделительДоТекста As Boolean = True) Dim di As Long ‘ If Len(txtMenu.Text) = 0 Then‘ MsgBox "Must specify menu text"‘ Exit Sub‘ End IfIf Len(Текст) <> 0 Then HSystemMenu If Разделитель And РазделительДоТекста Then di = AppendMenu(hMenu, MF_SEPARATOR, SCOFFSET + CurrentID, "") CurrentID = CurrentID + 1 End If di& = AppendMenu(hMenu, MF_STRING, SCOFFSET + CurrentID, Текст) CurrentID = CurrentID + 1 If Разделитель And Not РазделительДоТекста Then di = AppendMenu(hMenu, MF_SEPARATOR, SCOFFSET + CurrentID, "") CurrentID = CurrentID + 1 End IfElse hMenu = GetSystemMenu(gHW, True)End IfEnd SubSub HSystemMenu()hMenu = GetSystemMenu(gHW, False)End SubFunction CountSMItem() As LongCountSMItem = GetMenuItemCount(hMenu)End FunctionFunction MenuID(Pos As Long) As LongMenuID = GetMenuItemID(hMenu, Pos)End FunctionFunction MenuString(ItemID As Long) As StringDim strTemp As StringDim lRez As LongstrTemp = Space$(256)lRez = GetMenuString(hMenu, ItemID, strTemp, 256, MF_BYCOMMAND)If lRez <> 0 Then MenuString = Left$(strTemp, lRez)End Function‘Удаление пунктов из системного меню. Sub DeleteFromSystemMenu(Pos As Long, dwFlags As FlagsConsts)Dim lRez As LonglRez = DeleteMenu(hMenu, Pos, dwFlags)Debug.Print lRezEnd Sub