MDIGadget() und CreateImageMenu()

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
PBFetischist
Beiträge: 55
Registriert: 26.10.2004 19:42

MDIGadget() und CreateImageMenu()

Beitrag von PBFetischist »

Hallo zusammen,

wenn man ein MDI zusammen mit dem Imagemenu benutzt, wird der Menueintrag des MDI Fensters nicht gelöscht, wenn man wie folgt vorgeht:

MDI Fenster öffnen (Bild laden, im Democode)
Menueintrag anzeigen lassen (Menu Windows, unter Next ist ein Haken gesetzt)

MDI Fenster schliessen

Menueintrag anzeigen lassen, Eintrag noch da (Menu Windows, unter Next ist kein Haken mehr gesetzt)

Öffnet und schliesst man ein Fenster, ohne sich den Menüeintrag anzeigen zu lassen, dann verschwindet dieser auch wieder.

Am besten mal ausprobieren. Ich habs auf Windows XP getestet.

Grüße

Heiko

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - MDI example file
;
;    (c) 2004 - Fantaisie Software
;
; ------------------------------------------------------------
;

Structure MDIWindow
  ; info about the loaded image
  Image.l
  ImageWidth.l
  ImageHeight.l
  
  ; Our MDI Window  
  Window.l

  ; gadget numbers
  ScrollAreaGadget.l
  ImageGadget.l  
EndStructure

Global NewList MDIWindow.MDIWindow()

#WINDOW = 0
#TOOLBAR = 0
#MENU = 0

#MDI_Base = 1

Enumeration
  #MENU_Open
  #MENU_Close
  #MENU_CloseAll
  #MENU_Quit
  
  #MENU_TileV
  #MENU_TileH
  #MENU_Cascade
  #MENU_Arrange
  #MENU_Previous
  #MENU_Next
  
  #MENU_FirstMDI
EndEnumeration

UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

Procedure SelectMDIWindow(Window)

  ForEach MDIWindow()
    If MDIWindow()\Window = Window
      ProcedureReturn 1
    EndIf
  Next

EndProcedure

#GADGET_MDI = 0

#WindowFlags = #PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget

If OpenWindow(#WINDOW, 0, 0, 800, 600, "MDI ImageViewer", #WindowFlags)
  If CreateImageMenu(#MENU, WindowID(#WINDOW))
    MenuTitle("File")
      MenuItem(#MENU_Open, "Open")
      MenuItem(#MENU_Close, "Close")
      MenuItem(#MENU_CloseAll, "Close All")
      MenuBar()
      MenuItem(#MENU_QUit, "Quit")      
    MenuTitle("Windows")
      MenuItem(#MENU_TileV, "Tile vertically")
      MenuItem(#MENU_TileH, "Tile horizontally")
      MenuItem(#MENU_Cascade, "Cascade")
      MenuItem(#MENU_Previous, "Previous")
      MenuItem(#MENU_Next, "Next")
      
      ; MDI subwindows will get added here
  EndIf
  
  If CreateToolBar(#TOOLBAR, WindowID(#WINDOW))
    ToolBarStandardButton(#MENU_Open, #PB_ToolBarIcon_Open)
    ToolBarStandardButton(#MENU_Close, #PB_ToolBarIcon_Delete)
    ToolBarSeparator()
    ToolBarStandardButton(#MENU_Previous, #PB_ToolBarIcon_Undo)
    ToolBarStandardButton(#MENU_Next, #PB_ToolBarIcon_Redo)
  EndIf
  
  If CreateGadgetList(WindowID(#WINDOW))
    MDIGadget(#GADGET_MDI, 0, 0, 0, 0, 1, #MENU_FirstMDI, #PB_MDI_AutoSize)
  EndIf
  

  Quit = 0
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow
      Window = EventWindow()
      
      If Window = #WINDOW ; Out main window is closed, just quit
        Quit = 1
        
      Else ; It's one of our MDI children
      
        If SelectMDIWindow(Window) ; Check if it's one of our MDI window
          CloseWindow(Window)
          FreeImage(MDIWindow()\Image)
          DeleteElement(MDIWindow())   
        EndIf
    
      EndIf
    
    ElseIf Event = #PB_Event_Menu
      Select EventMenu()
        Case #MENU_Open
          FileName$ = OpenFileRequester("Open Image", DefautFile$, "Image Files (*.bmp,*.jpg,*.tiff,*.png,*.tga)|*.bmp;*.jpg;*.tiff;*.png;*.tga|All Files (*.*)|*.*", 0, #PB_Requester_MultiSelection)
          While FileName$
            DefaultFile$ = FileName$
            
            Image = LoadImage(#PB_Any, FileName$)
            If Image
            
              LastElement(MDIWindow())
              AddElement(MDIWindow())
              
              Item = ListIndex(MDIWindow())
              
              MDIWindow()\Image       = Image            
              MDIWIndow()\ImageWidth  = ImageWidth(Image)  ; ***
              MDIWindow()\ImageHeight = ImageHeight(Image)
              
              MDIWindow()\Window = AddGadgetItem(#GADGET_MDI, -1, FileName$)
              CreateGadgetList(WindowID(MDIWindow()\Window))
              
                Width  = WindowWidth (MDIWindow()\Window)
                Height = WindowHeight(MDIWindow()\Window)
              
                MDIWindow()\ScrollAreaGadget = ScrollAreaGadget(#PB_Any, 0, 0, Width, Height, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, 10)
                  MDIWindow()\ImageGadget = ImageGadget(#PB_Any, 0, 0, MDIWindow()\ImageWidth, MDIWindow()\ImageHeight, ImageID(Image))
                CloseGadgetList()
                          
            Else
              MessageRequester("Image Viewer","Could not load image: "+FileName$)
            EndIf            
            
            FileName$ = NextSelectedFileName()
          Wend
        
        Case #MENU_Close
          Window = GetGadgetState(#GADGET_MDI)
          If Window <> -1          
            CloseWindow(Window)
          
            SelectMDIWindow(Window)
            FreeImage(MDIWindow()\Image)
            DeleteElement(MDIWindow())
          EndIf
        
        Case #MENU_CloseAll
                            
          ForEach MDIWindow()
            CloseWindow(MDIWindow()\Window)
            FreeImage(MDIWindow()\Image)  
          Next
          ClearList(MDIWindow())
        
        Case #MENU_Quit
          Quit = 1     
  
        Case #MENU_TileV
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileVertically)
          
        Case #MENU_TileH
          SetGadgetState(#GADGET_MDI, #PB_MDI_TileHorizontally)
                
        Case #MENU_Cascade
          SetGadgetState(#GADGET_MDI, #PB_MDI_Cascade)
        
        Case #MENU_Arrange
          SetGadgetState(#GADGET_MDI, #PB_MDI_Arrange)
        
        Case #MENU_Previous
          SetGadgetState(#GADGET_MDI, #PB_MDI_Previous)
        
        Case #MENU_Next
          SetGadgetState(#GADGET_MDI, #PB_MDI_Next)
        
      EndSelect
      
      
    ElseIf Event = #PB_Event_SizeWindow
      
      Window = EventWindow()
      
      If SelectMDIWindow(Window)
        ResizeGadget(MDIWindow()\ScrollAreaGadget, 0, 0, WindowWidth(Window), WindowHeight(Window))
      EndIf
              
    EndIf
    
  Until Quit = 1  
EndIf

Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Beitrag von scholly »

Vielleicht solltest Du irgendwo erwähnen, welche PB-Version.
Bei mir wird CreateImageMenu() angemeckert.
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

scholly hat geschrieben:Vielleicht solltest Du irgendwo erwähnen, welche PB-Version.
Bei mir wird CreateImageMenu() angemeckert.
hm... ich Rate mal... v4.20b2. Vorher gab es CreateImageMenu nicht.

Habe das gleiche verhalten bei mir. Ist Wohl ein Bug.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
PBFetischist
Beiträge: 55
Registriert: 26.10.2004 19:42

Beitrag von PBFetischist »

Sorry, natürlich PB 4.20 B2.

Ich trags mal in meine Signatur ein.
PBFetischist
Beiträge: 55
Registriert: 26.10.2004 19:42

Beitrag von PBFetischist »

Ich habe die Beta 4 installiert und jetzt knallt es richtig.

Wenn ein MDI Fenster geöffnet wird und ihr danach auf das Menü 'Windows' geht, scheppert es mit dem Hinweis 'Invalid memory access'.

Trotzdem geil, daß man jetzt den Einheits Gradienten ausstellen kann, bei CreateImagemenu. Noch besser wäre es, wenn ich den in der Farbe ändern könnte, das gehört aber nicht in dieses Forum.

Ich warte dann mal auf Beta 5...
PB 4.30 auf Windows Vista / XP SP2 und Linux
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
PBFetischist
Beiträge: 55
Registriert: 26.10.2004 19:42

Beitrag von PBFetischist »

Verstehe ich nicht. Bei mir geht das nicht. Läuft der Code von oben jetzt bei dir, MK ?
PB 4.30 auf Windows Vista / XP SP2 und Linux
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ist noch nicht in der aktuellen Beta. Kam erst heute von Fred.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten