Close-Button und Fenstermenü verstecken

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Close-Button und Fenstermenü verstecken

Beitrag 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
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Das geht nicht. Du kannst nur die Funktionalität deaktivieren, nicht die Anzeige.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag 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
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Er will ihn verstecken, das geht nicht.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Beitrag 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
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Beitrag 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
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Antworten