For Windows, this question is quickly answered: HWND. Pretty much everything is of this basic “window”-type and most API commands that deal with windows can be used on most GUI objects. You can also find many code examples on the forums that deal with a lot of common API tasks. The situation is different for Linux and OSX. Here, different Gadgets may have different underlying objects and so it is not entirely clear what functions can be used. There are also a lot less examples around for these systems. Of course when developing programs that run on multiple OS, you will need solutions for all of them.
To help this situation a bit, i have compiled a list of what are the underlying objects behind the PB gadgets and other GUI objects. You can get access to these using functions such as GadgetID(), WindowID(), etc.
Disclaimer:
This information is internal stuff. While many of these things haven’t changed in many years, it is still possible that we decide to change something in the future. Also some Gadgets are heavily modified for PB with custom subclasses or callbacks which also may change in the future and break your code. So as usual: Feel free to use this information, but if it breaks, its not our problem.
So here it goes:
Windows | Linux | OSX | |
WindowID() | HWND | GtkWindow | WindowRef |
MenuID() | HMENU | GtkMenuBar / GtkMenu | MenuRef |
StatusBarID() | HWND | GtkHBox | ControlRef (UserPane) |
ToolBarID() | HWND | GtkToolbar | HIToolbarRef |
FontID() | HFONT | PangoFontDescription | PB internal pointer |
ImageID() | HBITMAP | GdkPixbuf | CGImageRef |
GadgetID() | HWND | GtkWidget | ControlRef |
ButtonGadget | “Button” | GtkButton / GtkToggleButton | PushButton / BevelButton |
ButtonImageGadget | “Button” | GtkButton / GtkToggleButton | PushButton / BevekButton |
CalendarGadget | “SysMonthCal32” | GtkCalendar | HIView |
CheckBoxGadget | “Button” | GtkCheckButton | CheckBox |
ComboBoxGadget | “ComboBox” / WC_COMBOBOXEX | GtkComboBox / GtkComboBoxEntry | PopupButton / HIComboBox |
ContainerGadget | custom class | GtkFixed | UserPane |
DateGadget | DATETIMEPICK_CLASS | GtkEntry | UserPane |
EditorGadget | RICHEDIT_CLASS | GtkTextView | UserPane (rendering a TNXObject) |
ExplorerComboGadget | WC_COMBOBOXEX | GekComboBoxEntry | HIComboBox |
ExplorerListGadget | WC_LISTVIEW | GtkTreeView | DataBrowser |
ExplorerTreeGadget | WC_TREEVIEW | GtkTreeView | DataBrowser |
Frame3DGadget | “Button” / “Static” | GtkFrame | GroupBox / UserPane / Separator |
HyperLinkGadget | “Static” | GtkButton | UserPane |
IPAddressGadget | WC_IPADDRESS | GtkEntry | EditUnicodeText |
ImageGadget | “Static” | GtkImage | UserPane |
ListIconGadget | WC_LISTVIEW | GtkTreeView | DataBrowser |
ListIconGadget | “ListBox” | GtkTreeView | DataBrowser |
MDIGadget | “MDICLIENT” | – | – |
OptionGadget | “Button” | GtkRadioButton | RadioButton |
PanelGadget | “SysTabControl32” | GtkNotebook | Tabs |
ProgressBarGadget | PROGRESS_CLASS | GtkProgressBar | ProgressBar |
ScrollAreaGadget | custom class | GtkScrolledWindow | UserPane |
ScrollBarGadget | “SCROLLBAR” | GtkVScrollBar / GtkHScrollBar | ScrollBar |
ShortcutGadget | HOTKEY_CLASS | GtkEntry | EditUnicodeText |
SpinGadget | UPDOWN_CLASS + “Edit” | GtkHBox containing others | UserPane containing others |
SplitterGadget | custom class | GtkVPaned / GtkHPaned | UserPane |
StringGadget | “Edit” | GtkEntry | EditUnicodeText |
TextGadget | “Static” | GtkLabel | StaticText |
TrackBarGadget | TRACKBAR_CLASS | GtkVScale / GtkHScale | Slider |
TreeGadget | WC_TREEVIEW | GtkTreeView | DataBrowser |
WebGadget | custom class + ActiveX control | GtkMozEmbed | HIWebView |
Notes:
- Gadgets all have the same basic type noted in the GadgetID() row. However, Gadgets are devided into “window classes” on Windows, or subclasses of the general GtkWidget on Linux.
- For Gadgets on Windows: If the entry is noted in “” then this is the class name, if it is not then this is the symbolic constant for the class name. You’ll have to look up the text value in the appropriate header files.
- On OSX, there are no classes for the controls, its all a ControlRef. The names i noted here are derived from the control creation functions (ie CreateTabsControl()). If you are looking for information, you should start there.
- Gadgets may have multiple classes depending on the flags on creation.
- On Linux, many gadgets are placed inside their own container to add a frame or catch events. (GtkFrame, GtkEventBox). The GadgetID() command returns the real gadget in this case, not the container.
- On OSX, the UserPane controls are drawn by PB itself, so you don’t have much ways to modify them other than the PB commands.
Thats it. I hope this information is useful to some people, and hopefully we will see some more cross-platform API examples on the forum in the future 🙂