Услуги Сертификаты Новости Статьи База знаний Алгоритмы Портфолио Скачать Ссылки Поиск
Услуги arrow Новости arrow C# WinForms UserControl Scrolling - управление скроллингом на формах
C# WinForms UserControl Scrolling - управление скроллингом на формах Версия для печати Отправить на e-mail
17.05.2012

В WinForms существует проблема скроллинга пользовательских компонентов (UserControl), а именно: если вы создаете компонент и на нем расположены компоненты, которые, в свою очередь имеют полосы прокрутки, фокус, попадая на такой объект, блокирует прокрутку родительского компонента (поворотом колеса миши) до тех пор, пока пользователь не перейдет на следующий объект компонента клавишей "TAB", либо не выберет его мышью.

Проблема решается следующим образом: форму или UserControl нужно унаследовать от интерфейса IMessageFilter и реализовать его методы.

Пример:

В данном примере приводится реализация методов интерфейса IMessageFilter и дополнительно выполняется проверка, находится ли курсор над объектом CustomComboBox (ComboBox) или NumericUpDown, чтобы поворот колеса мыши не влиял на значения объектов данных типов.

  1. /// <summary>
  2. /// Пример базового класса
  3. /// </summary>
  4. public class FormBase : Form, IMessageFilter
  5. {
  6.     public FormBase() : base()
  7.     {
  8.         Application.AddMessageFilter(this);
  9.     }
  10.     #region Скроллинг на формах
  11.     public bool PreFilterMessage(ref Message m)
  12.     {
  13.         // WM_MOUSEWHEEL, find the control at screen position m.LParam
  14.         if (m.Msg == 0x20a)
  15.         {         
  16.             Point pos = new Point(m.LParam.ToInt32() & 0xffff, m.LParam.ToInt32() >> 16);
  17.             IntPtr hWnd = WindowFromPoint(pos);
  18.             if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null)
  19.             {
  20.                 if (!(Control.FromHandle(hWnd) is CustomComboBox) &&
  21.                     !(Control.FromHandle(hWnd).Parent != null && Control.FromHandle(hWnd).Parent is NumericUpDown))
  22.                 {
  23.                     SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
  24.                     return true;
  25.                 }
  26.                 return false;
  27.             }
  28.         }
  29.         return false;
  30.     }
  31.     
  32.     [DllImport("user32.dll")]
  33.     private static extern IntPtr WindowFromPoint(Point pt);
  34.     [DllImport("user32.dll")]
  35.     private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
  36.     #endregion
  37. }

* This source code was highlighted with Source Code Highlighter.

Решение было реализовано на основе данной публикации.

PS: если Вам была полезна данная статья, поддержите наш ресурс, нажмите кнопочку "+1" вверху страницы. Спасибо!
Последнее обновление ( 17.05.2012 )
 
< Пред.   След. >