(Редди: пример кода ниже, если он что-то обнаружит)
В конце концов я только что сделал 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;