Check3State Control
The check3state control provides a way to indicate a selection of a single item, including the option to gray out the selection to indicate "indeterminate". Also, using the %bs_pushlike style& enables creation of a button-like control which simulates staying in a pressed condition.

Arguments
The Control Add statement is used to create all new controls. Here are the statement's arguments and any special significance to the check3state control.

Check3State-Specific PowerBASIC Statements
Although PowerBASIC provides control-specific statements for some controls (Treeview, Imagelist, ...), there are no CHECK3STATE PowerBASIC statements.

Messages, Notifications, Styles, and ExtSstyles
There are four types of named constants in the following table. All are pulled from the MSDN web site.

The first column contains control-specific named constants and the second column contains generic window named constants (check3state controls are windows).

Since the PowerBASIC check3state control is derived from the Windows button class, the first column contains MSDN button control constants.

Also, if the PowerBASIC Help file has an entry on the value, it is highlighted in yellow. If the value was noted in PowerBASIC Help as a default value, it is also shown in bold text.

In the values for notifications, descriptions starting with -n and -c refer to events received through the %wm_notify and %wm_command messages. By default, PowerBASIC controls can receive both of these messages.

   

And here is a short description of many of the named constants corresponding to notifications, styles, and extstyle - particularly those discussed in the PowerBASIC Help topics.

    bcn_dropdown          -n click on drop down arrow on control
    bcn_hotitemchange     -n mouse enters/leaves client area
    bn_clicked            -c mouse click
    bn_dblclk             -c mouse doubleclick
    bn_disable            -c (n/a - win3.0 only)
    bn_doubleclicked      -n mouse doubleclick
    bn_hilite             -c (n/a - win3.0 only)
    bn_killfocus          -c focus is lost
    bn_paint              -c control should be painted
    bn_pushed             -c (n/a - win3.0 only)
    bn_setfocus           -n focus is received
    bn_unhilite           -c when highlight should be removed 
    bn_unpushed           -c (n/a - win3.0 only)
    bs_bottom             - text at bottom
    bs_center             - center text horizontally
    bs_default            - heavy black border, ENTER selects, 1 per dialog
    bs_defpushbutton      - same as bs_default
    bs_left               - text on left side
    bs_multiline          - wrap text
    bs_notify             - allows bn_killfocus/bn_setfocus messages
    bs_pushlike           - toggle between raised/sunken
    bs_right              - text on right side
    bs_top                - text at top
    bs_vcenter            - center text vertically
    nm_customdraw         -n custom draw operation
    wm_ctlcolorbtn        - before drawing owner-drawn control
    ws_border             - use thin line border
    ws_disabled           - initially disabled (no user input)
    ws_ex_left            - generic left-aligned properties
    ws_ex_right           - generic right-aligned properties
    ws_ex_transparent     - draw controls/windows beneath control first
    ws_group              - starts/ends group. use ws_tabstop style.
    ws_tabstop            - allows receipt of keyboard focus

Callback Function
A control can have its own callback function, or use the parent dialog callback function.

A control callback function should return TRUE to indicate it has processed the message. This prevents unnecessarily calling the dialog callback function, which will process the message if no control callback function is available, or if the control callback function returns FALSE.

By default, both %WM_COMMAND and %WM_NOTIFY messages are received. However, if the #MESSAGE COMMAND compiler directive is invoked, the %WM_NOTIFY messages will not be available.

In addition, %bs_notify must be included in style& to receive the %bn_killfocus and %bn_setfocus messages

Here's a sample check3state control callback function.

   CallBack Function cbCheck3State()
      Select Case CB.MSG
         Case %WM_COMMAND
            Select Case CB.CTL
               Case %MyControl_ID   'whatever ID was assigned
                  Select Case CB.CTLMSG
                     Case %bn_clicked
                     Case %bn_disable
                     Case %bn_killfocus
                     Case %bn_setfocus
                  End Select
               End Select
      End Select
   End Function

In each Case section, add the statements the application needs to respond to the event. Also, be sure to add "Function=1" as appropriate to indicate that the event was handled by the callback function.

CONTROL Statement Syntax
The following table lists the various Control statements (except the ADD statements). Most, but not all, can be used with the check3state control. A one-line description of the statement and then its syntax are presented.

If you have any suggestions or corrections, please let me know.