包含只读项和可编辑项的组合框
一个组合框,由只读项目和可编辑项目组成,根据选择,锁定和解锁组合框的编辑字段
背景
我正在开发一个交易应用程序,可以在其中输入购买各种股票的订单。 单击股票时,会打开输入订单的窗口。 在那里,交易者可以在其他参数中输入数量。 我的客户要求,应该可以有一个默认值。 默认值可以是市场上可用的任何值、上次订单的数量或某个固定数字。 设置此默认值可以通过一起使用几个标准控件来完成,这些控件将用于输入默认数量。 例如,几个单选按钮来决定哪种默认数量,如果选择固定数字,则可以启用另一个编辑字段,可以在其中输入整数。 由于屏幕空间非常宝贵,因此几个耦合控件对于用户来说更加复杂,并且开发自定义控件真的很有趣,因此我们决定使用自定义控件。
用户指南
只读组合框有一个可编辑(非只读)项,即第一个项。 选择此项时,组合框的编辑字段变为活动状态,并且可以由用户更新。 每当编辑字段中的文本发生更改时,第一个项目也会更改。 其他项目是只读的。 选择后,组合框的编辑字段将变为只读。 用户现在可以从预定义的值中选择一个,也可以选择可编辑的项目并输入任何值。
CReadOnlyComboBox
将一个普通的组合框资源添加到你的窗口。 在资源上设置以下属性
Type
: Dropdown (下拉式)Owner Draw
: Fixed (固定)Has Strings
: checked (已选中)
接下来,使用类向导为组合框资源添加一个控制变量。 在h文件中,将数据类型从CComboBox
更改为CReadOnlyComboBox
。 然后,在创建控件后,调用AddString
-方法将添加项目,使第一个项目可编辑。 在此示例中,组合框在方法CComboTestDlg::OnInitDialog()
中初始化。 我们使用属于CComboTestDlg
的数据成员m_combo
作为组合框。
CReadOnlyComboBox
公开继承自CComboBox
,因此可以使用普通组合框的所有功能。 但是,应该使用CReadOnlyComboBox::AddString()
添加项目。
CReadOnlyComboBox
中的以下三个方法完成了所有工作。 以下是每个方法的简短解释和用法。
void CReadOnlyComboBox::OnSelchange()
当用户更改组合框的列表框中的当前选择时,会调用OnSelchange
。 根据用户是否选择了只读项,组合框的编辑字段设置为只读或设置为活动状态。
void CReadOnlyComboBox::OnEditupdate()
当用户采取了可能更改组合框的编辑控件部分中的文本的操作后,会调用OnEditupdate
。 这意味着先前选择了项目零,因为这是启用编辑字段的唯一方法,否则编辑字段是只读的。 我们更新组合框的列表框中的第一个项目以反映更改。
void CReadOnlyComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
当所有者绘制的组合框的视觉方面发生变化时,由框架调用。 每个需要绘制的项目都会调用一次。 此函数将绘制项目的文本并更改项目背景的颜色。 只读项目和可编辑项目使用不同的颜色。 此外,如果用户选择了一个项目,我们需要突出显示该项目以显示选择。
历史
- 2004 年 2 月 20 日:初始版本