好的,我可以通过使用 OnInitDialog() 函数中下面所示的代码在 CEdit 控件内显示一些字符,但我无法在 OnInitDialog() 函数体内突出显示相同的文本。我只是不知道该怎么做。在我的 CReplaceCharacterDlg 类中,我使用向导添加了 CEdit ReplaceCharsCtrl 变量,并使用资源编辑器创建了 CEdit 控件。我在 OnInitDialog() 函数中尝试了以下行,如下所示,但收到“调试断言失败”错误。有人可以给我一个提示吗?
// CReplaceCharacter dialog
class CReplaceCharacterDlg : public CDialogEx
{
DECLARE_DYNAMIC(CReplaceCharacterDlg)
public:
CReplaceCharacterDlg(CWnd* pParent = nullptr); // standard constructor
CReplaceCharacterDlg(CWnd* pPar, CStringW replaceStrW);
virtual ~CReplaceCharacterDlg();
// Dialog Data
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_REPLACE_CHAR };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
CEdit ReplaceCharsCtrl;
CStringW ReplacementCharacterStr;
afx_msg void OnBnClickedOk();
};
// Implementation
BOOL CReplaceCharacterDlg::OnInitDialog()
{
GetDlgItem(IDC_EDIT1)->SetWindowTextW(ReplacementCharacterStr);
ReplaceCharsCtrl.SetHighlight(0, 2); <---- GIVES ASSERT ERROR ReplaceCharsCtrl hWnd = NULL
return TRUE;
}
请参阅帖子正文。
更改您的代码,如下所示(部分基于@Mark Ransom 评论):
BOOL CReplaceCharacterDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // Do not delete this, among others binds control variables to controls
ReplaceCharsCtrl.SetWindowTextW(ReplacementCharacterStr); // Control is already bound to IDC_EDIT1, no need do create a temporary CWnd object
ReplaceCharsCtrl.SetSel(0, -1); // Select the entire text
ReplaceCharsCtrl.SetFocus();
return FALSE; // We explicitly set the focus to a non-default control
}
编辑:
最后做了一些测试,发现
SetHighlight()
功能(EM_SETHILITE
消息)没有任何作用,这是一些非常老版本的Windows的遗物。它什么也没做,Win32 文档说它是“未实现”。还发现了这个帖子。您可以使用 SetSel()
来代替。