0

当尝试更改“受保护”文本时,EN_PROTECTED 通知消息将发送到富编辑控件的父级。这对我有用,我已经用richedit20和richedit50试过了。对此受保护文本的任何更改都会立即触发 EN_PROTECTED 消息。(设置起来有点复杂,但我做得对。)

但是,文档说如果父级响应 EN_PROTECTED 消息返回非零,它将阻止受保护的文本被更改。这对我不起作用。

4

2 回答 2

1

我创建了一个简单的测试对话框测试应用程序,使用 MFC - 通过对话框编辑添加 Richedit 控件,在应用程序初始化中添加调用,AfxInitRichEdit在对话框中添加一些代码以将文本放入控件(SetWindowText),选择第二个单词,应用CFE_PROTECTED效果,然后EN_PROTECTED在我刚刚设置的处理程序中添加处理程序*pResult = TRUE

当我运行该应用程序时,一切正常;因为我无法修改受保护的词,但我可以修改文本的其余部分。

不幸的是,这并没有让我们得出关于为什么您的代码不起作用的结论性原因——据我所见,它似乎是正确的。我想可能是 RichEdit20 dll 的版本 - 我的是 5.31.23.1224

于 2010-01-21T14:24:04.640 回答
0

(致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;
于 2010-01-20T23:08:33.437 回答