0

「保護された」テキストを変更しようとすると、EN_PROTECTED 通知メッセージがリッチ エディット コントロールの親に送信されます。これは私にとってはうまくいき、richedit20 と richedit50 の両方で試しました。この保護されたテキストが変更されると、すぐに EN_PROTECTED メッセージがトリガーされます。(設定は少し複雑ですが、正しく行いました。)

ただし、文書によると、親が EN_PROTECTED メッセージに応答してゼロ以外を返すと、保護されたテキストが変更されなくなります。これは私にとってはうまくいきません。

4

2 に答える 2

1

MFC を使用して、簡単なテスト ダイアログ テスト アプリを作成しました。ダイアログ編集を介してリッチエディット コントロールを追加AfxInitRichEditし、アプリの初期化に呼び出しを追加し、ダイアログにコードを追加して、コントロールにテキストを入力し ( SetWindowText)、2 番目の単語を選択しました。効果を適用し、設定したハンドラに の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 を返すだけで変更が防止されると言われています。

実際、リッチ エディット コントロールはダイアログ内にありましたが、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 に答える