返回首页



图1:第一个可编辑项被选中。编辑字段的组合框可以进行编辑。

图2:一个只读的项目被选中。组合框的编辑字段现在只读。 背景
我工作的地方,有可能进入订单购买各种股票的股份在交易应用。当点击一个股票,进入命令窗口被打开了。交易商,在其他参数,可以输入数量。我的客户的要求,它应该有可能有一个默认值。默认值是,无论是在市场,去年订单的数量或一些固定的数量。设置这个默认值可以使用几个标准控制,这将是用于输入默认数量已经完成。例如,几个单选按钮来决定哪一种默认数量,如果选择固定数量,另一个编辑领域可启用,可以输入一个整数。由于屏幕空间是有价值的,几个再加上控制比较复杂,为用户和开发自定义控件真的很好玩,我们决定去一个自定义控件。用户指南
读取组合框有一个可编辑的(非只读项),第一个项目。当这个项目被选中,组合框的编辑领域变得活跃,并可以由用户进行更新。只要在编辑栏的文本改变,第一项是改变。其他项目是只读的。当选择,组合框的编辑栏将变成只读。现在,用户可以选择预定义的值之一,或选择编辑项目,并输入任何值。CReadOnlyComboBox
正常的组合框资源添加到你的窗口。对资源设置以下属性:
类型:下拉业主抽奖:固定有字符串:选中
接下来,组合框的资源使用类向导添加一个控制变量。在H文件中,更改数据类型从CComboBox CReadOnlyComboBox。然后,事后控制被创建,调用的AddString方法,这将增加项目的第一项编辑。该组合框初始化方法CComboTestDlg:在这个例子中的OnInitDialog()。我们使用一个数据成员称为m_combo属于CComboTestDlg组合框。
CReadOnlyComboBox公开继承从CComboBox,使正常的组合框的所有功能。但项目应与CReadOnlyComboBox:AddString()。
CReadOnlyComboBox以下三个方法做好各项工作。下面是每个方法和使用的一个简短的解释。无效CReadOnlyComboBox::OnSelchange()
OnSelchange被称为当用户改变了组合框的列表框的当前选择。根据如果用户选择了一个只读的项目或不,编辑字段的组合框设置为只读,或设置被激活。无效CReadOnlyComboBox:OnEditupdate()
OnEditupdate是所谓的用户后,已采取行动可能改变在组合框的编辑控制部分文本。这意味着,项目零以前选择,因为这是只有这样才能使编辑栏,否则编辑字段是只读的。我们更新组合框的列表框的第一个项目,以反映这个变化。无效CReadOnlyComboBox::的DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
的框架称为所有者绘制组合框变化时的视觉效果。这就是所谓的每一次的项目,需要绘制。此功能将利用该项目的文本以及更改项目的背景颜色。不同的颜色用于只读项目和编辑项目。此外,如果用户选择了一个项目,我们需要突出显示选择的项目。

回答

评论会员:游客 时间:2011/12/01
​​softsniper
好文章,,


修改,2009年5月13日,日(星期三)下午11:18
评论会员:MrAntonD 时间:2011/12/01
需​​要在C#
评论会员:rbid 时间:2011/12/01
您好,

尼斯组合框。

我已经通知,我不能使用GetCurSel()函数来获取选定字符串的索引。
如果是第一个可编辑行进行任何编辑,GetCurSel()函数返回-1,预计0时。
一个简单的解决方案(部分),与第一个可编辑的行是默认选中的假设,即使没有选择做(函数GetCurSel()将返回0,而不是预期的-1)。对于这个简单的部分解决方案所需的代码是添加了以下机身CBN_KILLFOCUS消息处理程序:


    int nIndex = GetCurSel();

 

    if (nIndex < 0)

    {

        SetCurSel(0);

    }

 


一个完整的解决方案可能需要跟踪控制followin方式的重点:
当控件获得焦点,成员集的布尔变量为false。当选择或编辑控制的改变,改变这个变量为true。当控制损失的重点,检查,如果该变量是真实的,如果是,上面的代码。
有一个愉快的一天
Rbid