Блокировка контекстного меню...

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Bloodius Baggins
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 13.12.2006 (Ср) 9:48

Блокировка контекстного меню...

Сообщение Bloodius Baggins » 23.12.2006 (Сб) 11:23

Здравствуйте :)

Такая проблема возникла. Юзаю CodeSence Control (OCX версию, других нет) в проекте на VB.NET (то есть раньше проект был на VB6, но теперь есть необходимость переписать под VB.NET). Так вот, в этот контрол вшито контекстное меню (будь оно проклято), которое появляется каждый раз по клику правой кнопокой мыши на контроле.
В VB6 я избавлялсо от этого api-функцией LockWindowUpdate, которая под дотНетом не помогает.
Вопреки заверениям личностей, которые "давно когда-то работали" с этим контролом и его прародителем CodeMax, никакого свойства, отвечающего за отображение/неотображение этого меню, там нету.
Установка свойства ContextMenu, которое добавляет (?) дотНет к контролам, наследующим TextBox (опять-таки ?), не спасает, все равно вылазит родное меню.
Может быть, кто-то знает, как заблокировать эту гадость и отображать по RClick'y свое меню, какое мне надо? Буду очень признателен за помощь.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 23.12.2006 (Сб) 11:55

А почему не помогает LockWindowUpdate?
Весь мир матрица, а мы в нем потоки байтов!

Bloodius Baggins
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 13.12.2006 (Ср) 9:48

Сообщение Bloodius Baggins » 23.12.2006 (Сб) 16:52

Черт его знает.
Вот что я писал в VB6:
Код: Выделить всё
Private Declare Function LockWindowUpdate Lib "User32" (ByVal hwndLock As Long) As Long

Private Function Text1_MouseDown(ByVal Control As CodeSenseCtl.ICodeSense, ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long) As Boolean

If Button = vbRightButton Then
    LockWindowUpdate Text1.hwnd
    DoEvents
    PopupMenu form.menu
    LockWindowUpdate 0&
End If

End Function


А вот как пишу в VB.NET:
Код: Выделить всё
Public Class Form1

    Private Declare Function LockWindowUpdate Lib "User32" (ByVal hwndLock As Long) As Long

    Private Function Text1_MouseDownEvent(ByVal sender As Object, ByVal e As AxCodeSense.ICodeSenseEvents_MouseDownEvent) As Boolean Handles code.MouseDownEvent
        If e.button = Windows.Forms.MouseButtons.Right Then
            LockWindowUpdate(Text1.hWnd)
            ContextMenuStrip1.Show()
            LockWindowUpdate(0)
        End If
    End Function

End Class



В первом случае работало, а во втором - не хочет. Может, я чего неправильно пишу или объявляю...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.12.2006 (Сб) 17:36

Всё неправильно объявляешь.
Документацию по vb.net даже на русский перевели, большой раздел написали "В чём отличия от VB6", нет, всё равно никому оно не надо.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Bloodius Baggins
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 13.12.2006 (Ср) 9:48

Сообщение Bloodius Baggins » 23.12.2006 (Сб) 21:58

Покурил переводы, покурил MSDN.
Все равно не понятно. Меняю тип Long на Integer, переписываю объявление по MSDN'овскому - не работает. Лыжи не едут :)
Поскольку я вокруг API с бубном не прыгал, обширных и доступных переводов не выполнял, лавров заклинателя дождя не стяжал, сделайте пожалуйста уж скидочку на мой низкий интеллектуальный уровень, будьте так добры...
Как мне все-таки правильно объявить эту проклятую функцию, а?
(btw мне начинает казаццо, что я не то событие обрабатываю...)
И если все-таки не поможет, есть ли какой-нибудь другой способ?
Спасибо, Папы :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.12.2006 (Сб) 23:01

Bloodius Baggins писал(а):Меняю тип Long на Integer, переписываю объявление по MSDN'овскому

Результат в студию.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Bloodius Baggins
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 13.12.2006 (Ср) 9:48

Сообщение Bloodius Baggins » 24.12.2006 (Вс) 11:15

Из секции Help for Visual Basic 6.0 Users -> Windows API Programming for Visual Basic 6.0 Users -> Declare Statement.
Код: Выделить всё
Declare Function getUserName Lib "advapi32.dll" Alias "GetUserNameA" _
    (ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub getUser()
    Dim buffer As String = New String(CChar(" "), 25)
    Dim retVal As Integer = getUserName(buffer, 25)
    Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
    MsgBox(userName)
End Sub


Я в полном соответствии с этим пишу:
Код: Выделить всё
Public Class Form1
Declare Function LockWindowUpdate Lib "User32.dll" Alias "LockWindowUpdate"_
   (ByVal hwnd As Integer) As Integer
...
End Class

А дальше - как тремя постами выше (ну, обработка события).
Делаю это согласно статье Help for Visual Basic 6.0 Users -> Language Changes for Visual Basic 6.0 Users -> Data Type Changes for Visual Basic 6.0 Users -> Long Data Type (Visual Basic). Там сказано:
If you are interfacing with components not written for the .NET Framework, for example Automation or COM objects, keep in mind that Long has a different data width (32 bits) in other environments. If you are passing a 32-bit argument to such a component, declare it as Integer instead of Long in your new Visual Basic code.


Спасибо, кстати, за код, о котором я просил :)

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.12.2006 (Вс) 11:28

Не знаю. На текстбоксе всё работает.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Bloodius Baggins
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 13.12.2006 (Ср) 9:48

Сообщение Bloodius Baggins » 24.12.2006 (Вс) 14:05

Кроме LockWindowUpdate способов нет?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 14

    TopList