hackdctl.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 797 行 · 第 1/2 页

C
797
字号
                        ctl_combo_add_msg( dlg, elt->control ) , 0,
                                                    (DWORD)(LPSTR) value );
    }
    SendDlgItemMessage( dlg, elt->control, ctl_combo_sel_msg( dlg,
                                            elt->control ), choose, 0 );

    return( TRUE );
}

static BOOL ctl_combo_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/**********************************************************************************************/
/* finish a combo list box */
{
    inst = inst;

    _value_int( ptr, elt ) = elt->info.combo.origin +
            SendDlgItemMessage( dlg, elt->control,
                        ctl_combo_get_msg( dlg, elt->control ), 0, 0 );

    return( TRUE );
}

static BOOL ctl_combo_modified( ctl_elt *elt, UINT wparam, LONG lparam )
/**********************************************************************/
{
    WORD        id;
    WORD        cmd;

    lparam = lparam;
    id = LOWORD( wparam );
    cmd = GET_WM_COMMAND_CMD( wparam, lparam );
    if( id == elt->control &&
        ( cmd == CBN_SELCHANGE || cmd == LBN_SELCHANGE ) ) {
        return( TRUE );
    }

    return( FALSE );
}

static BOOL is_listbox( HWND dlg, int ctl )
/*****************************************/
{
    char                buf[100];

    GetClassName( GetDlgItem( dlg, ctl ), buf, 100 );
    if( 0 == stricmp( buf, "listbox" ) ) {
        return( TRUE );
    }

    return( FALSE );
}

static WORD ctl_combo_add_msg( HWND dlg, int ctl )
/************************************************/
{
    if( is_listbox( dlg, ctl ) ) {
        return( LB_ADDSTRING );
    } else {
        return( CB_ADDSTRING );
    }
}

static WORD ctl_combo_sel_msg( HWND dlg, int ctl )
/************************************************/
{
    if( is_listbox( dlg, ctl ) ) {
        return( LB_SETCURSEL );
    } else {
        return( CB_SETCURSEL );
    }
}

static WORD ctl_combo_get_msg( HWND dlg, int ctl )
/************************************************/
{
    if( is_listbox( dlg, ctl ) ) {
        return( LB_GETCURSEL );
    } else {
        return( CB_GETCURSEL );
    }
}

static WORD ctl_combo_add_msg( HWND, int );
static WORD ctl_combo_sel_msg( HWND, int );
static WORD ctl_combo_get_msg( HWND, int );

static BOOL ctl_dcombo_start( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, BOOL ___b )
/***************************************************************************************/
/* start a dynamic combo list box */
{
    char                *str;
    int                 i;
    int                 value;

    inst = inst;

    value = _value_int( ptr, elt ) - elt->info.dcombo.origin;

    for( i = 0;; ++i ) {
        str = (elt->info.dcombo.fetch)( i );
        if( str == NULL ) {
            break;
        }

        SendDlgItemMessage( dlg, elt->control,
                        ctl_combo_add_msg( dlg, elt->control ) , 0,
                                                    (DWORD)(LPSTR) str );
    }

    if( value >= i ) {
        value = i - 1;
    }

    SendDlgItemMessage( dlg, elt->control, ctl_combo_sel_msg( dlg,
                                            elt->control ), value, 0 );

    return( TRUE );
}

static BOOL ctl_dcombo_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/***********************************************************************************************/
/* finish a dynamic combo list box */
{
    inst = inst;

    _value_int( ptr, elt ) = elt->info.dcombo.origin +
            SendDlgItemMessage( dlg, elt->control,
                        ctl_combo_get_msg( dlg, elt->control ), 0, 0 );

    return( TRUE );
}

////////////////////////////////////////////////////////////////////////////
// Float field implementation

static BOOL ctl_float_start( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, BOOL ___b )
/**************************************************************************************/
/* start a float field */
{
    char                buf[50];
    char                *str;
    int                 dec;
    float               value;

    inst = inst;

    value = _value_float( ptr, elt );
    sprintf( buf, "%f", value );
    for( str = buf + strlen( buf ) - 1; *str == '0'; --str );
    for( dec = 0; *str != '.'; --str, ++dec );
    if( dec < 2 ) {
        dec = 2;
    }

    sprintf( buf, "%-.*f", dec, value );

    SetDlgItemText( dlg, elt->control, buf );

    return( TRUE );
}

static BOOL ctl_float_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/**********************************************************************************************/
/* end a float field */
{
    char                str[50];
    float               value;

    inst = inst;

    GetDlgItemText( dlg, elt->control, str, 50 );
    str[49] = '\0';

    if( 1 == sscanf( str, "%f", &value ) ) {
        _value_float( ptr, elt ) = value;
    } else {
        SetFocus( GetDlgItem( dlg, elt->control ) );
        MessageBox( dlg, "Invalid value: please re-enter it", NULL,
                                        MB_APPLMODAL | MB_ICONHAND | MB_OK );
        return( FALSE );
    }

    return( TRUE );
}

////////////////////////////////////////////////////////////////////////////
// Ranged float field implementation

static BOOL ctl_rfloat_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/***********************************************************************************************/
/* end an float field */
{
    float               value;
    char                str[100];
    BOOL                any_max;

    if( !ctl_float_finish( elt, inst, dlg, ptr, ___f ) ) {
        return( FALSE );
    }

    value = _value_float( ptr, elt );

    any_max = elt->info.rfloat.max >= elt->info.rfloat.min;
    if( value < elt->info.rfloat.min || ( any_max &&
                                        value > elt->info.rfloat.max ) ) {
        SetFocus( GetDlgItem( dlg, elt->control ) );
        if( any_max ) {
            sprintf( str, "Value must be in the range %.2f to %.2f",
                            elt->info.rfloat.min, elt->info.rfloat.max );
        } else {
            sprintf( str, "Value must be greater than or equal to %.2f",
                                                    elt->info.rfloat.min );
        }

        MessageBox( dlg, str, NULL, MB_APPLMODAL | MB_ICONHAND | MB_OK );

        return( FALSE );
    }

    return( TRUE );
}

////////////////////////////////////////////////////////////////////////////
// Integer field implementation

static BOOL ctl_int_start( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, BOOL ___b )
/************************************************************************************/
/* start an integer field */
{
    inst = inst;

    SetDlgItemInt( dlg, elt->control, _value_int( ptr, elt ), TRUE );

    return( TRUE );
}

static BOOL ctl_int_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/********************************************************************************************/
/* end an int field */
{
    BOOL                ok;

    inst = inst;

    _value_int( ptr, elt ) = GetDlgItemInt( dlg, elt->control, &ok, TRUE );

    if( !ok ) {
        SetFocus( GetDlgItem( dlg, elt->control ) );
        MessageBox( dlg, "Invalid integer: please re-enter it", NULL,
                                        MB_APPLMODAL | MB_ICONHAND | MB_OK );
        return( FALSE );
    }

    return( TRUE );
}

////////////////////////////////////////////////////////////////////////////
// Ranged int field implementation

static BOOL ctl_rint_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/*********************************************************************************************/
/* end an int field */
{
    int                 value;
    char                str[100];
    BOOL                any_max;

    if( !ctl_int_finish( elt, inst, dlg, ptr, ___f ) ) {
        return( FALSE );
    }

    value = _value_int( ptr, elt );

    any_max = elt->info.rint.max >= elt->info.rint.min;
    if( value < elt->info.rint.min || ( any_max &&
                                        value > elt->info.rint.max ) ) {
        SetFocus( GetDlgItem( dlg, elt->control ) );
        if( any_max ) {
            sprintf( str, "Integer must be in the range %d to %d",
                                    elt->info.rint.min, elt->info.rint.max );
        } else {
            sprintf( str, "Integer must be greater than or equal to %d",
                                                        elt->info.rint.min );
        }

        MessageBox( dlg, str, NULL, MB_APPLMODAL | MB_ICONHAND | MB_OK );

        return( FALSE );
    }

    return( TRUE );
}

////////////////////////////////////////////////////////////////////////////
// Radio button implementation

static BOOL ctl_radio_start( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, BOOL ___b )
/**************************************************************************************/
/* start a radio button */
{
    int                 value;

    inst = inst;

    value = _value_int( ptr, elt );

    if( value != 0 ) {
        CheckRadioButton( dlg, elt->control, elt->info.radio.end_control,
                                elt->control + _value_int( ptr, elt ) - 1 );
    }

    return( TRUE );
}

static BOOL ctl_radio_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/**********************************************************************************************/
/* finish a radio button */
{
    int                 control;

    inst = inst;

    for( control = elt->info.radio.end_control; control >= elt->control;
                                                            --control ) {
        if( IsDlgButtonChecked( dlg, control ) ) {
            _value_int( ptr, elt ) = control - elt->control + 1;

            break;
        }
    }

    return( TRUE );
}

static BOOL ctl_radio_modified( ctl_elt *elt, UINT wparam, LONG lparam )
/**********************************************************************/
{
    WORD        id;
    WORD        cmd;

    lparam = lparam;
    id = LOWORD( wparam );
    cmd = GET_WM_COMMAND_CMD(wparam, lparam );
    if( id >= elt->control && id <= elt->info.radio.end_control &&
                ( cmd == BN_CLICKED || cmd == BN_DOUBLECLICKED ) ) {
        return( TRUE );
    }

    return( FALSE );
}

////////////////////////////////////////////////////////////////////////////
// Text field implementation

static BOOL ctl_text_start( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, BOOL ___b )
/*************************************************************************************/
/* start a text field */
{
    inst = inst;

    SetDlgItemText( dlg, elt->control, _str_ptr( ptr, elt ) );

    return( TRUE );
}

static BOOL ctl_text_finish( ctl_elt *elt, HANDLE inst, HWND dlg, void *ptr, finish_type ___f )
/*********************************************************************************************/
/* end a text field */
{
    char                *str;

    inst = inst;

    str = _str_ptr( ptr, elt );

    GetDlgItemText( dlg, elt->control, str, elt->info.text.text_size );

    str[elt->info.text.text_size - 1]= '\0'; // in case of overflow

    return( TRUE );
}

static BOOL ctl_text_modified( ctl_elt *elt, UINT wparam , LONG lparam )
/**********************************************************************/
{
    WORD        id;
    WORD        cmd;

    id = LOWORD( wparam );
    cmd = GET_WM_COMMAND_CMD( wparam, lparam );

    if( id == elt->control && cmd == EN_CHANGE ) {
        return( TRUE );
    }

    return( FALSE );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?