(Ruddy へ: 以下のコード サンプルで何かが明らかになった場合)
私は最終的に EN_PROTECTED ハンドラー内から PostMessage(hwnd,EM_UNDO...) を実行しました。これは、これを機能させるために私がしなければならなかったことです。TRUE を返しても何も達成されませんでしたが、ハンドラーが保護されたテキストに対してのみヒットしていたことはわかっています。(以下の ODS 関数は OutputDebugString です)。
しかし、私はウェブ上で複数の例を見てきました (そのほとんどは MFC ですが、時には DELPHI などです)。ここでは、EN_PROTECTED ハンドラーで TRUE を返すだけで変更が防止されると言われています。
実際、リッチ エディット コントロールはダイアログ内にありましたが、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;