пятница, октября 06, 2006

Перекрываем Undo/Redo в Windows.Forms

Недавно столкнулся с такой проблемой -- надо было перекрыть стандартный обработчик Undo/Redo в RichTextBox'е. Казалось бы, что тут сложного -- делаем компонент-наследник от искомого, перегружаем WndProc и при получении EM_UNDO мирно молчим, не показывая, что что-либо произошло =) Но, не тут-то было. Реализовав данный алгоритм я с удивлением обнаружил, что ничего не получилось... Тогда пришлось прихывать на помощь две абсолютно потрясающих утилиты: Hawkeye (о которой, кстати, узнал из блога Exception'a) и .Net Reflector (которым пользовался достаточно давно).
В итоге выяснилось, что при получении сообщения EM_UNDO, контрол получает в нагрузку еще цепочку из 5-ти сообщений, которые так же нельзя пропускать. В общем, получилась несколько ненормальная реализация перекрытия Undo/Redo:




Code C#

public partial class SyntaxHighLightArea : RichTextBox
{
 private int UndoQueueCount = 0;

 [System.Security.Permissions.PermissionSet( System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
 protected override void WndProc(ref Message msg)
 {
  if (msg.Msg == Convert.ToInt32(PAL.Native.Msg.EM_UNDO))
  {
   UndoQueueCount = WinPAL.RedoBackCountMessages;
   return;
  }
  if (UndoQueueCount > 0)
  {
   if(UndoQueueCount == 1)
   {
    PAL.Native.SendMessage(Parent.Handle, PAL.Native.Msg.EM_UNDO, IntPtr.Zero, IntPtr.Zero);
   }
   UndoQueueCount--;
   return;
  }
  base.WndProc(ref msg);
 }

 private void SyntaxHighLightArea_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
 {
  if ((Control.ModifierKeys == Keys.Control) && (e.KeyCode == Keys.Z))
  {
   PAL.Native.SendMessage(this.Handle, PAL.Native.Msg.EM_UNDO, IntPtr.Zero, IntPtr.Zero);
  }
 }
.......skip.......
}

2 комментария:

Анонимный комментирует...

Очень полезно

Анонимный комментирует...

Как говорилось на 2NT.ru Доброго всем времени суток. У меня такая ситуация. Встречаюсь с мужчиной 5 лет. Ему 40, мне 30. У него был брак, развелись по её инициативе в последствии 7 лет совместной жизни. Через 2 года мы начали встречаться. Он живёт с родителями, бываю у него дома. Хочу давно семью и детей. Он диалогы на эту тему пресекает, говорит, что не любит выяснять отношения. Уходила от него некоторое количество раз, потом не выдерживала и сама возвращалась. Сейчас решила уйти бесповоротно. Но ужасно тяжело, т.к. он мой первый мужчина и всё-таки 5 лет сообща. Подскажите, верное ли решение я приняла. Спасибо