Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
Case WM_MOUSEACTIVATE
                    Return

Возврат чего? Надо MA_NOACTIVATEANDEAT.
m.Result = New IntPtr(4)
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, возвращаемые значения могут быть такими:
MA_ACTIVATE
 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
 ;Does not activate the window, but discards the mouse message.

Константы MA_NOACTIVATEANDEAT там нет

Есть.

/*
 * 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
Я нашел описание этих всех WM_xxx в MSDN, буду изучать, спасибо.
С поиском проблемы. Дай ссылку.

Ответить

Номер ответа: 6
Автор ответа:
 PVV



Вопросов: 8
Ответов: 21
 Профиль | | #6 Добавлено: 27.11.07 13:03
В смысле - ссылку, где нашел? В окне, которое вылетает при нажатии F1 в поле "Filtered by:" я забил "Platform SDK", а в поле "Look for" - "WM_*" и их там целая куча (жаль только на английском).

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам