Scrolled windows are used to create a scrollable area with another widget inside it. You may insert any type of widget into a scrolled window, and it will be accessible regardless of the size by using the scrollbars.
The function GBin.scrolled_window is used to create a new scrolled window.
val GBin.scrolled_window :
?hadjustment:GData.adjustment ->
?vadjustment:GData.adjustment ->
?hpolicy:Gtk.Tags.policy_type ->
?vpolicy:Gtk.Tags.policy_type ->
?placement:Gtk.Tags.corner_type ->
?shadow_type:Gtk.Tags.shadow_type ->
?border_width:int ->
?width:int ->
?height:int ->
?packing:(GObj.widget -> unit) ->
?show:bool -> unit -> scrolled_window
Where the argument hadjustment is the adjustment for the horizontal direction, and vadjustment, the adjustment for the vertical direction. These are almost always not given.
method set_hpolicy : Gtk.Tags.policy_type -> unit
method set_vpolicy : Gtk.Tags.policy_type -> unit
This sets the policy to be used with respect to the scrollbars. The set_hpolicy sets the policy for the horizontal scrollbar, and the set_vpolicy for the vertical scrollbar.
The policy may be one of `AUTOMATIC or `ALWAYS. `AUTOMATIC will automatically decide whether you need scrollbars, whereas `ALWAYS will always leave the scrollbars there.
You can then place your object into the scrolled window using the following function.
method add_with_viewport : GObj.widget -> unit
Here is a simple example that packs a table with 100 toggle buttons into a scrolled window. I’ve only commented on the parts that may be new to you.
(* file: scrolledwin.ml *)
let main () =
(* Create a new dialog window for the scrolled window to be
* packed into. *)
let window = GWindow.dialog ~title:"ScrolledWindow example" ~width:300 ~height:300 ~border_width:0 () in
window#connect#destroy ~callback:GMain.Main.quit;
(* Create a new scrolled window *)
let scrolled_window = GBin.scrolled_window ~border_width:10
~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:window#vbox#add () in
(* Create a table of 10 by 10 squares.
* Set the spacing to 10 on x and 10 on y *)
let table = GPack.table ~rows:10 ~columns:10 ~row_spacings:10 ~col_spacings:10
~packing:scrolled_window#add_with_viewport () in
for i = 0 to 10 do
for j=0 to 10 do
GButton.toggle_button
~label:("button ("^ string_of_int i ^","^ string_of_int j ^")\n")
~packing:(table#attach ~left:i ~top:j ~expand:`BOTH) ()
done
done;
(* Add a "close" button to the bottom of the dialog *)
let button = GButton.button ~label:"close" ~packing:window#action_area#add () in
button#connect#clicked ~callback:(window#destroy);
(* This grabs this button to be the default button. Simply hitting
* the "Enter" key will cause this button to activate. *)
button#grab_default ();
window#show ();
GMain.Main.main ()
let _ = Printexc.print main ()
Try playing with resizing the window. You’ll notice how the scrollbars react. You may also wish to use the #misc#set_size_request method call to set the default size of the window or other widgets.