我有一个对话框,其中包含编辑控件(其中包含一些文本。)和一个按钮(单击它时,其他对话框会打开)。
我选择(突出显示)一些文本并单击按钮,打开其他对话框但未选择编辑控制文本。
我想保持选中文本,但没有发生?为什么会这样?我该怎么做?
我有一个对话框,其中包含编辑控件(其中包含一些文本。)和一个按钮(单击它时,其他对话框会打开)。
我选择(突出显示)一些文本并单击按钮,打开其他对话框但未选择编辑控制文本。
我想保持选中文本,但没有发生?为什么会这样?我该怎么做?
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
你的实现中添加一个 -statement DoDataExchange
:
void CMyDlg::DoDataExchange( CDataExchange* pDX )
{
CDialogEx::DoDataExchange( pDX );
DDX_Control( pDX, IDC_EDIT1, m_PreservingSelectionEdit );
}
其中IDC_EDIT1
是您想要子类化的控件的控件标识符和m_PreservingSelectionEdit
类型为对话框类的成员变量CPreservingSelectionEdit
。
还要注意,行为和视觉表示是相互独立的。您可以单独应用每个。因此,如果您只希望您的编辑控件保留其选择而不更改视觉反馈,您可以单独实施答案第二部分中列出的更改。