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






3.94/5 (7投票s)
2004 年 12 月 3 日
2分钟阅读

46096

1369
一篇文章,描述如何改进 CEdit 和 CComboBox 类,以便更好地启用/禁用它们。
引言
本文包含两个从 CEdit
和 CCombobox
派生的类,允许它们在不显示禁用状态的情况下被锁定。
背景
我喜欢在 VB 中使用某些控件的一点是,它们有一个“locked
”属性。在使用 MFC 时,没有与之等效的内置属性,所以我决定自己创建一个。我不喜欢 MFC 中禁用编辑框和组合框时它们的外观。
使用代码
要使用此代码,只需将 LockEdit.h、LockCombo.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