How to update window contents while resizing?

Just starting out? Need help? Post your questions and find answers here.
coco2
Enthusiast
Enthusiast
Posts: 368
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

How to update window contents while resizing?

Post by coco2 »

I know CreateDialog() will do it, but that's not quite what I want. I want to resize and change the contents of a canvas while resizing the window, cross platform. Any way it can be done? :?:
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Re: How to update window contents while resizing?

Post by srod »

Use BindEvent() on your main window to get live resize events and in your event handler resize the canvas using ResizeGadget() etc. You can either repaint the canvas after resizing or bind a gadget event of type #PB_EventType_Resize to the canvas and repaint in this event handler (PB 5.62 onwards).

Code: Select all

BindEvent(#PB_Event_SizeWindow, @winSize(), #Window)
I may look like a mule, but I'm not a complete ass.
coco2
Enthusiast
Enthusiast
Posts: 368
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

Re: How to update window contents while resizing?

Post by coco2 »

Thanks srod that seems to be what I need, but now I have a problem, how do I get the parameters into the bound event?

Code: Select all

Procedure ResizeAppWindow()
  Debug "Resizing window, width: " + WindowWidth(0) + " height: " + WindowHeight(0)
EndProcedure

Define Quit.i

Quit = 0

OpenWindow(0, 0, 0, 640, 480, "Resize Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
BindEvent(#PB_Event_SizeWindow, @ResizeAppWindow(), 0)

Repeat
  Select WaitWindowEvent()
    Case  #PB_Event_CloseWindow
      Quit = 1
  EndSelect
Until Quit
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Re: How to update window contents while resizing?

Post by srod »

Which parameters? I think you've asked this before with live scrolling events? You can pass any info you want in the same ways as before; e.g. a combination of SetGadgetData()/GetGadgetData() and pointers etc. Easy enough.

viewtopic.php?f=13&t=70069
I may look like a mule, but I'm not a complete ass.
coco2
Enthusiast
Enthusiast
Posts: 368
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

Re: How to update window contents while resizing?

Post by coco2 »

Since it's resizing the window it'll probably need just about all the variables. I have them set up in a hierarchy with a pointer to the whole lot. I'm not sure if that's recommended way of doing it, but someone said it was fine to do it that way. I see what you are saying, I can just pick a gadget and set a pointer as the data. Thanks I'll have a play around with it.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4636
Joined: Sun Apr 12, 2009 6:27 am

Re: How to update window contents while resizing?

Post by RASHAD »

Hi srod
Hi coco2
Maybe that is what you want

Code: Select all

Procedure sizeCB()
  ww = WindowWidth(0)-20 : hh = WindowHeight(0)-20
  ResizeGadget(0,10,10,ww,hh)
  StartDrawing(CanvasOutput(0))
    DrawImage(ImageID(10),0, 0, OutputWidth(),OutputHeight())
  StopDrawing()
EndProcedure
  
  If OpenWindow(0, 0, 0, 420, 420, "Canvas container example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_SizeGadget)
  
    CanvasGadget(0, 10, 10, 400, 400, #PB_Canvas_Container)
    ButtonGadget(1, 10, 10, 80, 30, "Clean up")
    CloseGadgetList()
    BindEvent(#PB_Event_SizeWindow,@sizeCB())
    Repeat
      Event = WaitWindowEvent()
    
      If Event = #PB_Event_Gadget
        Select EventGadget() 
          Case 0
            If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
              If StartDrawing(CanvasOutput(0))
                x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
                GrabDrawingImage(10,0,0,OutputWidth(),OutputHeight())
                StopDrawing()
              EndIf
            EndIf
          
          Case 1
            If IsImage(10)
              SaveImage(10,GetHomeDirectory()+"CanvasTest.bmp")
            EndIf
            If StartDrawing(CanvasOutput(0))
              Box(0, 0, OutputWidth(),OutputHeight(), $FFFFFF)
              GrabDrawingImage(10,0,0,OutputWidth(),OutputHeight())
              StopDrawing()
            EndIf
        EndSelect
      EndIf
    
    Until Event = #PB_Event_CloseWindow
  EndIf
Last edited by RASHAD on Sat Dec 08, 2018 2:45 pm, edited 1 time in total.
Egypt my love
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Re: How to update window contents while resizing?

Post by srod »

Well, how you wrap up and arrange your program's internal data is down to the way you have designed your program's data structures etc. It is always the first thing I consider when designing any program, but I don't want to get into a lecture on data structures - or anything else for that matter! :)

When you have your data structures sorted out then everything else normally slots into place. In your case, if your window resizing routine needs access to all child gadgets and their sizes and so on then, well, this would normally be very straight forward. Any sensible app will be structured so that it can easily identify which gadgets belong to which window and so on. If this is not the case then rethink the way you organise your gadgets! :)

Incidentally, you can use EventWindow() in your window event proc to determine which window the underyling event pertains to in the case that one such procedure is servicing multiple windows etc. From here, once you have the relevant window#, consult your relevant data structures before proceeding.
I may look like a mule, but I'm not a complete ass.
coco2
Enthusiast
Enthusiast
Posts: 368
Joined: Mon Nov 25, 2013 5:38 am
Location: Australia

Re: How to update window contents while resizing?

Post by coco2 »

Thanks for the code rashad, I'll have a look.

srod some procedures like the event handler need to access almost all the variables in the application so I pass a pointer to the entire set of variables. It is basically an extension of the main loop so it needs all the variables. As the procedures go deeper I pass only the parameters needed to complete that function. Is this how you do it?
srod
PureBasic Expert
PureBasic Expert
Posts: 10589
Joined: Wed Oct 29, 2003 4:35 pm
Location: Beyond the pale...

Re: How to update window contents while resizing?

Post by srod »

Well, I usually wrap things up in basic classes via interfaces and associated 'class' template structures so I am only passing around those 'objects' which are required for any given situation. Just my personal preference as it allows me to keep on top of things no matter how complex things get. :) This way I minimize the number of separate non-temporary variables I have floating about needing to keep track of. If you are passing a single pointer to your variable set about then it sounds like you are doing something similar.
I may look like a mule, but I'm not a complete ass.
Post Reply