TN071: MFC IOleCommandTarget 구현

IOleCommandTarget 인터페이스 개체 및 그들의 컨테이너를 서로 게 명령을 전달 수 있습니다. 예를 들어, 개체의 도구 모음 단추와 같은 인쇄, 인쇄 미리 보기, 저장, 새로 만들기, 확대/축소명령을 포함할 수 있습니다. 이러한 개체가 했다 IOleCommandTarget을 지 원하는 컨테이너에 포함 되어 있는 경우 개체는 해당 단추를 사용 하 고 사용자 들을 클릭할 때 처리 하는 컨테이너에 명령을 전달할 수 있습니다. 컨테이너 자체를 인쇄 하려면 포함 된 개체를 원하는 경우 그것은 포함 된 개체의 IOleCommandTarget 인터페이스를 통해 명령을 전송 하 여이 요청을 만들 수 있습니다.

IOleCommandTarget 는 자동화와 같은 인터페이스를 사용 하는 서버에서 메서드를 호출 하는 클라이언트에 의해 사용 됩니다. 그러나 프로그래머의 IDispatch 일반적으로 비싼 Invoke 메서드를 사용 하지 않아도 되므로 자동화 인터페이스를 통해 호출 하는 오버 헤드를 저장 IOleCommandTarget 을 사용 하 여。

MFC는 IOleCommandTarget 인터페이스 파견 명령을 서버에 액티브 문서 컨테이너 수 있도록 액티브 문서 서버에 의해 사용 됩니다. 액티브 문서 서버 클래스, CDocObjectServerItem, MFC 인터페이스 맵을 사용 하 여 (참조 TN038: MFC/OLE IUnknown 구현) IOleCommandTarget 인터페이스를 구현 하。

IOleCommandTarget 는 또한 COleFrameHook 클래스에서 구현 됩니다. COleFrameHook 는 제자리에서 편집 컨테이너의 프레임 창 기능을 구현 하는 문서화 되지 않은 MFC 클래스입니다. 또한 COleFrameHook MFC 인터페이스 맵을 사용 하 여 IOleCommandTarget 인터페이스를 구현 합니다. COleFrameHook의 구현의 IOleCommandTarget COleDocObjectItemOLE 명령 전달-액티브 문서 컨테이너를 파생 합니다. 이렇게 하면 포함 된 액티브 문서 서버에서 메시지를 받을 모든 MFC 액티브 문서 컨테이너。

MFC OLE 명령 지도

MFC 개발자가 활용할 수 IOleCommandTarget MFC OLE 명령 지도 사용 하 여. OLE 명령 지도 메시지 OLE 명령 명령 지도 포함 하는 클래스의 멤버 함수에 매핑할 사용할 수 있기 때문에 지도 처럼. 이 작업을 하려면 매크로 처리 명령을, OLE 명령 및 명령 ID의 OLE 명령 그룹을 지정 하려면 명령 지도에서 장소를 WM_COMMAND 메시지를 OLE 명령을 받으면 보내질 것 이다. 또한 MFC 표준 OLE 명령에 대 한 다양 한 미리 정의 된 매크로 제공합니다. 표준 OLE의 목록에 대 한 명령에 대 한 원래 설계 된 Microsoft Office 응용 프로그램과 함께 사용 하 여, docobj.h에서 정의 하는 OLECMDID 열거형을 참조 하십시오。

OLE 명령 지도 포함 하는 MFC 응용 프로그램에서 OLE 명령을 받으면 MFC 응용 프로그램의 OLE 명령 지도에서 요청한 명령에 대 한 명령 ID와 명령 그룹을 찾아 하려고 시도 합니다. 일치 하는 경우 WM_COMMAND 메시지 요청된 명령 ID와 명령 지도 포함 하는 응용 프로그램에 전달 됩니다. ( ON_OLECMD 아래 설명 참조). 이런 방식으로 OLE 명령은 응용 프로그램에 디스패치되는 MFC에 의해 WM_COMMAND 메시지에 설정 되어 있습니다. MFC 표준을 사용 하 여 응용 프로그램의 메시지 맵을 통해 WM_COMMAND 메시지를 라우팅한 다음 명령 라우팅 아키텍처。

메시지 지도는 달리 MFC OLE 명령 지도 Classwizard에 의해 지원 되지 않습니다. MFC 개발자가 OLE 명령 지도 지원 및 OLE 명령 지도 항목을 직접 추가 해야 합니다. OLE 명령 현재 문서 당시 한 WM_COMMAND 메시지 라우팅 체인에 있는 모든 클래스에서 MFC 액티브 문서 서버에 지도 추가할 수 있습니다 장소에 액티브 컨테이너에서입니다. 이러한 클래스는 CWinApp, CView, CDocument및 COleIPFrameWnd에서 파생 된 응용 프로그램의 클래스를 포함 합니다. 액티브 문서 컨테이너에서 OLE 명령 지도 추가할 수 있습니다 COleDocObjectItem-클래스를 파생 합니다. 또한 액티브 문서 컨테이너에서 WM_COMMAND 메시지만 발송 됩니다 COleDocObjectItem메시지 맵에-파생 클래스。

OLE 맵 매크로 명령

다음 매크로 사용 하 여 클래스에 명령 지도 기능 추가:

DECLARE_OLECMD_MAP)

이 매크로 명령 지도 포함 하는 클래스의 클래스 선언 (일반적으로 헤더 파일)에 간다。

BEGIN_OLECMD_MAP (클래스, baseClass)

클래스

명령 지도 포함 하는 클래스의 이름。

baseClass

명령 지도 포함 하는 클래스의 기본 클래스의 이름。

이 매크로 명령 지도의 시작을 표시 합니다. 이 매크로 사용 하 여 명령 지도 포함 하는 클래스의 구현 파일에。

 END_OLECMD_MAP()

이 매크로 명령 지도의 끝을 표시 합니다. 이 매크로 사용 하 여 명령 지도 포함 하는 클래스의 구현 파일에 있습니다. 이 매크로 항상 따라야 합니다 BEGIN_OLECMD_MAP 매크로。

ON_OLECMD (pguid, olecmdid, id)

pguid

OLE 명령 명령 그룹의 GUID 포인터입니다. 이 매개 변수는 표준 OLE 명령 그룹에 대 한 NULL。

olecmdid

OLE 명령 호출할 명령 ID。

id

이 OLE 명령을 호출 하면 명령 지도 포함 하는 응용 프로그램에 전송 되도록 WM_COMMAND 메시지의 ID。

사용 된 ON_OLECMD OLE에 대 한 항목을 추가 하려면 명령 지도에서 매크로 처리 하려면 명령. OLE 명령을 받으면 그들은 지정된 된 WM_COMMAND 메시지 변환 되며 표준 MFC 명령 라우팅 아키텍처를 사용 하 여 응용 프로그램의 메시지 맵을 통해。

예제

처리 하기 위해 MFC 액티브 문서 서버 OLE 명령 처리 기능을 추가 하는 방법을 보여 주는 예제는 OLECMDID_PRINT OLE 명령. 이 예제에서는 가정 Appwizard를 사용 하는 MFC 응용 프로그램은 활성 문서 서버 생성。

  1. CView에서-파생 클래스의 헤더 파일을 추가 합니다 DECLARE_OLECMD_MAP 클래스 선언에 매크로。

    메모nbsp;CView를 사용 하 여- WM_COMMAND 메시지 라우팅 체인에 액티브 문서 서버에 클래스 이므로 파생 클래스(&N)。

    cMyServerView 클래스: 공용 CView
    {
    보호 된: / /만 serialization에서 만들기
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. CView에 대 한 구현 파일에-파생 클래스를 추가 합니다 BEGIN_OLECMD_MAP 와 END_OLECMD_MAP 매크로:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. 표준 인쇄 명령에 대 한 OLE 명령 ID 및 ID_FILE_PRINT WM_COMMAND id 지정 명령 지도를 ON_OLECMD 매크로 추가 표준 OLE 인쇄 명령을 처리 하 ID_FILE_PRINT 는 표준 MFC Appwizard에서 생성 된 응용 프로그램에서 사용 하는 인쇄 명령 ID:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

참고는 afxdocob.h에 정의 된 표준 OLE 명령 매크로 중 하나 OLECMDID_PRINT 는 표준 OLE 명령 ID가 있기 때문에 ON_OLECMD 매크로 대신 사용할 수 있습니다 ON_OLECMD_PRINT 매크로 위의 ON_OLECMD 매크로로 동일한 작업을 수행 합니다.

컨테이너 응용 프로그램을 보낼 때이 서버는 OLECMDID_PRINT 명령을 서버의 IOleCommandTarget 인터페이스를 통해 응용 프로그램을 인쇄 하려면 서버 일으키는 서버에서 MFC 인쇄 명령 처리기를 호출 됩니다. 위의 단계에서 추가 인쇄 명령을 호출 하는 액티브 문서 컨테이너 코드를 이런식으로 생겼을 것 이다:

void CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget * pCmd = NULL;
   Hr HRESULT E_FAIL; =
   OLECMD ocm {OLECMDID_PRINT, 0} =;

hr = m_lpObject-gt;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < void ** >(&pCmd));
   if(FAILED(hr))
      반환;

hr = pCmd-> QueryStatus (NULL, 1 & ocm, NULL);
   if(SUCCEEDED(hr) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command는 사용 가능 하 고 활성화 그래서 그것을 호출 하는 것
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd-> Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, & Vin과 vOut);
      ASSERT(SUCCEEDED(hr));
   }
   pCmd-> Release();
}

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index