Seite 1 von 1

Close-Button und Fenstermenü verstecken

Verfasst: 27.05.2009 03:55
von KatSeiko
Ich hab schon mal was ähnliches gesehen, kann es aber nicht wieder finden...
Ich brauche für mein Programm (Unter Windows, es protokolliert den Ablauf eines Programms in einem Editor-Gadget und wartet nachher auf einen "fertig stellen"-Button) eine Funktion, mit der ich den Close-Button und das Fenstermenü deaktivieren bzw. verstecken kann, ohne dass ich auf den Minimize-Button verzichten muss. Leider aktiviert PB die zwei Teile automatisch... Kann mir da jemand weiterhelfen?

Danke schonmal im Voraus... :D

Verfasst: 27.05.2009 08:30
von Falko
RS-Basic hat in seiner WinApi library,
"Schließbutton deaktivieren", unter den Zweig Open Window
stehen.

Mit dem Fenstermenü weiß ich jetzt nicht genau, was du meinst.
Ein Beispielschnipsel würde das vielleicht verdeutlichen.

Gruß Falko

Verfasst: 27.05.2009 11:52
von Fluid Byte
Das geht nicht. Du kannst nur die Funktionalität deaktivieren, nicht die Anzeige.

Verfasst: 27.05.2009 21:22
von nco2k
@KatSeiko
meinst du so?

Code: Alles auswählen

Procedure DisableWindowCloseButton(hWnd, Disable)
  hSysMenu = GetSystemMenu_(hWnd, #False)
  If hSysMenu
    EnableMenuItem_(hSysMenu, #SC_CLOSE, #MF_BYCOMMAND | Disable)
    DrawMenuBar_(hWnd)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 200, 45, "Test", #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(0, 10, 10, 180, 25, "Disable", #PB_Button_Toggle)
  
  Repeat
    Select WaitWindowEvent()
      
      Case #PB_Event_Gadget
        If EventGadget() = 0
          DisableWindowCloseButton(WindowID(0), GetGadgetState(0))
        EndIf
        
      Case #PB_Event_CloseWindow
        Break
        
    EndSelect
  ForEver
  
EndIf : End
wer suchet der findet: http://www.purebasic.fr/german/viewtopic.php?t=6556

c ya,
nco2k

Verfasst: 27.05.2009 21:36
von Fluid Byte
Er will ihn verstecken, das geht nicht.

Verfasst: 28.05.2009 01:08
von Falko
Zwar geht das nicht bezogen auf die Schließbox, aber die Anzeige
kann man schon verstecken. Schließen kann man hierbei nur noch
mit Alt+F4 :D. Aber dazu wurde ja schon was gepostet :mrgreen:

Code: Alles auswählen

Procedure UnHideAccessMenu(hwnd.l=0)
    Protected ingStyle.l
    lngStyle = GetWindowLong_(WindowID(hwnd), #GWL_STYLE)
    lngStyle = lngStyle | #WS_SYSMENU
    SetWindowLong_(WindowID(hwnd), #GWL_STYLE, lngStyle)
    SetWindowPos_(WindowID(hwnd), #HWND_TOP, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE |#SWP_DRAWFRAME )
EndProcedure
Procedure HideAccessMenu(hwnd.l=0)
    Protected ingStyle.l
    lngStyle = GetWindowLong_(WindowID(Window), #GWL_STYLE)
    lngStyle = lngStyle &~ #WS_SYSMENU
    SetWindowLong_(WindowID(hwnd), #GWL_STYLE, lngStyle)
    SetWindowPos_(WindowID(hwnd), #HWND_TOP, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE |#SWP_DRAWFRAME )
EndProcedure

If OpenWindow(0, 0, 0, 200, 45, "Test", #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   ButtonGadget(0, 10, 10, 180, 25, "Disable", #PB_Button_Toggle)

  Repeat
    Select WaitWindowEvent()
     
      Case #PB_Event_Gadget
        If EventGadget() = 0
          If GetGadgetState(0)=1
            HideAccessMenu()     
          Else
            UnHideAccessMenu()
          EndIf     
        EndIf
      Case #PB_Event_CloseWindow
        Break
      EndSelect
  ForEver
 
EndIf : End
Gruß, Falko

Verfasst: 28.05.2009 01:26
von KatSeiko
Der Code von nco2k ist schon super.
Was ich zusätzlich noch machen wollte ist, dass links der Menübutton verschwindet, der bei dem Programm als Kästchen angezeigt wird. Ohne dass der Minimize-Button verschwindet wie in Falkos Beispiel...

Danke, ich schau mal, ob ich was passendes in dieser Bibliothek finde... :D

Verfasst: 28.05.2009 02:00
von KatSeiko
Ich hab was gefunden... Das ist es, was ich vorgehabt habe (der Button erscheint im Beispiel nach ein paar Sekunden):

Code: Alles auswählen

Procedure DisableWindowCloseButton(hWnd, Disable)
  hSysMenu = GetSystemMenu_(hWnd, #False)
  If hSysMenu
    EnableMenuItem_(hSysMenu, #SC_CLOSE, #MF_BYCOMMAND | Disable)
    DrawMenuBar_(hWnd)
  EndIf
EndProcedure

Time.q = ElapsedMilliseconds()

If OpenWindow(0, 0, 0, 200, 45, "Test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible)
  SetWindowLong_(WindowID(0), #GWL_EXSTYLE, GetWindowLong_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_DLGMODALFRAME)
  HideWindow(0, 0) 
  DisableWindowCloseButton(WindowID(0), 1) 
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow Or (Time+5000) < ElapsedMilliseconds()
  DisableWindowCloseButton(WindowID(0), 0) 
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf : End