rcoll
Almost regular
 
Posts: 127
|
 |
« on: February 04, 2010, 02:34:27 pm » |
|
I think this is the right place to put this ... I was in dire need of a button very much like the Delphi TSpeedButton. All of the usual suspects (wxButton, wxToggleButton, wxCustomButton, etc) were deficient in some way. So, I made my own; I thought somebody else might possibly need it, so here it is. In short, wxSpeedButton is a toggle button that can display an image and a text label. It will allow an image for the UP position, the DOWN position, and for a disabled button. In addition, the wxSpeedButton may be set up in "groups", such that when one button in a group goes down, another button will go UP. It also fires separate events if the button is clicked with the left mouse button or the right mouse button. The attached files contain a build directory (and a bunch of XPM image files I've gathered from various places). The build directory contains three projects: 1) the build project to create the wxSpeedButton library, 2) a project to build the wxSmith plugin (so it can be easily used in the GUI editor), and 3) a project to build a test program All needed files and instructions are included, but due to upload restrictions on this server no object or executable files are in there. To get the full set (source, object, executable, and plugins) compiled for MSW, you can download it from RapidShare (for free) at http://rapidshare.com/files/345785056/SpeedButton_compiled_MSW.zipThis component has only been tested under MSW, but there is no platform-specific code, so it should work on any platform. It was built using wxWidgets ver 2.8 and Code::Blocks ver 5866 (from svn). I give it freely, with no restrictions what-so-ever, but without guarantee. Use it how you want, change it how you want. Following is from the read-me file: ============= wxSpeedButton =============
------------------- General Description -------------------
wxSpeedButton is a toggle button, that acts similar to TSpeedButton used in the Delphi language.
wxSpeedButton displays both a text label and a bitmap, and is capable of acting as a simple (generic) push-button, a toggle-button, or a grouped toggle button. (In a grouped toggle button, only one button may be "down" at one time; when a button is pressed down, the previous "down" button goes "up"). When acting as a grouped toggle button, the buttons may be grouped by their parent (for example, all wxSpeedButton's on a panel), or by an index number. This grouping (by index number) allows wxToggleButton's to be placed anywhere on a form (or dialog), and still used as a single group of buttons. And, of course, multiple groups may be defined simply by giving them different group index numbers.
When defining a bitmap image (or "glyph") for a wxToggleButton, use an image that may contain multiple sub-images. (This is similar to the Delphi method of putting the "active" image and the "disabled" image into the same file). The button image may contain 1, 2, or 3 sub-images. (It may, in fact, contain more sub-images, but only the first 3 will be used).
If the image contains only a single image, then that image will be used for the button "up" and "down" states, and an internally-generated grey-scale image will be used for the "disabled" button. If the image contains two sub-images, the first sub-image will be used for the "up" and "down" states, and the second sub-image will be used for the "disabled" button. If the image contains all three sub-images (or more) then the first sub-image is displayed on the button when in the "up" state; the second sub-image will be used when the button is in the "down" state, and the third sub-image will be used when the button is disabled.
When defined in this way, the images displayed on the button are drawn in a "transparent" manner. If the image contains a transparency mask, then it will be used; if not, then a transparency mask will be generated using the bottom-left pixel of the image to determine the transparent color (this is the same method used in Delphi). If, however, a seperate image is specified for a button state (using method calls SetGlyphUp() or SetGlyphDown()) then the transparency mask must be explicitly defined within the image itself.
The wxSpeedButton build directory has the following structure: SpeedButton\ bin\ // this dir contains the binary file output of the // Code::Blocks projects; files include "SpeedTest.exe", // "wxsSmithButton.dll", "wxsSmithButton.zip", and // "CopySmithButton.bat" images\ // a set of usefull XPM images for buttons include\ // the include file "wxSpeedButton.h" is here lib\ // the library "wxSpeedButton.a" is here obj\ // intermediate files for all compiles project\ // this is the Code::Bocks project to create the // wxSpeedButton library; it creates the file // "wxSpeedButton.a" and places the library file and // the include file in the proper directories src\ // source files for component wxSpeedButton test\ // this is the Code::Blocks project to create a test // program for wxSpeedButton; the output file // "SpeedTest.exe" is placed in the ..\bin\ directory wxsmith\ // used by Code::Blocks and wxSmith wxs\ // this is the Code::Blocks project to create the // plugin for Code::Blocks and wxSmith, to put the // component wxSpeedButton on the wxSmith palette. // the output files "wxsSmithButton.dll" and // and "wxsSmithButton.zip" are placed in the ..\bin\ // directory; they must be manually copied to the // plugin directory of your Code::Blocks installation. // see the batch file "CopySmithButton.bat" to // make this easier images\ // images used on the wxSmith palette src\ // source code for the property pages used by // wxSmith for the wxSpeedButton component
The Code::Blocks projects used here were created and tested under Windows XP, using Code::Blocks SVN version 5866, and wxWidgets version 2.8. The correct order to build these projects is:
1) Build the library (project found in the "project\" directory) 2) Build the wxSmith plugin (project found in the "wxs\" directory) 3) Exit Code::Blocks and install the plugins copy "bin\wxsSmithButton.dll" to "<Code::Blocks>\share\CodeBlocks\plugins" copy "bin\wxsSmithButton.zip" to "<Code::Blocks>\share\CodeBlocks" 4) Re-start Code::Blocks and build the test program (project found in the "test\" directory)
(For Windows XP, all of these projects and programs are already compiled; you only need to install the plugin files into your own Code::Blocks installation directory).
--------------------- Component Description ---------------------
The wxSpeedButton component is a completely new widget, written from scratch, and descended from wxControl. It uses wxNativeRenderer to draw the button face, giving it the same look and feel of the built-in wxButton, regardless of platform.
The members of the wxSpeedButton component are:
Constructors ------------
wxSpeedButton( wxWindow *inParent, // parent window wxWindowID inID, // id of this button const wxString &inLabel = _(""), // button text const wxBitmap &inGlyph = wxNullBitmap, // bitmaps displayed on button int inGlyphCount = 0, // number of images in inGlyph int inMargin = 2, // area around image and text int inGroupIndex = 0, // ident of a group of buttons bool inAllowAllUp = true, // allow all buttons up const wxPoint &inPos = wxDefaultPosition, // button position const wxSize &inSize = wxDefaultSize, // button size long inStyle = 0, // border styles const wxValidator &inVal = wxDefaultValidator, // validator const wxString &inName = _("SpeedButton")); // name of button
wxSpeedButton( wxWindow *inParent, // parent window wxWindowID inID, // id of this button const wxString &inLabel = _(""), // button text const wxString &inGlyphFile = _(""), // bitmaps displayed on button int inGlyphCount = 0, // number of images in inGlyph int inMargin = 2, // area around image and tex int inGroupIndex = 0, // ident of a group of buttons bool inAllowAllUp = true, // allow all buttons up const wxPoint &inPos = wxDefaultPosition, // button position const wxSize &inSize = wxDefaultSize, // button size long inStyle = 0, // border styles const wxValidator &inVal = wxDefaultValidator, // validator const wxString &inName = _("SpeedButton")); // name of button
Member Functions ----------------
void SetLabel(wxString &inLabel); wxString GetLabel(void); Use these functions to get or set the text-label drawn on the button face. void SetGlyphUp(wxBitmap &inBitmap); wxBitmap &GetGlyphUp(void); void SetGlyphDown(wxBitmap &inBitmap); wxBitmap &GetGlyphDown(void); void SetGlyphDisabled(wxBitmap &inBitmap); wxBitmap &GetGlyphDisabled(void); Use these functions to get or set the image drawn on the buton face, depending upon the state of the button (up, down, or disabled). Unlike the images defined in the button constructor, we do not automatically add in a transparency mask to these images. When setting an image using one of these functions, a transparancy mask must be explicitly defined within the image itself.
void SetAlign(int inAlign); int GetAlign(void); Get or set the image and text alignment; "inAlign" must be one of wxBU_LEFT, wxBU_RIGHT, wxBU_TOP, or wxBU_BOTTOM. The alignment is normally set as part of the Window "style" value, but these functions give you the option to get or set it dynamically.
void SetMargin(int inMargin); int GetMargin(void); The margin is the distance (in pixels) between the button edge and the image, and between the image and the label text. void SetGroupIndex(bool inIndex); int GetGroupIndex(void); Change the group index of a button, in effect moving the button to a different group. There are 3 special values used here: - A value of 0 makes the button a "simple" button; all you can do is click it, it always appears in the UP state; - A value of -1 makes the button a "toggle" button; it is not associated with any group of buttons, and each time you click it will change it's state from UP to DOWN to UP again. - A value of -2 places the button in a group defined by it's immediate parent. Buttons with a group index of -2 and residing on the same parent (for example, a wxPanel) act as a single group, where only one button can be set DOWN at a time. - Any other integer value (positive or negative) will place those buttons with the same group index value into a group. Within a group, only one button may be DOWN at a time, although it is possible for them all to be UP at the same time (see "Allow All Up"). void SetDown(bool inDown); bool GetDown(void); void SetValue(bool inDown); bool GetValue(void); The "value" of a button is the same as it's DOWN state. These functions allow you to programatically get or set the DOWN state of a button. If you set a button DOWN, and it is part of a button group, then the button that is currently DOWN in that group will be set UP. void SetAllowAllUp(bool inAllUp); bool GetAllowAllUp(void); For a group of buttons, only one button is allowed to be DOWN at a time. If you set a button to be DOWN (either by clicking it or by calling SetDown()), then the previous DOWN button will be set to UP. However, you may choose to allow all buttons to be UP, or force one button to always be down. By setting "Allow All Up" to true, then all buttons in a group may be set to the UP state; if set to false, then the group must always have at least one button in the DOWN state. void SetUserData(long inData); long GetUserData(void); This is simply a convenience, and allows the user to associate any "long int" data with the button. On many platforms, a "long int" may also hold a pointer value (but this is completely platform dependant).
void DoClick(bool inLeft); Calling this function simulates a mouse-click event, for either the LEFT or RIGHT mouse button.
---------------------- Properties Description ----------------------
wxSpeedButton properties may be modified within the wxSmith GUI editor. These properties define the initial button declaration, layout, and function. After placing a button on your form (or panel, or whatever) and editing the items that show up in the property panel, you may see the actual generated code by viewing the *.cpp and *.h files associated with that GUI.
Thee are many properties that are common to all controls (for example, size or position). These "common" properties are not covered here, but only those items which are unique or special to wxSpeedButton.
The following properties may be defined with wxSmith:
Label type: wxString This is the text string that will appear on the button.
Glyph type; image This is the image that will appear on the button. The image selected may be one of the wxWidgets-provided images (from wxArtProvider) or from an external file. If from a file, the image may contain 1, 2, or 3 sub-images; a sub-image each for the button UP, DOWN or disabled.
If the image contains only a single image, then that image will be used for the button "up" and "down" states, and an internally-generated grey-scale image will be used for the "disabled" button. If the image contains two sub-images, the first sub-image will be used for the "up" and "down" states, and the second sub-image will be used for the "disabled" button. If the image contains all three sub-images (or more) then the first sub-image is displayed on the button when in the "up" state; the second sub-image will be used when the button is in the "down" state, and the third sub-image will be used when the button is disabled.
When defined in this way, the images displayed on the button are drawn in a "transparent" manner. If the image contains a transparency mask, then it will be used; if not, then a transparency mask will be generated using the bottom-left pixel of the image to determine the transparent color (this is the same method used in Delphi). If, however, a seperate image is specified for a button state (using method calls SetGlyphUp() or SetGlyphDown()) then the transparency mask must be explicitly defined within the image itself. GlyphCount type: integer When the Glyph is specified as a file, this value specifies the numbber of sub-images contained in that file (normally 1, 2, or 3). If this value is 0, then wxSpeedButton will attempt to determine the number of sub-images from the size of the dominant image, assuming that each sub-image is square-shaped (for example, 16 x 16, or 32 x 32). On those occasiions where the sub-images are not computed correctly, you can explicitly set the number of sub-images to extract here.
Use XPM As #include type: boolean If the Glyph is specified as a file, and that file is an XPM image, you have the option of loading the file at run-time or of including the file at compile-time (avoiding the problem of distributing image files with your application). Note that if the file is #included'd at compile-time, the name of the data within the XPM file must be unique. (The typical use is to name the data block inside the file similar to the name of the file; since XPM file are text files, naming the data block is trivial to do with any text editor).
Margin Space type: integer This is the distance (in pixels) to be used to separate the glyph from the text label.
Button DOWN type: boolean If TRUE, the button will start in the DOWN state, else it will start in the UP state.
Button Type type: multiple-choice This value will modify the group index value actully used in the declaration of the button. A button may be a "simple button", a "toggle button", a "group button by parent" or a "group button by index".
Group Index type: integer When the button type is "group button by index", this value specifies the group the button belongs to. Multiple button groups may be defined; within a group the button work together so that only one button may be DOWN at any time, but different groups all work independantly of each other.
Allow All Up type: boolean This is only used for a group button. Within a group, only one button may be DOWN at any time, and normally there must be one button down at all times. By setting this value TRUE, you may allow all buttons to be UP at the same time (although only still allow only one DOWN at any time).
User Data type: integer Anything you want. This is just a handy place to store extra data for that button.
Var Name type: identifier This is the name (within your program) of the button. By default, it is filled in automatically by wxSmith, but you can change it to something more descriptive of the button's function if you want.
Style type: property sub-panel This property is included by default on all window-based components, including buttons. However, some extra items have been included in this component: wxBU_LEFT, wxBU_RIGHT, wxBU_TOP, and wxBU_BOTTOM, which correspond to the type of image and label alignment to use. By default, the image and label are aligned to the left of the button.
Ringo
|