En testant un code avec des MDi, j'ai voulu utiliser un splittergadget, et paf, ça ne marchait pas (la doc le disait a noté Mesa).
Voici donc un petit code qui permet d'avoir une sorte de splittergadget avec MDI (et on garde toutes les fonctions du MDI).
Merci Fred pour les remarques qui m'ont permis d'améliorer et de changer le code
New code (basé sur MDI image viewer des exemples purebasic) :
Code : Tout sélectionner
; PureBasic - MDI example file
; (c) 2004 - Fantaisie Software
; modification : blendman 08/2013 // ajout du "faux splitter (canvas)
; pb : 5.20b
;{ structure
Structure MDIWindow
; info about the loaded image
Image.i
ImageWidth.l
ImageHeight.l
; Our MDI Window
Window.i
; gadget numbers
ScrollAreaGadget.i
ImageGadget.i
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)
;{ menu & toolbar
If CreateMenu(#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
;}
;{ gadgets
h = WindowHeight(0)-ToolBarHeight(#TOOLBAR)
y = ToolBarHeight(#TOOLBAR)
panel = TreeGadget(#PB_Any,0,y,142,h)
AddGadgetItem(panel,0,"Truc")
canvas = CanvasGadget(#PB_Any, 143,y,6,h)
MDIGadget(#GADGET_MDI, 150, y, WindowWidth(0)-150, h, 1, #MENU_FirstMDI)
;}
Quit = 0
;{ loop
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case canvas
Select EventType()
Case #PB_EventType_MouseEnter
SetGadgetAttribute(canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
Case #PB_EventType_MouseLeave
SetGadgetAttribute(canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
Case #PB_EventType_LeftButtonDown
bougeCanvas = 1
Case #PB_EventType_LeftButtonUp
bougeCanvas =0
HideGadget(#GADGET_MDI,1)
HideGadget(#GADGET_MDI,0)
Case #PB_EventType_MouseMove
If bougeCanvas
ResizeGadget(canvas,WindowMouseX(0),#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(panel,0,#PB_Ignore,GadgetX(canvas)-1,#PB_Ignore)
ResizeGadget(#GADGET_MDI,GadgetX(canvas)+GadgetWidth(canvas)+1,#PB_Ignore, WindowWidth(0)-(GadgetX(canvas)+GadgetWidth(canvas)+1), #PB_Ignore)
EndIf
EndSelect
EndSelect
Case #PB_Event_CloseWindow
Select Window
Case #WINDOW ; Out main window is closed, just quit
Quit = 1
Default ; 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
EndSelect
Case #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$)
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
Case #PB_Event_SizeWindow
h= WindowHeight(0)-50
ResizeGadget(canvas,#PB_Ignore,ToolBarHeight(#TOOLBAR),#PB_Ignore,h)
ResizeGadget(panel,0,ToolBarHeight(#TOOLBAR),GadgetX(canvas)-1,h)
ResizeGadget(#GADGET_MDI,GadgetX(canvas)+GadgetWidth(canvas)+1, ToolBarHeight(#TOOLBAR), WindowWidth(0)-(GadgetX(canvas)+GadgetWidth(canvas)+1), h)
If SelectMDIWindow(Window)
ResizeGadget(MDIWindow()\ScrollAreaGadget, 0, 0, WindowWidth(Window), WindowHeight(Window))
EndIf
EndSelect
Until Quit = 1
EndIf
;}