2009-02-13 3 views
5

Предположим, что для каждой формы в приложении WinForms вы хотите поменять курсор на WaitCursor. Очевидный способ сделать это было бы добавить код в любое место, где конкретизируется форма/показанное:VB.NET 2005 - «Глобальный» обработчик событий?

Try 
    Me.Cursor = Cursors.WaitCursor 

    Dim f As New frmMyForm 
    f.Show() 

Catch ex As Exception 
    Throw 
Finally 
    Me.Cursor = Cursors.Default 
End Try 

Однако, мне было интересно, если есть способ сказать приложению, «Всякий раз, когда какая-либо форма нагрузки события, покажите WaitCursor. Когда событие формы Shown будет завершено, верните курсор на значение по умолчанию. " Таким образом, код Me.Cursor может быть только в одном месте и не разбросано по всему приложению, - и не забывать помещать его в каждый экземпляр формы.

Предполагаете, что вы можете подклассифицировать обычный класс формы и добавить настройки курсора в переопределенное событие, но я считаю, что вы теряете способность визуального дизайнера при подклассе объекта Form.

+0

Надеюсь, вы знаете, что часть Catch совершенно бессмысленна? (И должно быть опущено) –

+0

У меня есть другой код в моих блоках Catch. Это упрощенный пример. – HardCode

ответ

2

Чтобы ответить на ваш вопрос - глобальных событий .Net не хватает, чтобы достичь того, чего вы хотите. Нет никакого чистого решения .net. Вы можете взглянуть на ориентированное на Аспект программирование и проблемы с перекрестными срезами - для этого может быть решение AOP (некоторые поисковые запросы помогут вам начать, а затем вернитесь сюда для подробностей).

Однако последующее является скорее идеей, а не полным решением относительно того, как вы можете достичь этого, используя обмен сообщениями win32.

  1. Вам необходимо выяснить, какие сообщения win32 соответствуют событию Load и если есть сообщение win32, которое всегда происходит после события загрузки. Один из кандидатов для события загрузки может быть WM_SHOWWINDOW, но я не уверен.
  2. Написать класс фильтра сообщений (то есть реализовать IMessageFilter).
  3. В методе PreMessageFilter класса фильтра сообщений проверьте тип сообщения, и если это сообщение WM_SHOWWINDOW (или что-то еще) с правильными параметрами, вы можете установить/сбросить курсор (используя Cursor.Current = Cursors.WaitCursor - снова вам нужно чтобы проверить это)
+0

Звучит как идея. Благодаря! Я займусь этим. – HardCode

3

Подкласс - это вариант, вы не теряете конструктора, если вы не устанавливаете суперкласс как mustinherit, это не очень нравится.

1

Другим вариантом, который не связан с подклассом, является добавление метода расширения в тип формы. Затем вы можете просто вызвать свой метод расширения (что-то вроде ShowAndWait()) вместо show. Вы даже можете позвонить в Show, если вы перегрузите его другой подписью.

+0

Я мог бы ввести в заблуждение мою терминологию, но не являются ли методы расширения, новые для VS.NET 2008? Я использую 2005. Если нет, тогда я попробую это. – HardCode

+0

Вы правы. Они новы к 2008 году –