WinForms: Как мне имитировать поведение кнопок на изображении? - PullRequest
1 голос
/ 16 апреля 2010

У меня есть расширение для Winforms TabControl, оно рисует X на каждой вкладке, чтобы позволить пользователю закрыть вкладку.

альтернативный текст http://i41.tinypic.com/bhelqp.jpg

Сравните это со стандартом:

альтернативный текст http://i42.tinypic.com/2zqa2c3.jpg

Как мне смоделировать внешний вид кнопок на этом изображении? Я имею в виду, что когда пользователь нажимает вниз, это должно визуально указывать на это. Кнопка делает это со вставленным изображением. Что касается бонусных баллов, я бы тоже хотел выполнить партию, когда изображение будет «светиться» при наведении курсора мыши.

Но X - это не кнопка, и это не элемент управления PictureBox. Это совсем не контроль. Это просто нарисовано там.

Есть ли способ нарисовать границу вставки на MouseDown и Raised на MouseUp? Будет ли мне лучше создать другое изображение для фазы «врезка»? (и еще один для парения).

Кто-нибудь делал это раньше?


Похожие: Симуляция анимации при нажатии кнопки
Но этот вопрос другой, потому что он на самом деле имеет элемент управления PictureBox. Я не.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2010

Если вы только что нарисовали его там, вам нужно сделать следующее:

  • Иметь событие onmouseover / onleftclick для родительского элемента управления.Это может быть сама форма или элемент управления вкладками.
  • В этой функции проверьте, находится ли мышь над тем местом, где вы рисуете изображение.
  • Если оно находится над местом, где вы рисуете изображениезатем покажите состояние «щелчка» или «зависания».

Я собрал некоторый код относительно того, как он может выглядеть

myControl.MouseClick += new EventHandler(myClickHandler);

private void myClickHandler(EventArgs e)
{
//Check e to see if left button was pressed
//Check e location to see if mouse is in correct location, i.e. over the "X"
//If so then alter a state variable i.e. tabstates[0] = TabStates.HOVER;
}

private void myDrawingFunc()
{
//Draw X
if (tabstates[0] == TabStates.HOVER)
{
//Draw hover state
}
else
{
//Draw other state
}
}

Это, очевидно, только примерпримерно показывает, как вы это сделаете.Примечание. Я добавил tabstates в виде массива или списка, чтобы у вас было состояние для каждой вкладки.

1 голос
/ 16 апреля 2010

Вы можете использовать изображения вместо рисования всей кнопки закрытия, это будет гораздо проще использовать, например, представьте, что у вас есть 3 состояния для кнопки (MouseUp, MouseDown, Pressed), которые должны быть объявлены как enum, и в обработчикам событий вашего пользовательского элемента управления просто нужно изменить перечисление на MouseDown, MouseUp или Pressed.

Во время рисования вашего пользовательского элемента управления в OnPaint проверьте перечисление и нарисуйте изображение.

Надеюсь, это сработает.

1 голос
/ 16 апреля 2010

Проверьте класс ButtonRenderer. Может использоваться для рисования стандартных кнопок.

0 голосов
/ 16 апреля 2010

Благодаря ответам. Это дало мне несколько хороших идей.

Мне нужно поведение типа «кнопка», с эффектами наведения и отображением. В конце концов я остановился на парении и пропустил вставку дисплея. Внешний вид этого сделал то, что я хотел, особенно учитывая, что кнопка просто закрывает вкладку.


Вот как я это сделал.

  1. В пользовательском классе TabControl вставьте 3 изображения: «Закрыть», «Закрыть серый» и «Закрыть курсор». Прочитайте эти изображения во время строительства, из потока ресурсов.

    Внутри метода PaintImage () выберите изображение для использования, в зависимости от состояния «кнопки».

  2. Теперь, чтобы изменить состояния кнопки: переопределите OnMouseMove и OnMouseLeave.

    В OnMouseMove проверьте, находится ли MouseEventArgs.Location в «горячей точке» X для выбранной вкладки. Если это так, включите System.Timers.Timer с интервалом 110 мс. (или около того) Таймер срабатывает, когда мышь перестает двигаться, и он располагается над X. Если OnMouseMove обнаруживает, что мышь находится не над X, отключите таймер и при необходимости закрасьте X.

    В событии Elapsed для этого таймера установите для состояния изображения значение «Hover». Нарисуйте изображение. В моем случае он превращается из темно-серого в красный.

    В методе OnMouseLeave установите для состояния изображения значение «Закрыть» (обычное). Нарисуйте изображение. Это сделано для того случая, когда мышь быстро покидает элемент управления после наведения на изображение. В моем случае он превращается из красного в серый.

    Если изображение будет нарисовано по какой-либо другой причине, оно будет правильно нарисовано в соответствии с состоянием.

  3. Чтобы активировать «кнопку», переопределите OnMouseClick.

    В этом методе просто вызовите TabPages.Remove (). Если вы хотите стать модным, запустите событие BeforeTabClose, чтобы уведомить приложение и позволить ему подавить или отменить действие.

...