Привет всем.
Есть ActiveX который открывается в IE. представляет оч. простое подобие файлового менеджера. ( но это лирика ).
Так вот я сделал обработчик нажатия правой кнопки мыши, по клику вываливаю свое меню, и вот если на моем меню еще
раз кликнуть правой кнопкой, то появляется следующее
и IE подвисает . Что это такое не знаю,но есть подозрение что это контекстное меню IE...
Никто не знает как побороть?
вот обработчик, но вроде ничего крамольного в нем не заметил
В IE 7 точно видно что это прорисовывается контекстное меню IE, поверх моего .
Хотелось бы его совсем отключить, всмысле меню IE, прочитал Избавляемся от контекстного меню
, отнаследовал свой 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
, но 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
А на странице, которая отображает этот контрол вообще отключено контекстное меню самого експлорера?
Надо отключать, если не собираетесь им пользоваться. В javascripte написать что-то типа:
для всех документов (ну тоесть вынести в файл какой-нить .js и всегда его подключать)
document.oncontextmenu = oncontextH;
function oncontextH(e)
{ return false; }
Здравствуйте, 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
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>
Здравствуйте, fregate, Вы писали:
F>Здравствуйте, pigeon, Вы писали:
F>А на странице, которая отображает этот контрол вообще отключено контекстное меню самого експлорера? F>Надо отключать, если не собираетесь им пользоваться. В javascripte написать что-то типа:
F>для всех документов (ну тоесть вынести в файл какой-нить .js и всегда его подключать)
F>document.oncontextmenu = oncontextH; F>function oncontextH(e) F>{ return false; }
Javascript — это очень здорово, только его можно отключить в IE, причём глобально.
Здравствуйте, unton, Вы писали:
U>Javascript — это очень здорово, только его можно отключить в IE, причём глобально.
Да, вы правы. Если смотреть через ie, то можно отключить, как в таком случае включить — я не знаю, но точно знаю, что можно (так как есть flash — у кторого свое меню)
Но если хостить программу в каком-нить chtmlview, то там можно в обязательном порядке сказать, что бы скрипты исполнялись. Вне зависимости от того, что стоит в настройках ие.