ActiveX control c пониманием дела :-) (без MFC и ATL)
Не могу найти примера, где создавался бы реальный ActiveX control без использования ATL или MFC.
Если у кого-нибудь есть такой tutorial или знаете где взять, помогите plz. В принципе, туториал может быть и не нужен. Нужен ответ на вопрос, чем отилчаются друг от друга ActiveX, COM и OLE? Я понимаю что такое COM. Помогите найти определение, что такое ActiveX. Какие интерфейсы должен имплементировать COM-объект, чтобы он мог смог отображать себя в окне клиентской программы? На уровне моего понимания, последний вопрос сформулирован правильно. Это вопрос, ответ на который для меня наиболее интересен. Если же на него нельзя дать ответ (неправильный вопрос), то объясните почему :-) Илья. |
Почитай туторал (хотя бы борландовский).
COM - достаточно описать IUnknown OLE - COM + твой класс-сервер должен предоставлять кучк интерфейсов, связанных со встраиванием твоего документа в чужую программу. ActiveX - OLE + Ты должен описать метаданные твоего класса, т.е. IDispatch, typelib В хелпе приведены подробные списки интерфейсов, какой за что отвечает и примеры реализации Цитата:
IOleWindow The base interface. Implemented and used by containers and objects to window handles and manage context-sensitive help. IOleInPlaceObject Implemented by objects and used by an object's immediate container to activate and deactivate the object. IOleInPlaceActiveObject Implemented by objects and used by the top-level container to manipulate the object while it is active. Provides a direct channel of communication between an active object and its frame and document windows. IOleInPlaceUIWindow Implemented by containers and used by objects to manipulate the container's document window. IOleInPlaceFrame Implemented by containers and used by objects to control the container's frame window. IOleInPlaceSite Implemented by containers and used by objects to interact with the in-place client site. These interfaces can be arranged in three hierarchical levels with various interfaces implemented at each level. Calls that install user-interface menus and frame adornments, activate and switch between windows, and dispatch menu and keystrokes take place between the top-level container and the active object. Calls that support activating, deactivating, scrolling, or clipping span the containment hierarchy, with each level performing the correct actions. When to Implement The inherited methods of this interface are implemented by all in-place objects and containers. When to Use Use this interface to obtain the window handle to the windows associated with in-place activation (frame, document, parent, and in-place object). It is also used to enter and exit context-sensitive help. |
Спасибо за ответ!
Но я всё равно не могу добиться того чего хочу. Мне нужно получить ActiveX-дилог. То есть, чтобы у меня было окошко с набором элементов управления, которое бы умело отображаться в IE. Прямых рецептов как это сделать я не нашёл. Я не понимаю где "котейнер" берет окно "элемента управления". Я попробовал написать COM объект, который бы имплеметировал IOleWindow::GetWindow. Думал, что контейнер дёргает эту функцию, когда хочет элемент отобразить. В моей реализации создавалось окно с текстом. Это окно я хотел выдавать через GetWindow. Однако в IE как оторажался белый квадрат, так отображается. :-( |
Мне нужно сделать, чтобы в качестве ActiveX-элемента в окне эксплорера отображался диалог.
Это нужно сделать без использования MFC или ATL. Я понимаю как можно сделать, чтобы элемент себя отрисовывал на контекте. Но в случае с дилогом это не подходит. Нужно каким-то обрахом передавать контейнеру окно диалога. (Или не нужно? Поправте меня). Однако у меня так и не получилось создать окно с закрашенной, клиентской частью, и передать его контейнеру так, чтобы оно отобразилось в IE. Я попытался сделать это следующим образом: 1. Имплементировал IOleInPlaceActiveObject и IOleObject 2. в реализации метода SetClientSite сделал m_pFrame->SetActiveObject(this, NULL). Код:
virtual HRESULT STDMETHODCALLTYPE SetClientSite( которого, при обработке WM_PAINT, клиентская часть заполняется цветом десктопа. Однако это не приводит к желаемому результату. Окно activex-элемента в IE так и остаётся белым. Чтобы донести до контейнера, что нужно отрисовывать окно, я пробовал вызывать. m_pFrame->Show, m_pClientSite->OnInPlaceActivate(), pInPlaceSite->OnUIActivate(); m_pClientSite->ShowObject() m_pFrame->GetWindow(&hwnd); ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd); Не помогает. Во время выполненеия программы ни разу не было послано сообщение WM_PAINT моему окну. |
Отбой! Проблема разрешилась (частично)
|
Время: 16:22. |
Время: 16:22.
© OSzone.net 2001-