当试图更改“受保护的”文本时,EN_PROTECTED通知消息将发送到丰富编辑控件的父级。这对我很有效,我已经在richedit20和richedit50上尝试过了。对此受保护文本的任何更改都会立即触发EN_PROTECTED消息。(设置它有点复杂,但我已经正确地完成了。)
但是,文档指出,如果父进程在响应EN_PROTECTED消息时返回非零,它将阻止受保护的文本被更改。这对我不起作用。
发布于 2010-01-21 22:24:05
我创建了一个简单的测试对话框测试应用程序,使用MFC -通过对话框编辑添加richedit控件,在应用程序初始化中添加对AfxInitRichEdit的调用,在对话框中添加一些代码以将文本放入控件(SetWindowText),选择第二个单词,应用CFE_PROTECTED效果,然后为EN_PROTECTED添加一个处理程序,在处理程序中我刚刚设置了*pResult = TRUE。
当我运行这个应用程序时,一切都运行得很好;因为我不能修改受保护的单词,但我可以修改文本的其余部分。
不幸的是,这并不能给我们一个确凿的理由来解释为什么你的代码不能工作--从我看来它看起来是正确的。可能是RichEdit20 dll的版本-我的是5.31.23.1224
发布于 2010-01-21 07:08:33
(给Ruddy:如果下面的代码样本揭示了什么的话)
我最终做了一个PostMessage(hwnd,EM_UNDO...)在EN_PROTECTED处理程序中,这就是我必须做的,让它为我工作。返回TRUE从来没有完成任何事情,尽管我知道处理程序正在被击中,并且只针对受保护的文本。(下面的ODS函数是OutputDebugString)。
但我在网上看到过很多例子(大多数都是MFC,有时也有DELPHI之类的),据说在EN_PROTECTED处理程序中只返回TRUE就可以阻止这种改变。
实际上,我的Rich Edit控件在一个对话框中,但是用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;https://stackoverflow.com/questions/2104809
复制相似问题