непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 05.01.07 10:25
Оценка:
Привет всем.
Есть ActiveX который открывается в IE. представляет оч. простое подобие файлового менеджера. ( но это лирика ).
Так вот я сделал обработчик нажатия правой кнопки мыши, по клику вываливаю свое меню, и вот если на моем меню еще
раз кликнуть правой кнопкой, то появляется следующее



и IE подвисает . Что это такое не знаю,но есть подозрение что это контекстное меню IE...
Никто не знает как побороть?

вот обработчик, но вроде ничего крамольного в нем не заметил

LRESULT CDiskListView::OnNMRClick(LPNMHDR pnmh)
{
    LPNMITEMACTIVATE item = (LPNMITEMACTIVATE)pnmh;
    if( item->iItem!=-1 )
    {    
        HMENU hMenu = ::LoadMenu( /*GetModuleHandle( 0 )*/ _AtlBaseModule.m_hInst , MAKEINTRESOURCE( IDR_MENU1 ) );
        HMENU hSubMenu = ::GetSubMenu( hMenu , 0 );

        POINT pt;
        GetCursorPos(&pt);    
        TrackPopupMenu( hSubMenu , TPM_LEFTALIGN , pt.x , pt.y , 0 , m_hWnd , 0 );
        return TRUE;
    }
    return TRUE;
}


Спасибо.
winamp Высоцкий — Здесь вам не равнина
Premature optimization is the root of all evil in programming. Donald Knuth
Re: непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 22.01.07 11:14
Оценка:
up
winamp Чайф — 05. Не дай мне повод
Premature optimization is the root of all evil in programming. Donald Knuth
Re: непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 22.01.07 12:30
Оценка:
Здравствуйте, pigeon, Вы писали:

Попробую сформулировать по другому

В IE 7 точно видно что это прорисовывается контекстное меню IE, поверх моего .
Хотелось бы его совсем отключить, всмысле меню IE, прочитал Избавляемся от контекстного меню
Автор(ы): Тимофей Чадов
Дата: 24.08.2001
, отнаследовал свой ActiveX от IDocHostUIHandler реализовал свой метод ShowContextMenu , но я в него даже не попадаю.
Собственно вопрос — можна ли так делать наследовать свой ActiveX от IDocHostUIHandler и если можна, то что не так.

class CDocHostUIHandlerImpl : public IDocHostUIHandler
{
public:
    // IDocHostUIHandler

    STDMETHOD( ShowContextMenu )(  
        /* [in] */ DWORD dwID,
        /* [in] */ POINT *ppt,
        /* [in] */ IUnknown *pcmdtReserved,
        /* [in] */ IDispatch *pdispReserved)
    { 
        return S_OK; 
    }

    // все остальные методы IDocHostUIHandler
    
};


class ATL_NO_VTABLE CMyActiveX : 
    public IPersistStreamInitImpl<CMyActiveX>,
    public IOleControlImpl<CMyActiveX>,
    public IOleObjectImpl<CMyActiveX>,
    public IOleInPlaceActiveObjectImpl<CMyActiveX>,
    public IViewObjectExImpl<CMyActiveX>,
    public IOleInPlaceObjectWindowlessImpl<CMyActiveX>,
    public IPersistStorageImpl<CMyActiveX>,
    public ISpecifyPropertyPagesImpl<CMyActiveX>,
    public IQuickActivateImpl<CMyActiveX>,
    public IDataObjectImpl<CMyActiveX>,
    public IProvideClassInfo2Impl<&__uuidof(CMyActiveX), NULL>,
    public CComCompositeControl<CMyActiveX>,
    public IDispatchImpl<CMediatorRefImpl<IMyActiveX>, &__uuidof(IMyActiveX), &LIB_GUID>,
    public CDocHostUIHandlerImpl
{
public:

...

BEGIN_COM_MAP(CMyActiveX)
    COM_INTERFACE_ENTRY(IObjectSafety)
    COM_INTERFACE_ENTRY(IObjectSafetySiteLock)
    COM_INTERFACE_ENTRY(IMyActiveX)
    COM_INTERFACE_ENTRY(IDocHostUIHandler)
END_COM_MAP( )
...
};
winamp Чайф — 06. С войны
Premature optimization is the root of all evil in programming. Donald Knuth
Re: непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 08.02.07 08:06
Оценка:
Здравствуйте, pigeon, Вы писали:

Отвечу себе сам .

Сначала пытался сделать как советовал algol Re: Обработчик нажатия правой кнопки
Автор: algol
Дата: 29.01.07
, но PreTranslateAccelerator у меня не вызывался , проблема возникала при вызове ф-и TrackPopupMenu изменив свой обработчик на ( в MSDN нашел пример ) на

LRESULT CDiskListView::OnNMRClick(LPNMHDR pnmh)
{
    //for ListView - (LPNMITEMACTIVATE)pnmh
    //for StatusBar    - (LPNMMOUSE)pnmh
    //for ToolBar    - (LPNMMOUSE)pnmh
    //Return nonzero to not allow the default processing
    LPNMITEMACTIVATE item = (LPNMITEMACTIVATE)pnmh;

        POINT pt;
        GetCursorPos(&pt);    

        SetForegroundWindow(m_hWnd);

        // Display the menu
        TrackPopupMenu(   m_contextMenu.GetSubMenu(0),
            TPM_RIGHTBUTTON,
            pt.x,
            pt.y,
            0,
            m_hWnd,
            NULL);

        ::PostMessage(m_hWnd, WM_NULL, 0, 0);
        return TRUE;
    }
    return TRUE;
}


проблема исчезла , может временно может навсегда.
Кто-нибудь объяснит?
winamp интернеееееет
Premature optimization is the root of all evil in programming. Donald Knuth
Re[2]: непонятки с меню в ActiveX
От: fregate Россия  
Дата: 12.02.07 10:19
Оценка: 2 (1)
Здравствуйте, pigeon, Вы писали:

А на странице, которая отображает этот контрол вообще отключено контекстное меню самого експлорера?
Надо отключать, если не собираетесь им пользоваться. В javascripte написать что-то типа:

для всех документов (ну тоесть вынести в файл какой-нить .js и всегда его подключать)

document.oncontextmenu = oncontextH;
function oncontextH(e)
{ return false; }
Re[3]: непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 12.02.07 10:44
Оценка:
Здравствуйте, fregate, Вы писали:

F>А на странице, которая отображает этот контрол вообще отключено контекстное меню самого експлорера?

F>Надо отключать, если не собираетесь им пользоваться. В javascripte написать что-то типа:

F>для всех документов (ну тоесть вынести в файл какой-нить .js и всегда его подключать)


F>document.oncontextmenu = oncontextH;

F>function oncontextH(e)
F>{ return false; }

Нет не выключен. Я встречал подобное решение, но не знаю как его прикрутить,я в js ни в зуб ногой.
Т.е если перед стартом моего ActiveX ( там есть ф-я Start ), которая и отображает контрол, сделать

document.oncontextmenu = oncontextH; 
function oncontextH(e)
{   return false;   }

то оно будет отключено?
А включить его потом можна или вернуть дефолтный обработчик???
Спасибо.
winamp Высоцкий — Здесь вам не равнина
Premature optimization is the root of all evil in programming. Donald Knuth
Re[4]: непонятки с меню в ActiveX
От: fregate Россия  
Дата: 13.02.07 09:42
Оценка: 2 (1)
Здравствуйте, pigeon, Вы писали:


P>Есть ActiveX который открывается в IE. представляет оч. простое подобие файлового менеджера. ( но это лирика ).


Каким образом контрол этот в IE появляется?
Он должен быть описан в html странице, типа
<object clsid="clsid:some-guid"></object>

ну вот в этой странице и написать

<html>
<head>
<script language=javascript src=contenx.js /> // или прямо тут и написать, то, что выше приводилось
</head>
<body>
<object ...></object>
</body>
</html>
Re[5]: непонятки с меню в ActiveX
От: pigeon Великобритания
Дата: 13.02.07 10:53
Оценка:
Здравствуйте, fregate, Вы писали:


F>Каким образом контрол этот в IE появляется?

F>Он должен быть описан в html странице, типа
F><object clsid="clsid:some-guid"></object>

Спасибо, таким образом и появляется
        <object id="Object" classid="clsid:3FE73D88-72F5-4526-A106-FAA12DE9A619" width="0" height="0"> </object>
winamp SmokerMan — Песня о программистской молодости
Premature optimization is the root of all evil in programming. Donald Knuth
Re[3]: непонятки с меню в ActiveX
От: unton Россия  
Дата: 28.03.07 09:55
Оценка:
Здравствуйте, fregate, Вы писали:

F>Здравствуйте, pigeon, Вы писали:


F>А на странице, которая отображает этот контрол вообще отключено контекстное меню самого експлорера?

F>Надо отключать, если не собираетесь им пользоваться. В javascripte написать что-то типа:

F>для всех документов (ну тоесть вынести в файл какой-нить .js и всегда его подключать)


F>document.oncontextmenu = oncontextH;

F>function oncontextH(e)
F>{ return false; }


Javascript — это очень здорово, только его можно отключить в IE, причём глобально.
Re[4]: непонятки с меню в ActiveX
От: fregate Россия  
Дата: 29.03.07 08:09
Оценка:
Здравствуйте, unton, Вы писали:

U>Javascript — это очень здорово, только его можно отключить в IE, причём глобально.


Да, вы правы. Если смотреть через ie, то можно отключить, как в таком случае включить — я не знаю, но точно знаю, что можно (так как есть flash — у кторого свое меню)
Но если хостить программу в каком-нить chtmlview, то там можно в обязательном порядке сказать, что бы скрипты исполнялись. Вне зависимости от того, что стоит в настройках ие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.