智能编辑和链接滑块控件






3.80/5 (3投票s)
2000年2月3日

140468

2845
一个用于输入文本、数字、十六进制或浮点值的编辑控件,可以链接到滑块控件
这里包含的代码实现了我称之为智能编辑控件的东西。它最初来源于 MSDN 的一个名为 CTRLTEST 的示例。这个控件最初被称为 CParsedEdit
,它允许你指定可以输入到编辑框中的允许字符类型。我把它改名为 CSmartEdit
,并添加了更多功能。它现在支持更多字符类型,包括数字、字符、十六进制、浮点数(带指数)、下划线和负号。功能上最大的改进是,可以将编辑框与滑块关联或链接,以提供我称之为协调更新的功能。这意味着,如果你拖动滑块,你会在编辑框中看到相应的数字变化,反之亦然。我将派生的滑块控件类称为 CLinkSlider
。
作为额外的奖励,我包含了一些来自原始示例的位图按钮图像和我自己绘制的一些位图按钮图像。我绘制的位图是用于确定和取消按钮的禁用状态,以及用于应用和帮助按钮的所有四种状态。这四种按钮状态分别是弹起、按下、焦点和禁用。位图的名称分别以 U、D、F 和 X 结尾,分别代表这四种状态。
使用 CSmartEdit
控件非常容易。以下是步骤:
- 在对话框的
AFX_DATA
部分声明一个CSmartEdit
类型的成员变量。 - 在
AFX_DATA_MAP
中添加一个DDX_Control
语句,将资源与成员变量关联起来。 - 在
OnInitDialog
中,使用SetParseType
设置控件的类型。
正如你可能知道的那样,类向导可以为你完成前两个步骤。请注意,编辑框的资源样式不必是任何特殊的样式。
使用 CLinkSlider 控件也非常容易。以下是步骤:
- 如上面的步骤 1 和 2 所示,添加一个
CSmartEdit
控件。 - 与上面的步骤 1 和 2 类似,添加一个
CLinkSlider
控件。 - 在
OnInitDialog
中,通过调用SetSlideLink
并传递滑块的资源 ID 来链接滑块和编辑框。 - 同样在
OnInitDialog
中,使用 SetParams 设置滑块的最小值和最大值以及刻度数。此函数有两个版本,一个用于整数,一个用于浮点双精度数。浮点版本还需要一个格式字符串,用于指定如何显示该值。
这是一个代码片段,演示了如何使用智能编辑框和两个链接的滑块-编辑框,一个整数型,一个浮点型。
// Dialog Data in dialog class declaration //{{AFX_DATA(CTestSlidersDlg) enum { IDD = IDD_SLIDE_DLG }; CSmartEdit m_Edit1; CSmartEdit m_Edit2; CSmartEdit m_Edit3; CLinkSlider m_Slider1; CLinkSlider m_Slider2; //}}AFX_DATA ... // in dialog's DoDataExchange function CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTestSlidersDlg) DDX_Control(pDX, IDC_EDIT1, m_Edit1); DDX_Control(pDX, IDC_EDIT2, m_Edit2); DDX_Control(pDX, IDC_EDIT3, m_Edit3); DDX_Control(pDX, IDC_SLIDER1, m_Slider1); DDX_Control(pDX, IDC_SLIDER2, m_Slider2); //}}AFX_DATA_MAP ... // in dialog's OnInitDialog function CDialog::OnInitDialog(); // setup first slider-edit box - integer m_Edit1.SetSlideLink( this, IDC_SLIDER1 ); m_Edit1.SetParams( -100, 100, 10 ); m_Edit1.SetValue( 0 ); // setup second slider-edit box - floating point m_Edit2.SetSlideLink( this, IDC_SLIDER2 ); m_Edit2.SetParams( 0.0, 10.0, 10, "%6.3f" ); m_Edit2.SetValue( 2.0 ); // setup third edit box - it is not linked and accepts only letters m_Edit3.SetParseType( SES_LETTERS );
最后,我将简要介绍如何使用位图按钮。
- 在对话框中定义一个启用了 Owner Draw 样式的按钮资源。
- 在对话框中声明一个
CBitmapButton
类型的变量。 - 在
OnInitDialog
中调用Button.AutoLoad( ButtonId, this )
这就是全部内容。使用 AutoLoad
的一个诀窍是,按钮的文本必须与位图的名称匹配。这意味着对于取消按钮,其文本必须是 Cancel,对于应用按钮,其文本必须是 Apply。请注意,按钮文本的大小写无关紧要。有关更多详细信息,请参阅 CBitmapButton
上的文档。
关于 Unicode 的说明:首先,我已经尝试使它与 Unicode 兼容,但我没有用 MBCS 对其进行测试。最重要的原则是在检查输入到编辑框中的每个字符时使用与 Unicode 兼容的函数。请让我知道遇到的任何问题(以及成功案例 :)
演示项目是一个具有四个对话框的对话框应用程序。一个是选择器对话框,其他的用于测试仅编辑框、仅按钮以及一个将所有控件一起显示的对话框,如图所示。