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

Posted

技术标签:

【中文标题】即使焦点在其他对话框上,我们如何才能使 Cedit 控件文本突出显示?【英文标题】:How can we make Cedit control text highlighted even though the focus is on other dialog box? 【发布时间】:2013-07-18 09:14:40 【问题描述】:

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

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

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

【问题讨论】:

此行为是设计使然。在 Windows 中,只有具有焦点的控件才应显示突出显示的文本。检查任何标准软件,您很少会同时在多个控件中看到突出显示的文本。如果您确实需要一次在多个控件中添加高亮文本,则必须对您的编辑控件进行所有者绘制,但那是另一回事了。 如果您需要进一步的帮助,请评论我的回答。如果答案解决了您的问题:What should I do when someone answers my question? 【参考方案1】:

EDIT 控件的默认行为是在控件失去焦点时隐藏选择。要取消默认行为,如果您动态创建控件或想要动态更改样式,您必须通过调用CWnd::ModifyStyle 应用ES_NOHIDESEL 编辑控件样式。对于静态资源,您可以在资源编辑器中设置 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_PreservingSelectionEditCPreservingSelectionEdit 类型的对话框类的成员变量。

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

【讨论】:

以上是关于即使焦点在其他对话框上,我们如何才能使 Cedit 控件文本突出显示?的主要内容,如果未能解决你的问题,请参考以下文章

MFC对话框的CEdit控件回车换Tab键,并获得焦点全选中文本

如何在 MFC 中的对话框上阻止鼠标输入

CEdit控件[转]

如何使焦点保持在同一对话框上的所有列表控件上?

Visual C++6.0中CEdit的消息

如何杀死 MFC 向导按钮的焦点