Takes a bit of getting used to but here's the deal with styles.
In most cases Object.Style only accepts a pointer to a corisponding Style object or can be left blank. So for a Button, it must be a path to an object of type ButtonStyle or it can be left blank. You can't give Object.Style a pointer to an ImageFrame.
Object.RStyleDefault and the RStyle... variations accept pointers to RectangleStyles. Each of the various RStyles corrispond to the various button states and override any enherited from a ButtonStyle reference. So you've got a Default state (button enabled but not pressed), Active state (enabled and pressed), etc.
So you may be asking, what's the diff between a RectangleStyle and a ButtonStyle...
A RectangleStyle defines how a rectangle should be drawn at varying sizes. You give it up to 5 rows and 3 columns of imageStyles and set how those images shrink/stretch and tile to fill the space. They're the universal image filler.
A ButtonStyle uses multiple RectangleStyles along with font settings to define what a button looks like in its various states. When the mouse is over the button, it shows one image frame and text format, when the button is pressed in shows another combination.
One last element to toss into the mix...
ImageFrames are the most basic graphic resource. With them you select a source image file and define the coordinates of an image slice. The thing is that's prety much all an ImageFrame does. There's a reason for this. In some cases you'll want to use the same image slice but have it shrink and stretch differently, or have a different color tint. And that's what ImageStyles are for, applying different behaviors to the same source image
Button
|_ButtonStyle
. |_RectangleStyle
. . |_ImageStyle
. . . |_ImageFrame