(致 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;