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 + -
显示快捷键?