【发布时间】:2010-12-31 19:55:01
【问题描述】:
当我使用 tab 键或箭头键移动到对话框上的 CEdit 控件时,控件中的所有文本都被选中。这种行为给我带来了问题,如果控件只是将光标放在文本的开头(或结尾)并且没有选择任何内容,我会更喜欢它。 有没有一种简单的方法可以做到这一点(例如我可以设置的控件属性)?
【问题讨论】:
标签: visual-c++ mfc cedit
当我使用 tab 键或箭头键移动到对话框上的 CEdit 控件时,控件中的所有文本都被选中。这种行为给我带来了问题,如果控件只是将光标放在文本的开头(或结尾)并且没有选择任何内容,我会更喜欢它。 有没有一种简单的方法可以做到这一点(例如我可以设置的控件属性)?
【问题讨论】:
标签: visual-c++ mfc cedit
实现目标的另一种方法是防止内容被选中。当在对话框中导航控件时,对话框管理器会查询各个控件关于与其行为有关的某些属性。默认情况下,编辑控件会以 DLGC_HASSETSEL 标志(以及其他标志)进行响应,以向对话框管理器指示其内容应自动选择。
要解决这个问题,您必须对编辑控件进行子类化并处理WM_GETDLGCODE 消息以适当地更改标志。首先,从CEdit派生一个类:
class CPersistentSelectionEdit : public CEdit {
public:
DECLARE_MESSAGE_MAP()
afx_msg UINT OnGetDlgCode() {
// Return default value, removing the DLGC_HASSETSEL flag
return ( CEdit::OnGetDlgCode() & ~DLGC_HASSETSEL );
}
};
BEGIN_MESSAGE_MAP( CPersistentSelectionEdit, CEdit )
ON_WM_GETDLGCODE()
END_MESSAGE_MAP()
下一个子类化实际控件。有很多方法可以做到这一点。为简单起见,只需在对话框类中声明 CPersistentSelectionEdit 类型的类成员 m_Edit1 并在 DoDataExchange 中添加适当的条目:
// Subclass the edit control
DDX_Control( pDX, IDC_EDIT1, m_Edit1 );
此时,您有一个编辑控件,它在导航到时不会自动选择其内容。您可以随心所欲地控制选择。
【讨论】:
我认为不存在这样的风格。
但是您可以使用向导添加 OnSetfocus 处理程序:
void CMyDlg::OnSetfocusEdit1()
{
CEdit* e = (CEdit*)GetDlgItem(IDC_EDIT1);
e->SetSel(0); // <-- hide selection
}
【讨论】:
e->SetSel(-1, 0, TRUE);。当我通过我的对话框的控件进行选项卡时,这将保持任何当前滚动位置,但也确保一旦焦点返回到我的编辑控件时没有选择任何内容。
请注意,您的程序中必须有一个代码来突出显示选择。请找到类似的内容:
CEdit* pEdit = ((CEdit*)GetDlgItem(IDC_EDIT1));
pEdit->SetFocus();
pEdit->SetSel(0, -1); // select everything
只需注释最后两行,而不是 >SetSel(0)。您的代码正在启用和禁用,这对我来说毫无意义。
【讨论】: