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

Тема в разделе ".NET", создана пользователем Bloodius Baggins, 23 дек 2006.

  1. Bloodius Baggins

    Bloodius Baggins Гость

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

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

    eisernWolf Гость

    Ну а что если фильтровать сообщения Windows, которые посылаются в окно OCX контрола, и WM_RBUTTONDOWN забирать себе?
     
  3. Bloodius Baggins

    Bloodius Baggins Гость

    Наверное, должно бы сработать, но только как это реализовать?
     
  4. karlito

    karlito Гость

    Код (Text):
            /// <summary>
    /// Processes Windows messages.
    /// </summary>
    /// <param name="m">The Windows <see cref="Message"/> to process.</param>
    [SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode=true)]
    protected override void WndProc(ref Message m)
    {
    if(m.Msg == Interop.OCM_NOTIFY)
    {
    NMHDR phdr = (NMHDR)Marshal.PtrToStructure(m.LParam, typeof(NMHDR));
    switch(phdr.code)
    {
    case (int)LVN.GETDISPINFOW:
    {
    NMLVDISPINFO pinfo = (NMLVDISPINFO)Marshal.PtrToStructure(m.LParam, typeof(NMLVDISPINFO));
    LvnDispInfoNotice(ref pinfo);
    break;
    }
    case (int)LVN.ODCACHEHINT:
    {
    NMLVCACHEHINT cachehint = (NMLVCACHEHINT)Marshal.PtrToStructure(m.LParam, typeof(NMLVCACHEHINT));
    LvnCacheHint(cachehint);
    break;
    }
    case (int)LVN.ODFINDITEMW:
    {
    NMLVFINDITEM lvfindItem = (NMLVFINDITEM)Marshal.PtrToStructure(m.LParam, typeof(NMLVFINDITEM));
    m.Result=(IntPtr)LvnFindItem(lvfindItem);
    return;
    }
    }
    }
    else
    if(m.Msg == (int)LVM.GETITEMW)
    {
    LVITEM lvitem = (LVITEM)Marshal.PtrToStructure(m.LParam, typeof(LVITEM));
    if(LvmGetItem(ref lvitem))
    Marshal.StructureToPtr(lvitem, m.LParam, true);
    return;
    }

    base.WndProc(ref m);

    if(m.Msg == (int)LVM.INSERTITEMW)
    {
    LVITEM lvitem = (LVITEM)Marshal.PtrToStructure(m.LParam, typeof(LVITEM));
    AfterLvmInsertItem(lvitem, ((int)m.Result));
    return; //no need to let any one to insert items in VIRTUAL LV in a such a way
    }
    }
    Выдрал кусок кода из custom virtual list view, который когда-то разрабатывал.
     
  5. Bloodius Baggins

    Bloodius Baggins Гость

    Спасибо. Осталось только разобраться, как это дело под VB.NET переписать :)
     
Загрузка...
Похожие Темы - Блокировка контекстного меню
  1. PuffDaddy87
    Ответов:
    0
    Просмотров:
    1.380
  2. k85
    Ответов:
    3
    Просмотров:
    1.170
  3. Сстранник
    Ответов:
    2
    Просмотров:
    1.920
  4. beloff
    Ответов:
    26
    Просмотров:
    4.690
  5. Lariel
    Ответов:
    3
    Просмотров:
    2.950

Поделиться этой страницей