当尝试更改“受保护”文本时,EN_PROTECTED 通知消息将发送到富编辑控件的父级。这对我有用,我已经用richedit20和richedit50试过了。对此受保护文本的任何更改都会立即触发 EN_PROTECTED 消息。(设置起来有点复杂,但我做得对。)
但是,文档说如果父级响应 EN_PROTECTED 消息返回非零,它将阻止受保护的文本被更改。这对我不起作用。
我创建了一个简单的测试对话框测试应用程序,使用 MFC - 通过对话框编辑添加 Richedit 控件,在应用程序初始化中添加调用,AfxInitRichEdit
在对话框中添加一些代码以将文本放入控件(SetWindowText
),选择第二个单词,应用CFE_PROTECTED
效果,然后EN_PROTECTED
在我刚刚设置的处理程序中添加处理程序*pResult = TRUE
。
当我运行该应用程序时,一切正常;因为我无法修改受保护的词,但我可以修改文本的其余部分。
不幸的是,这并没有让我们得出关于为什么您的代码不起作用的结论性原因——据我所见,它似乎是正确的。我想可能是 RichEdit20 dll 的版本 - 我的是 5.31.23.1224
(致Ruddy:下面的代码示例,如果它揭示了任何东西)
我最终只是在 EN_PROTECTED 处理程序中做了一个 PostMessage(hwnd,EM_UNDO...) ,这就是我必须做的才能让它为我工作。返回 TRUE 从未完成任何事情,尽管我知道处理程序被击中并且仅用于受保护的文本。(下面的ODS函数是OutputDebugString)。
但是我在网上看到了多个示例(其中大多数是 MFC,或者有时是 DELPHI 或其他东西),据说在 EN_PROTECTED 处理程序中返回 TRUE 可以防止更改。
实际上,我的 Rich Edit Control 在一个对话框中,但是是使用 CreateWindowEx 创建的,所以我尝试通过 RC 文件对其进行初始化,但没有任何区别。(诚然,我正在做的一些事情有点老派 - 对此感到抱歉。)但实际上我尝试了任何事情来让 EN_PROTECTED 像它记录的那样工作并且没有任何工作 - 奇怪。
哦,好吧,EN_PROTECTED 处理程序中的 EM_UNDO 有效,所以我想我会坚持下去。
原始代码(添加了 EM_UNDO 调用):
case WM_NOTIFY: {
NM_UPDOWN* nm = (NM_UPDOWN*)lParam;
if ((nm->hdr.code == UDN_DELTAPOS) && (nm->hdr.idFrom == ID_UPD_ERR)) {
int e = nm->iPos + nm->iDelta;
SetWindowText(xml2->hStatMsg[1],xml2->ErrMsg(1,e));
SetWindowText(xml2->hStatMsg[2],xml2->ErrMsg(2,e));
}
else if (wParam == ID_EDIT_A) {
if (((LPNMHDR)lParam)->code == EN_PROTECTED) {
ODS("EN_PROTECTED", (int)((ENPROTECTED*)lParam)->msg);
PostMessage(xml2->hImgXml2,EM_UNDO,0,0);
return TRUE;
}
if (((LPNMHDR)lParam)->code == EN_SELCHANGE) {
anchors_adjsel(xml2->hImgXml2);
}
}
}
break;