1. What control objects are available to a Windows program?
Control Objects are used in Windows programs for interacting with the program's user. Control Objects include push buttons, entry fields for typing text,
scrollbars, and many more. This screenshot shows different types of control object:

You create a program using control objects as follows:
- Start the Ubercode Developer Environment.
- Use the File - New - Program menu command.
- In the New Program dialog box, make sure the program type is set to 1 - Main Window and click OK.
- The Developer Environment will automatically create a new program. A blank window will be shown near the center of the screen, and a toolbox is also shown
to the left of the blank window. If the toolbox is not visible, use the View - Visual Object Toolbox menu command to make it visible.
- The blank window with the grid pattern is where you design the dialog and choose the control objects. The blank window is called the Dialog
Editor.
- You can now add control objects to the dialog. Click the control object with the mouse and it will be placed in the dialog. You can move the controls by
clicking and dragging them, and you can re-size them by clicking the corner or the edge and moving the mouse.
- To run the program, click the Run button in the Developer Environment's toolbar.
After making a dialog with control objects, you can hook up the controls to their code. To see the code, go back to the dialog editor and double-click
anywhere in the dialog. This takes you to the code that handles the events in the dialog. Refer to How
do I make control objects run code for more details.
2. How do I make control objects run code?
Control objects can have event handling code which is code that runs when the control is used. For example push buttons trigger the command event
when they are clicked, so to make the push button run some code you go to the command event handler, add code to detect the particular push button, and then
add the code you want to run.
The quickest way to find the event handler is to bring up the dialog editor, double-click on it and the code editor will show the code for all the controls
in the dialog.
3. How do I enable or disable a group of controls at run time?
Use the ControlArray method to apply an action to a group of controls of the same type. You need to know the first control object in the group - this
information is available when designing the dialog. At run time set up a loop through all the control objects in the array. Apply the action to each control in
the loop by calling methods or properties on each control.
The following example loops through one or more label objects. It gets the caption text of each label object and converts it to upper case:
for i from Lbound(me.Label1) to Ubound(me.Label1)
text <- GetCaption(ControlArray(me.Label1,i))
call SetCaption(ControlArray(me.Label1,i), Strupper(text))
end for
This technique is very versatile. It can be used to hide or make visible an array of controls, to copy information or get information from an array of
controls, or to move controls, or to set checkboxes on or off, or to move controls. All the normal properties and methods are available to a control array. The
only limit is the controls must be the same type, as this is the definition of a control array.
4. How do I make a multiline push button?
The standard Windows push button object only allows one line of text, thus you have to use a Bitmapbutton object instead, and make a bitmap with the
text. Use the Microsoft Paint program (or any equivalent bitmap editor) to make a bitmap with the desired text. Then add a Bitmapbutton object and use
the newly created bitmap file as the button's picture property.
5. How do I set and test radio buttons?
Each radio button has a read/write Value property. Set a radio button's value to 1 to set it, which automatically clears other radio buttons in the
same group. Set a radio button's value to 0 to clear it. To see whether a button is pressed read the Value property. You can also use the Controlarray
and Controlselection methods to easily find the selected radio button in a group.
6. How do I set up a timer?
Timers are controls hosted by a window, and while active they repeatedly send Timer events to the window's event handler. A timer can be created by hosting
any static control in a window (for example a label or an icon), calling SetTimer to start the timer and KillTimer to end the timer. While the
timer is active, it triggers the Timer_Event. The next example creates a timer that counts seconds:

Here is the code for the example:
// time2.rc
// (needs "clock.ico" in the program's main folder)
#define btnStart 101
#define btnStop 102
#define btnClose 103
#define ID_TIMER 104
#define lblSeconds 105
Main_ID_TIMER ICON "clock.ico"
Main DIALOG 274,135,229,105
CAPTION "Timer Example"
FONT 8,"Microsoft Sans Serif"
STYLE WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_CENTER|DS_MODALFRAME
BEGIN
ICON "Main_ID_TIMER",ID_TIMER,5,5,21,20
DEFPUSHBUTTON "Start Timer",btnStart,13,81,60,15
PUSHBUTTON "Stop Timer",btnStop,85,81,60,15
PUSHBUTTON "Close",btnClose,157,81,60,15
LTEXT "",lblSeconds,160,8,56,12,WS_BORDER|NOT WS_VISIBLE
END
// time2.cls
Ubercode 1 class Time2
public callback function main(in EventId:integer
ControlObj:control
Key:integer
out Cancel:boolean)
var
fOK : boolean
iOK : integer(0:MAXINT)
iSeconds : integer(0:MAXINT)
code
select EventId
case LOAD_EVENT =>
// Set the font and colors used later on by Drawtext.
// Note: if the font "OCR A Extended" is not installed, Windows defaults to "Arial".
call Appicon("clock.ico")
call SetFontName(Me, "OCR A Extended")
call SetFontSize(Me, 48)
call SetForecolour(Me, Rgb(0, 192, 0))
call SetBackcolour(Me, GetSysColor(COLOR_BTNFACE))
case COMMAND_EVENT =>
if ControlObj = Me.btnStart then
// Start button - Start the timer, blank out the old number and draw a "0".
iOK <- SetTimer(Me, Me.ID_TIMER, 1000)
call SetCaption(Me.lblSeconds, "0")
call Drawshape(Me, SHAPE_RECTANGLE, BORDER_NONE,
GetPagewidth(Me) div 4, GetPageheight(Me) div 4,
3*GetPagewidth(Me) div 4, 3*GetPageheight(Me) div 4)
call Drawtext(Me, "0", 0, 0, GetPagewidth(Me),
Int(GetPageheight(Me)*0.8), DRAW_CENTRE)
elseif ControlObj = Me.btnStop then
// Stop button - Kill the timer.
fOK <- KillTimer(Me, Me.ID_TIMER)
elseif ControlObj = Me.btnClose then
// Close button - Unload the window.
call Unload(me)
end if
case TIMER_EVENT =>
// Update the number of seconds and redraw the number.
// call Sound(440, 0.1) // Enable for annoying beep!
iSeconds <- StrToInt(GetCaption(me.lblSeconds)) + 1
call SetCaption(Me.lblSeconds, Str(iSeconds))
call Drawshape(Me, SHAPE_RECTANGLE, BORDER_NONE,
GetPagewidth(Me) div 4, GetPageheight(Me) div 4,
3*GetPagewidth(Me) div 4, 3*GetPageheight(Me) div 4)
call Drawtext(Me, Str(iSeconds), 0, 0, GetPagewidth(Me),
Int(GetPageheight(Me)*0.8), DRAW_CENTRE)
case UNLOAD_EVENT =>
// Unload() was called, or the Closebox button was clicked,
// or Alt+F4 was pressed. When the window unloads, delete the timer.
fOK <- KillTimer(Me, Me.ID_TIMER)
end select
end function
end class
To make the example work, copy it to the clipboard, go into the Ubercode Developer Environment and use Edit - Paste. The Developer Environment prompts you
to save the files, then you can run the example.
7. How much text can fit in a Label object?
The limit is determined by Windows using the MAX_CAPTION constant (255 characters). Also note the text in the label will wrap downwards through the
control by default, so if the label object is too small some of the text may wrap onto a second line which may not be visible. To fix this, either make the
label object bigger, or set the Alignment property to 3 (LeftNoWordWrap) to suppress this behaviour.
If you need to display more text than this, use an Edit object which allows an unlimited amount of text, up to the maximum size of a memory block.
You can protect the text in the Edit object from being edited by setting its Disabled property equal to True.
8. Can the individual controls in a dialog have different fonts and colours?
The Font properties apply to the entire dialog, not to the individual control objects. This is because the Font properties are stored in a Windows resource
file (RC file), and this file format uses a single font which applies to the whole dialog. This means all controls in the dialog share the same font, which has
the advantage that if you use the Windows control panel to change the default font and color scheme on your computer, the dialog is re-drawn using the new
scheme.
For example the following code tries to set the font of a control object, however the code will not work:
case LOAD_EVENT =>
call SetFontname(me.Label1, "Arial")
call SetFontbold(me.Label1, True)
...
The code does not work because individual label objects lack a Fontname or Fontbold property, therefore a compiler error occurs when you call
SetFontname using a control object. Instead SetFontname requires a Window or Printer object.
If you want different fonts and colours in a dialog (and are prepared for your dialogs to ignore colour and font changes made from the Windows control
panel), then use the graphics methods to draw the extra text. The example What are control objects and
how do I use them? shows how to display text in a different font.
|