Эффект «горячей дорожки» в пользовательском элементе управления Windows Form - PullRequest
5 голосов
/ 05 мая 2011

Какой самый простой способ реализовать UserControl, который имитирует эффект «горячей дорожки» при рисовании границы вокруг себя, когда мышь над ним нависает?

Я безуспешно пытался унаследовать пользовательский элемент управления, который переопределяет событие OnMouseHover, которое рисует границу (кажется, что событие не запускается)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

Вы можете смоделировать появление границы вокруг вашего пользовательского элемента управления, используя тщательно расположенный элемент управления Panel в вашем UC и наблюдая за положением мыши, отслеживая сообщения Windows низкого уровня.

В дизайне UserControlПоверхность Добавьте панель и измените размер панели так, чтобы была видна только небольшая часть проектной поверхности UC (см. примечание * ниже).Видимая часть поверхности дизайна будет вашей цветной рамкой, поэтому установите ее «толщину» соответственно.Добавьте другие элементы управления, составляющие ваш UC, на панель.

Ваш элемент управления может выглядеть следующим образом:
enter image description here

Реализация интерфейса IMessageFilter в вашем UC.В вашей реализации PreFilterMessage () вы будете проверять положение мыши относительно UC и установите BackColor UC на цвет границы, когда мышь находится над UC, или верните цвет по умолчанию, если это не так.Поскольку BackColor панели не изменяется, он будет казаться пользователю таким, как у вашего UC есть граница.

Вот минимальный объем кода, который вам понадобится для этого:

public partial class UserControl1 : UserControl, IMessageFilter
{
    public UserControl1() {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m) {
        if (!this.IsDisposed && this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition))) {
            this.BackColor = Color.Green; // Or whatever border color you want.
        } else {
            this.BackColor = SystemColors.Control;  // Back to the UC's default border color.
        }
        return false;
   }
}

Примечание: Когда я проверял это, у меня были трудности с настройкой BackColor моей панели, чтобы она не была прозрачной.Я исправил это, временно изменив BackColor в конструкторе на другой цвет, а затем изменив его на цвет по умолчанию (Control).

0 голосов
/ 05 мая 2011

Попробуйте добавить обработчики к событиям «MouseEnter» и «MouseLeave» элемента управления, которые изменят BorderStyle элемента управления (если он есть).MouseEnter запускается, когда мышь перемещается внутри границы элемента управления, а MouseLeave запускается, когда мышь выходит за эту границу.MouseHover может иметь некоторые дополнительные правила, например, мышь должна быть неподвижной в течение определенного времени.

...