EN_PROTECTED и RichEdit - PullRequest
       35

EN_PROTECTED и RichEdit

0 голосов
/ 20 января 2010

Сообщение уведомления EN_PROTECTED отправляется родителю элемента управления расширенного редактирования при попытке изменить «защищенный» текст. Это работает для меня, и я попробовал это и с richedit20 и richedit50. Любое изменение этого защищенного текста немедленно вызывает сообщение EN_PROTECTED. (Его немного сложно настроить, но я сделал это правильно.)

Однако в документации сказано, что если родитель возвращает ненулевое значение в ответ на сообщение EN_PROTECTED, это предотвратит изменение защищенного текста. Это не работает для меня.

Ответы [ 2 ]

1 голос
/ 21 января 2010

Я создал простое тестовое диалоговое тестовое приложение, используя MFC - добавив элемент управления richedit через диалоговое окно редактирования, добавил вызов AfxInitRichEdit в инициализации приложения, добавил некоторый код в диалог, чтобы поместить текст в элемент управления (SetWindowText), выбрал второе слово, применил эффекты CFE_PROTECTED, а затем добавил обработчик для EN_PROTECTED, в обработчике я просто установил *pResult = TRUE.

Когда я запускал приложение, все работало нормально; в этом я был не в состоянии изменить защищенное слово, но я мог изменить остальную часть текста.

К сожалению, это на самом деле не приводит нас к убедительной причине, почему ваш код не работает - насколько я понимаю, он выглядит правильным. Может быть версия DLL RichEdit20 я полагаю - у меня 5.31.23.1224

0 голосов
/ 21 января 2010

(Редди: пример кода ниже, если он что-то обнаружит)

В конце концов я только что сделал PostMessage (hwnd, EM_UNDO ...) из обработчика EN_PROTECTED, и это то, что я должен был сделать, чтобы это сработало для меня. Возврат ИСТИНЫ никогда ничего не делал, хотя я знаю, что обработчик получал удар и только для защищенного текста. (ниже приводится функция ODS: OutputDebugString).

Но я видел несколько примеров в Интернете (большинство из них, однако, MFC или иногда DELPHI или что-то в этом роде), где сказано, что просто возвращение TRUE в обработчик EN_PROTECTED предотвращает изменение.

На самом деле, мой Rich Edit Control находился в диалоге, но создавался с помощью CreateWindowEx, поэтому я попытался вместо этого инициализировать его через файл RC, но это не имело никакого значения. (Некоторые из вещей, которые я делаю, вроде старой школы - извините за это.) Но на самом деле я пробовал все и вся, чтобы EN_PROTECTED работал так, как это задокументировано, и ничего не получалось - странно.

Ну да ладно, EM_UNDO из обработчика EN_PROTECTED работает, так что, думаю, я буду придерживаться этого.

Оригинальный код (с добавленным вызовом 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;
...