0

我有一个对话框,其中包含编辑控件(其中包含一些文本。)和一个按钮(单击它时,其他对话框会打开)。

我选择(突出显示)一些文本并单击按钮,打开其他对话框但未选择编辑控制文本。

我想保持选中文本,但没有发生?为什么会这样?我该怎么做?

4

1 回答 1

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你的实现中添加一个 -statement DoDataExchange

void CMyDlg::DoDataExchange( CDataExchange* pDX )
{
    CDialogEx::DoDataExchange( pDX );
    DDX_Control( pDX, IDC_EDIT1, m_PreservingSelectionEdit );
}

其中IDC_EDIT1是您想要子类化的控件的控件标识符和m_PreservingSelectionEdit类型为对话框类的成员变量CPreservingSelectionEdit

还要注意,行为和视觉表示是相互独立的。您可以单独应用每个。因此,如果您只希望您的编辑控件保留其选择而不更改视觉反馈,您可以单独实施答案第二部分中列出的更改。

于 2013-07-18T19:56:30.623 回答