Войти

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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

141277
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Примечание.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 — последний просмотр: 02/23/2014 01:06:29 — редакция: 2.0

  • Microsoft Foundation Class Library 4.2
  • kbnosurvey kbarchive kbarchitecture kbctrl kbhowto kbmt KB141277 KbMtru
Отзывы и предложения