我有一个对话框,其中包含编辑控件(其中包含一些文本。)和一个按钮(单击其他对话框时会打开)。
我选择了(突出显示)一些文本并单击了按钮,其他对话框已打开,但编辑控件文本未被选中。
我想保留选中的文字但是没有发生? 为什么会这样?我怎么能这样做?
答案 0 :(得分:1)
当控件失去焦点时,EDIT控件的默认行为会隐藏选择。要取消默认行为,如果动态创建控件或想要动态更改样式,则必须通过调用ES_NOHIDESEL
来应用CWnd::ModifyStyle
编辑控件样式。对于静态资源,您可以从资源编辑器中设置 No Hide Selection 属性。
但请注意,当编辑控件获得焦点时,默认情况下将选择整个内容。如果这不是您想要的,则必须将编辑控件子类化(在C ++意义上以及Win32-API意义上)。您可以通过派生CEdit
,添加ON_WM_GETDLGCODE
处理程序并屏蔽DLGC_HASSETSEL
位来执行此操作:
class CPreservingSelectionEdit : public CEdit
{
protected:
DECLARE_MESSAGE_MAP();
public:
afx_msg UINT OnGetDlgCode()
{
UINT uiCode = CEdit::OnGetDlgCode();
uiCode &= ~DLGC_HASSETSEL;
return uiCode;
}
};
BEGIN_MESSAGE_MAP( CPreservingSelectionEdit, CEdit )
ON_WM_GETDLGCODE()
END_MESSAGE_MAP()
要对控件进行子类化,您还必须将此派生类附加到控件。最简单的方法是在DDX_Control
实施中添加DoDataExchange
- 语句:
void CMyDlg::DoDataExchange( CDataExchange* pDX )
{
CDialogEx::DoDataExchange( pDX );
DDX_Control( pDX, IDC_EDIT1, m_PreservingSelectionEdit );
}
其中IDC_EDIT1
是您想要子类化的控件的控件标识符,m_PreservingSelectionEdit
是类型为CPreservingSelectionEdit
的对话框类的成员变量。
另请注意,行为和视觉表示彼此独立。您可以单独申请。因此,如果您只希望编辑控件保留其选择而不更改视觉反馈,则可以单独执行答案的第二部分中的更改。