Как изменить интерфейс в приложениях MFC с помощью Visual C++

Переводы статьи Переводы статьи
Код статьи: 141277 - Vizualiza?i produsele pentru care se aplic? acest articol.
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Примечание.Microsoft Visual C++ NET (2002) поддерживаются обе модели управляемого кода, предоставляемые .NET Framework и неуправляемым собственный Windows модели кода. Информация в данной статье относится к неуправляемой Visual C++ только код.

Примечание.Microsoft Visual C++ 2005 поддерживает оба модель управляемого кода, предоставляемых .NET Framework и неуправляемым Windows собственные модели кода.
Развернуть все | Свернуть все

Аннотация

В приложении MFC можно переопределить существующие интерфейсы в классе, также предоставляют дополнительные интерфейсы. В этом случае изменение интерфейса является синонимом замены интерфейса. Приведенный в данной статье показано, как изменить интерфейс в классе, оставляя исходную реализацию интерфейса, таким образом, чтобы ее можно делегировать с помощью новой реализации интерфейса.

В данной статье не работают с переопределить реализацию интерфейса IDispatch, поскольку это особый случай.Для получения дополнительных сведений о том, как переопределить IDispatch в MFC щелкните следующий номер статьи базы знаний Майкрософт:
140616Замена реализации MFC IDispatch

Дополнительная информация

Эти действия будут переопределены IOleObject реализацию по умолчанию элемент управления OLE создается с помощью мастера создания элемента управления.

  1. Чтобы добавить объявление 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.
  2. Добавьте интерфейс IOleObject карта интерфейса для элемента управления, добавляя макрос INTERFACE_PART файл реализации для элемента управления:
          BEGIN_INTERFACE_MAP(CIOleOverCtrl, COleControl)
             INTERFACE_PART(CIOleOverCtrl, IID_IOleObject, MyOleObject)
          END_INTERFACE_MAP()
    						
    Замените на имя элемента управления и MyOleObject с именем, выбранным для вложенного класса, который поддерживает IOleObject CIOleOverCtrl.
  3. Реализуйте методы интерфейса, который был объявлен. Добавьте следующий код в файл реализации для элемента управления:
          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 - Последний отзыв: 23 февраля 2014 г. - Revision: 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
Ключевые слова: 
kbnosurvey kbarchive kbarchitecture kbctrl kbhowto kbmt KB141277 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:141277

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com