即使焦点在其他对话框上,我们如何才能突出显示Cedit控件文本?

时间:2013-07-18 09:14:41

标签: mfc

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

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

我想保留选中的文字但是没有发生? 为什么会这样?我怎么能这样做?

1 个答案:

答案 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的对话框类的成员变量。

另请注意,行为和视觉表示彼此独立。您可以单独申请。因此,如果您只希望编辑控件保留其选择而不更改视觉反馈,则可以单独执行答案的第二部分中的更改。