Страница: 1 |
Страница: 1 |
Вопрос: Не блокируется комбобокс
Добавлено: 26.11.07 11:48
Автор вопроса: PVV
Почему приведенный ниже код не запрещает доступ к текстовому полю комбобокса? В поле можно вводить символы, открывать список клавишами ALT + стрелка вниз, хотя другие контролы (checkbox, textbox, datetimepicker) таким кодом блокируются. Подскажите, как сделать?
Public Class cmbBoxN
Inherits System.Windows.Forms.ComboBox
Private _Block As Boolean = False
Public Property Block() As Boolean
Get
Return _Block
End Get
Set(ByVal value As Boolean)
_Block = value
Invalidate()
End Set
End Property
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If _Block = True Then
Select Case m.Msg
Case WM_MOUSEACTIVATE
Return
Case WM_SETFOCUS
Return
Case WM_LBUTTONDOWN
Return
Case WM_SYSKEYDOWN
Return
Case WM_LBUTTONDBLCLK
Return
End Select
End If
MyBase.WndProc(m) ' Передаем события дальше
End Sub
End Class
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #1
Добавлено: 26.11.07 12:29
Return
Возврат чего? Надо MA_NOACTIVATEANDEAT.
Return
Номер ответа: 2
Автор ответа:
PVV
Вопросов: 8
Ответов: 21
Профиль | | #2
Добавлено: 26.11.07 14:40
Константы вида WM_MOUSEACTIVATE и другие я взял из приложения к статье Гайдара Магданурова "Subclassing в VB.NET" и пользую их, как подсказали в соседней теме. Константы MA_NOACTIVATEANDEAT там нет. Где посмотреть, чему она равна, да и про остальные в основной массе - полный туман.
А насчет "возврат чего?":
Case WM_MOUSEACTIVATE
Return
Как я понимаю, это должно блокировать выполнение стандартной процедуры обработки данного сообщения… или трудно жить с фанерной головой.
EUGY, прокомментируй пожалуйста свой код для тех, кто на бронепоезде.
Номер ответа: 3
Автор ответа:
EUGY
Вопросов: 0
Ответов: 454
Профиль | | #3
Добавлено: 26.11.07 15:19
Попробую объяснить своими словами.
Классическая оконная процедура в WIN32 - это функция. И как любая функция она принимает аргументы и возвращает результат.
Её вызов идет из ядра системы и в зависимости от возвращаемого результата ядро выполняет тот или иной код.
Мне, например, непривычно видеть, что в .NET это не Function, а Sub и возвращаемое значение прячется в m.Result, но сути это не меняет.
Что касаемо WM_MOUSEACTIVATE, то согласно MSDN, возвращаемые значения могут быть такими:
Activates the window, and does not discard the mouse message.
MA_ACTIVATEANDEAT
Activates the window, and discards the mouse message.
MA_NOACTIVATE
Does not activate the window, and does not discard the mouse message.
MA_NOACTIVATEANDEAT
 oes not activate the window, but discards the mouse message.
Есть.
* WM_MOUSEACTIVATE Return Codes
*/
#define MA_ACTIVATE 1
#define MA_ACTIVATEANDEAT 2
#define MA_NOACTIVATE 3
#define MA_NOACTIVATEANDEAT 4
Номер ответа: 4
Автор ответа:
PVV
Вопросов: 8
Ответов: 21
Профиль | | #4
Добавлено: 26.11.07 17:59
EUGY, спасибо, понял куда вставить, заработало.
Я нашел описание этих всех WM_xxx в MSDN, буду изучать, спасибо.
Номер ответа: 5
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #5
Добавлено: 27.11.07 02:01
Номер ответа: 6
Автор ответа:
PVV
Вопросов: 8
Ответов: 21
Профиль | | #6
Добавлено: 27.11.07 13:03
В смысле - ссылку, где нашел? В окне, которое вылетает при нажатии F1 в поле "Filtered by:" я забил "Platform SDK", а в поле "Look for" - "WM_*" и их там целая куча (жаль только на английском).