65.9K
CodeProject 正在变化。 阅读更多。
Home

可锁定编辑框和组合框控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.94/5 (7投票s)

2004 年 12 月 3 日

2分钟阅读

viewsIcon

46096

downloadIcon

1369

一篇文章,描述如何改进 CEdit 和 CComboBox 类,以便更好地启用/禁用它们。

Lockable Controls

引言

本文包含两个从 CEditCCombobox 派生的类,允许它们在不显示禁用状态的情况下被锁定。

背景

我喜欢在 VB 中使用某些控件的一点是,它们有一个“locked”属性。在使用 MFC 时,没有与之等效的内置属性,所以我决定自己创建一个。我不喜欢 MFC 中禁用编辑框和组合框时它们的外观。

使用代码

要使用此代码,只需将 LockEdit.hLockCombo.h 及其各自的 .cpp 文件添加到您的项目中即可。我最近发现,如果我先将这些类添加到项目中,在使用类向导添加这些类的变量时,我可以直接输入 'CLockCombo' 或 'CLockEdit',而无需使用 MFC 类,然后进入代码进行更改。

两个类都使用一个成员变量 'm_bEnabled' 来保存控件的当前状态。代码使用此变量来确定是否应该对消息进行进一步处理。例如,这是 CLockEdit 的 'OnChar()' 方法:

void CLockEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if(!m_bEnabled)
        return;

    CEdit::OnChar(nChar, nRepCnt, nFlags);
}

CLockCombo 类还包含一个整数成员变量,用于保存列表下拉时当前项目的索引。如果控件被禁用,它会在列表关闭时将其重置为前一个项目。此外,CLockEdit 类允许使用正常的 Windows 快捷键(CTRL+C、CTRL+X、CTRL+V)进行剪切、复制和粘贴。由于组合框没有被禁用,因此允许用户查看组合框中的其他选项,即使他们无法选择任何选项。RecalcDropWidth() 函数的代码是抄袭自 Chris Maunder 的一个项目,我之前使用过。

关注点

目前我看到唯一的问题是,如果您正在处理 OnSelChange() 事件,则必须确保在进行任何处理之前,组合框已启用。这在以下代码片段中可以看到:

void CLockedControlsDlg::OnCbnSelchangeCombo1()
{
    //if combo is not currently enabled, don't do any more handling of the event
    if(!m_cboCategories.GetEnabled())
        return;

    //just put text selected in combobox into the edit control
    CString strText;
    m_cboCategories.GetLBText(m_cboCategories.GetCurSel(),strText);
    m_txtNotes.SetWindowText(strText);
}

您可以随意使用此代码。欢迎任何补充和/或更改。

历史

  • 发布日期:2004/12/01
© . All rights reserved.