Консультация № 27644
13.10.2005, 16:32
0.00 руб.
0 7 7
Здрасте, надо что бы при выходе из программы стандартным путём(то есть на крестик вверху формы :)) программа сворачивалась, а не закрывалась(закрываться будет на кнопочку). Или может быть можно вообще убрать этот крестик?

Обсуждение

Неизвестный
13.10.2005, 16:46
общий
это ответ
Здравствуйте, Dushin Igor!
Нужно прописать в событие Form_Unload такое:
Cancel=1 ‘отмена закрытия окна
Me.WindowState=vbMinimized ‘сворачивание окна
Неизвестный
13.10.2005, 17:20
общий
это ответ
Здравствуйте, Dushin Igor!
Свойство формы ControlBox=false.
Неизвестный
13.10.2005, 18:38
общий
это ответ
Здравствуйте, Dushin Igor!
Скопируйте нижеприведённый код в необходимую форму:

Приложение:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) ‘ здесь вы скрываете форму и делаете всё, что необходимо Cancel = 1End Sub
Неизвестный
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
Неизвестный
13.10.2005, 22:51
общий
это ответ
Здравствуйте, Dushin Igor!
Я лишь добавлю как действительно можно заблокировать "крестик":) См приложение

Приложение:
Option Explicit‘ Объявление API функций: Private Declare Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, _ ByVal bRevert As Long) As LongPrivate Declare Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long) As LongPrivate Const MF_BYPOSITION = &H400& ‘Функция для недоступности кнопки закрыть на форме .Private Sub DisableCloseWindowButton(frm As Form) Dim hSysMenu As Long hSysMenu = GetSystemMenu(frm.hWnd, 0) RemoveMenu hSysMenu, 6, MF_BYPOSITION RemoveMenu hSysMenu, 5, MF_BYPOSITION End SubPrivate Sub Form_Load()DisableCloseWindowButton Form1End Sub
Неизвестный
14.10.2005, 09:14
общий
это ответ
Здравствуйте, Dushin Igor!

Option Explicit

Private Sub Form_Unload(Cancel As Integer)
Cancel = -1
Me.WindowState = 1 ‘Сворачивание формы на панель
End Sub
Неизвестный
15.10.2005, 15:00
общий
это ответ
Здравствуйте, Dushin Igor!

Dim IsClose as Boolean
Private Sub Form_Unload(cancel as Integer)
If Not IsClose Then
Cancel=1
Me>WindowState=vbMinimized
End If
End Sub

Private Sub cmdClose_Click()
IsClose=True
Unload Me
End Sub

Насчет убирания креста, то смотри рассылку - там есть ответ на такой вопрос. Да, убрать крестик не выйдет, можно сделать его только недоступным (не считая случая, когда в форме вообще панель контроля отключена и при наличии Caption появляется строка вверху для тоскания формы, а при отсутствии - исчезает)
Форма ответа