Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

How can I disable a form's Close button

Status
Not open for further replies.

geo12345

Programmer
Jan 12, 2011
3
0
0
GR
Hi!!

I open my form as a fixed dialog but I do not want the user to be able to terminate the form by pressing the X button.

Any ideas out there?
 
I've just realised that by selecting controlbox=false at the form properties you get rid of it.
 
In the forms properties, you can set the forms control box property to false. The entire control box will not be shown. Not sure if that is the result you want.
Dawn
 
geo12345,
In the forms properties, set the ControlBox property to False. Remember you will need some other method of terminating the form; either from your code or a close command button on the form.

Hope this helps,
pmrankine
 
Start a new standard EXE project. Form1 is added by default.


Add three CommandButtons to Form1.


Add the following code to Form1:

Code:
      Option Explicit

      'Menu item constants.
      Private Const SC_CLOSE       As Long = &HF060&

      'SetMenuItemInfo fMask constants.
      Private Const MIIM_STATE     As Long = &H1&
      Private Const MIIM_ID        As Long = &H2&

      'SetMenuItemInfo fState constants.
      Private Const MFS_GRAYED     As Long = &H3&
      Private Const MFS_CHECKED    As Long = &H8&

      'SendMessage constants.
      Private Const WM_NCACTIVATE  As Long = &H86

      'User-defined Types.
      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

      'Declarations.
      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

      'Application-specific constants and variables.
      Private Const xSC_CLOSE  As Long = -10
      Private Const SwapID     As Long = 1
      Private Const ResetID    As Long = 2

      Private hMenu  As Long
      Private MII    As MENUITEMINFO

      Private Sub Command1_Click()
          Dim Ret As Long

          Ret = SetId(SwapID)
          If Ret <> 0 Then

              If MII.fState = (MII.fState Or MFS_GRAYED) Then
                  MII.fState = MII.fState - MFS_GRAYED
              Else
                  MII.fState = (MII.fState Or MFS_GRAYED)
              End If

              MII.fMask = MIIM_STATE
              Ret = SetMenuItemInfo(hMenu, MII.wID, False, MII)
              If Ret = 0 Then
                  Ret = SetId(ResetID)
              End If

              Ret = SendMessage(Me.hwnd, WM_NCACTIVATE, True, 0)
              SetButtons
          End If
      End Sub

      Private Sub Command2_Click()
          Dim Ret As Long

          If MII.fState = (MII.fState Or MFS_CHECKED) Then
              MII.fState = MII.fState - MFS_CHECKED
          Else
              MII.fState = (MII.fState Or MFS_CHECKED)
          End If

          MII.fMask = MIIM_STATE
          Ret = SetMenuItemInfo(hMenu, MII.wID, False, MII)
          SetButtons
      End Sub

      Private Sub Command3_Click()
          Unload Me
      End Sub

      Private Function SetId(Action As Long) As Long
          Dim MenuID As Long
          Dim Ret As Long

          MenuID = MII.wID
          If MII.fState = (MII.fState Or MFS_GRAYED) Then
              If Action = SwapID Then
                  MII.wID = SC_CLOSE
              Else
                  MII.wID = xSC_CLOSE
              End If
          Else
              If Action = SwapID Then
                  MII.wID = xSC_CLOSE
              Else
                  MII.wID = SC_CLOSE
              End If
          End If

          MII.fMask = MIIM_ID
          Ret = SetMenuItemInfo(hMenu, MenuID, False, MII)
          If Ret = 0 Then
              MII.wID = MenuID
          End If
          SetId = Ret
      End Function

      Private Sub SetButtons()
          If MII.fState = (MII.fState Or MFS_GRAYED) Then
              Command1.Caption = &quot;Enable&quot;
          Else
              Command1.Caption = &quot;Disable&quot;
          End If
          If MII.fState = (MII.fState Or MFS_CHECKED) Then
              Command2.Caption = &quot;Uncheck&quot;
          Else
              Command2.Caption = &quot;Check&quot;
          End If
      End Sub

      Private Sub Form_Load()
          Dim Ret As Long

          hMenu = GetSystemMenu(Me.hwnd, 0)
          MII.cbSize = Len(MII)
          MII.dwTypeData = String(80, 0)
          MII.cch = Len(MII.dwTypeData)
          MII.fMask = MIIM_STATE
          MII.wID = SC_CLOSE
          Ret = GetMenuItemInfo(hMenu, MII.wID, False, MII)
          SetButtons
          Command3.Caption = &quot;Exit&quot;
      End Sub


Press the F5 key to run the program.

Hope this was what you were looking for! :)
 

Thanks all of you.

I set the control box property to false and it's fine.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top