Как изменить интерфейс в приложениях MFC с помощью Visual C++Примечание.Microsoft Visual C++ NET (2002) поддерживаются обе модели управляемого кода, предоставляемые .NET Framework и неуправляемым собственный Windows модели кода. Информация в данной статье относится к неуправляемой Visual C++ только код.
Примечание.Microsoft Visual C++ 2005 поддерживает оба модель управляемого кода, предоставляемых .NET Framework и неуправляемым Windows собственные модели кода. В приложении MFC можно переопределить существующие интерфейсы в классе, также предоставляют дополнительные интерфейсы. В этом случае изменение интерфейса является синонимом замены интерфейса. Приведенный в данной статье показано, как изменить интерфейс в классе, оставляя исходную реализацию интерфейса, таким образом, чтобы ее можно делегировать с помощью новой реализации интерфейса. В данной статье не работают с переопределить реализацию интерфейса IDispatch, поскольку это особый случай.Для получения дополнительных сведений о том, как переопределить IDispatch в MFC щелкните следующий номер статьи базы знаний Майкрософт: 140616
(http://support.microsoft.com/kb/140616/
)
Замена реализации MFC IDispatch Эти действия будут переопределены IOleObject реализацию по умолчанию элемент управления OLE создается с помощью мастера создания элемента управления. - Чтобы добавить объявление IOleObject реализации элемента управления, добавьте следующий код в файл заголовка для класса, производного COleControl:
// Interface Maps
protected:
// IOleObject
BEGIN_INTERFACE_PART(MyOleObject, IOleObject)
INIT_INTERFACE_PART(CIOleOverCtrl, MyOleObject)
STDMETHOD(SetClientSite)(LPOLECLIENTSITE);
STDMETHOD(GetClientSite)(LPOLECLIENTSITE*);
STDMETHOD(SetHostNames)(LPCOLESTR, LPCOLESTR);
STDMETHOD(Close)(DWORD);
STDMETHOD(SetMoniker)(DWORD, LPMONIKER);
STDMETHOD(GetMoniker)(DWORD, DWORD, LPMONIKER*);
STDMETHOD(InitFromData)(LPDATAOBJECT, BOOL, DWORD);
STDMETHOD(GetClipboardData)(DWORD, LPDATAOBJECT*);
STDMETHOD(DoVerb)(LONG, LPMSG, LPOLECLIENTSITE, LONG, HWND,
LPCRECT);
STDMETHOD(EnumVerbs)(IEnumOLEVERB**);
STDMETHOD(Update)();
STDMETHOD(IsUpToDate)();
STDMETHOD(GetUserClassID)(CLSID*);
STDMETHOD(GetUserType)(DWORD, LPOLESTR*);
STDMETHOD(SetExtent)(DWORD, LPSIZEL);
STDMETHOD(GetExtent)(DWORD, LPSIZEL);
STDMETHOD(Advise)(LPADVISESINK, LPDWORD);
STDMETHOD(Unadvise)(DWORD);
STDMETHOD(EnumAdvise)(LPENUMSTATDATA*);
STDMETHOD(GetMiscStatus)(DWORD, LPDWORD);
STDMETHOD(SetColorScheme)(LPLOGPALETTE);
END_INTERFACE_PART(MyOleObject)
DECLARE_INTERFACE_MAP();
Вложенный класс XMyOleObject добавляется в класс элемента управления. Обратите внимание, что эти макросы объявления методов интерфейса, включая методы интерфейса IUnknown, поэтому необходимо реализовать эти методы IUnknown. - Добавьте интерфейс IOleObject карта интерфейса для элемента управления, добавляя макрос INTERFACE_PART файл реализации для элемента управления:
BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
END_INTERFACE_MAP()
Замените на имя элемента управления и MyOleObject с именем, выбранным для вложенного класса, который поддерживает IOleObject CIOleOverCtrl. - Реализуйте методы интерфейса, который был объявлен. Добавьте следующий код в файл реализации для элемента управления:
STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::AddRef()
{
METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.AddRef();
}
STDMETHODIMP_(ULONG) CIOleOverCtrl::XMyOleObject::Release()
{
METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.Release ();
}
STDMETHODIMP CIOleOverCtrl::XMyOleObject::QueryInterface(
REFIID iid, LPVOID far* ppvObj)
{
METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.QueryInterface ( iid, ppvObj);
}
STDMETHODIMP
CIOleOverCtrl::XMyOleObject::SetClientSite(LPOLECLIENTSITE
pClientSite)
{
METHOD_MANAGE_STATE(CIOleOverCtrl, MyOleObject)
ASSERT_VALID(pThis);
return pThis->m_xOleObject.SetClientSite ( pClientSite );
}
...
Остальные методы следовать той же схеме, где CIOleOverCtrl представляет собой имя элемента управления, XMyOleObject — это имя вложенного класса, который поддерживает IOleObject и m_xMyOleObject вычисляется путем удаления я из интерфейса, поддерживаемых и добавление m_x. Обратите внимание на то, что эти методы просто передать вызов IOleObject исходной реализации. Однако это не является обязательным, можно добавлять функциональные возможности и делегировать на исходную реализацию или делегат, не совсем. Технические примечания # 38 и # 39. Код статьи: 141277 - Последнее изменение :: 13 ноября 2010 г. - Редакция: 2.0 Информация в данной статье относится к следующим продуктам.- Microsoft Foundation Class Library 4.2 на следующих платформах
- Microsoft Visual C++ 2.1
- Microsoft Visual C++ 2.2
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ .NET 2002 Standard Edition
- Microsoft Visual C++ .NET 2003 Standard Edition
- Microsoft Visual C++ 2005 Express Edition
| kbarchitecture kbctrl kbhowto kbmt KB141277 KbMtru |
Переведено с помощью машинного переводаВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода. Эта статья на английском языке: 141277
(http://support.microsoft.com/kb/141277/en-us/
)
| |