Как отловить потерю фокуса в PaletteSet

Автор Тема: Как отловить потерю фокуса в PaletteSet  (Прочитано 12900 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Как отловить потерю фокуса в PaletteSet
« Ответ #15 : 26-11-2014, 11:18:39 »
События щелчков и нажатия клавиш в контексте AutoCAD я обрабатывал с помощью такого решения: http://through-the-interface.typepad.com/through_the_interface/2008/05/filtering-windo.html
В двух словах: перед обработкой действия (нажатия кнопки мыши или клавиши), Application генерирует событие PreTranslateMessage. В его аргументе типа PreTranslateMessageEventArgs содержатся данные о том, какое событие произошло.
« Последнее редактирование: 26-11-2014, 13:53:58 от Загорулькин Дмитрий »

Отмечено как Решение Александр Ривилис 26-11-2014, 15:51:53

Оффлайн GennadiyАвтор темы

  • ADN Club
  • **
  • Сообщений: 81
  • Карма: 0
Re: Как отловить потерю фокуса в PaletteSet
« Ответ #16 : 26-11-2014, 15:48:05 »
Да уж, пришлось изрядно повозиться чтобы найти более-менее приемлемое для меня решение.

Вот код, может кому ещё пригодится:

Код - C# [Выбрать]
  1. PaletteSet ps; // моя палетка
  2.  
  3.  public struct RECT
  4.  {
  5.     public int Left;
  6.     public int Top;
  7.     public int Right;
  8.     public int Bottom;
  9.   }
  10.  
  11.    const int WM_LBUTTONDOWN = 513;
  12.    const int WM_LBUTTONUP = 514;
  13.  
  14.   [DllImport("user32.dll", SetLastError = true)]
  15.   static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
  16. ...
  17.  
  18. AcAp.PreTranslateMessage += AcAp_PreTranslateMessage;
  19.  
  20.     void AcAp_PreTranslateMessage(object sender, PreTranslateMessageEventArgs e)
  21.     {
  22.       if (e.Message.message == WM_LBUTTONDOWN ||
  23.            e.Message.message == WM_LBUTTONUP)
  24.       {
  25.         RECT rct = new RECT();
  26.         GetWindowRect(ps.Handle, ref rct);
  27.         Point location = new Point(rct.Left, rct.Top);
  28.         Rectangle rec = new Rectangle(location, ps.Size);
  29.         if (!rec.Contains(new Point(e.Message.pt_x, e.Message.pt_y)))
  30.         {
  31.             // здесь завершаю редактирование в TextBox
  32.         }
  33.       }
  34.     }
  35.  

Суть в том чтобы отследить щелчок мышки за пределами палетки и закончить редактирование TextBox на палетке

Можно было бы обойтись без WinAPI функции GetWindowRect если бы ps.Location всегда выдавал координаты верхнего левого угла,
но блин это свойство зависит от того плавающая ли палетка или закрепленная и к какой стороне прикреплена!

Спасибо всем за помощь.
« Последнее редактирование: 26-11-2014, 16:03:13 от Gennadiy »