Winapi EN_保护和丰富编辑

Winapi EN_保护和丰富编辑,winapi,controls,edit,Winapi,Controls,Edit,当试图更改“受保护”文本时,EN_PROTECTED notify消息将发送给rich edit控件的父控件。这对我很有效,我已经用richedit20和richedit50试过了。对此受保护文本的任何更改都会立即触发EN_受保护消息。(设置起来有点复杂,但我做得很正确。) 但是,文档中说,如果父级在响应EN_PROTECTED消息时返回非零,将阻止受保护文本被更改。这对我不起作用 (致Ruddy:如果下面的代码示例显示了任何内容,请参见下面的代码示例) 我最终只是在EN_保护的处理程序中做了一

当试图更改“受保护”文本时,EN_PROTECTED notify消息将发送给rich edit控件的父控件。这对我很有效,我已经用richedit20和richedit50试过了。对此受保护文本的任何更改都会立即触发EN_受保护消息。(设置起来有点复杂,但我做得很正确。)

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

(致Ruddy:如果下面的代码示例显示了任何内容,请参见下面的代码示例)

我最终只是在EN_保护的处理程序中做了一个PostMessage(hwnd,EM_UNDO…),这就是我必须要做的,才能让它为我工作。返回TRUE从未完成任何事情,尽管我知道处理程序被命中,并且只针对受保护的文本。(下面的ODS函数是OutputDebugString)

但我在web上看到过多个示例(大多数是MFC,有时是DELPHI或其他),其中仅在EN_保护的处理程序中返回TRUE就可以防止更改

实际上,我的Rich Edit控件位于对话框中,但是使用CreateWindowEx创建的,因此我尝试通过RC文件初始化它,但没有任何区别。(我所做的一些事情是很老派的——很抱歉。)但事实上,我尝试了一切让EN_受保护的工作,比如它被记录下来了,但什么都不起作用——很奇怪

哦,嗯,在EN_保护的处理程序中,EM_撤销是有效的,所以我想我会坚持下去

原始代码(添加了EM_UNDO调用):


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

当我运行应用程序时,一切都很好;因为我不能修改受保护的单词,但我可以修改文本的其余部分


不幸的是,这并不能让我们得出一个结论性的原因来解释为什么你的代码不能工作——从我看来,它似乎是正确的。我想可能是RichEdit20 dll的版本-我的是5.31.23.1224

你能把源代码发布到你的EN_保护处理程序吗?
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;