TN071: MFC IOleCommandTarget 구현
[!참고]
온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.
IOleCommandTarget 인터페이스를 개체와 해당 컨테이너 명령을 서로 발송 하는 데 있습니다.예를 들어, 개체의 도구 모음 단추 명령에 대 한 같은 포함 될 수 있습니다 인쇄, 미리, 저장, New, 및 확대/축소.이러한 개체를 지 원하는 컨테이너에 포함 된 경우 IOleCommandTarget, 개체 단추를 활성화 하 고 컨테이너는 사용자가 클릭 했을 때 처리 하기 위한 명령에 전달할 수 있습니다.컨테이너 자체를 인쇄 하려면 포함 된 개체를 원하는 경우이이 명령을 통해 보내 요청할 수 있는 IOleCommandTarget 포함된 된 개체의 인터페이스입니다.
IOleCommandTarget클라이언트가 서버에서 메서드를 호출 하는 데 사용 되는 자동화 인터페이스가입니다.그러나 사용 하 여 IOleCommandTarget 프로그래머는 일반적으로 비용이 많이 드는 사용할 필요가 있기 때문에 자동화 인터페이스를 통해 호출 하는 오버 헤드를 저장 Invoke 메서드의 IDispatch.
MFC에는 IOleCommandTarget 인터페이스 데 액티브 문서 서버에 의해 허용 명령을 서버로 발송 하는 액티브 문서 컨테이너입니다.액티브 문서 서버 클래스, CDocObjectServerItem, MFC 인터페이스 맵을 사용 하 여 (볼 TN038: IUnknown 구현 OLE MFC/)를 구현 하는 IOleCommandTarget 인터페이스.
IOleCommandTarget또한 구현 되는 COleFrameHook 클래스입니다.COleFrameHook 의 내부 프레임 창 기능을 구현 하는 문서화 되지 않은 MFC 클래스 편집 된 컨테이너입니다.COleFrameHook 또한 MFC 인터페이스 맵을 사용 하 여 구현 하는 IOleCommandTarget 인터페이스입니다.COleFrameHook의 구현의 IOleCommandTarget OLE 명령 전달 COleDocObjectItem-액티브 문서 컨테이너를 파생 합니다.이 모든 MFC 액티브 문서 컨테이너를 포함 된 액티브 문서 서버에서 메시지를 받을 수 있습니다.
MFC OLE 명령 지도
MFC 개발자가 이용할 수 있습니다 IOleCommandTarget MFC OLE 명령을 사용 하 여 지도.OLE 명령 명령 맵이 들어 있는 클래스의 멤버 함수에 매핑하는 데 사용 될 수 있으므로 메시지를 매핑하는 것 처럼 OLE 명령 맵이 있습니다.이 작업을 하려면 배치할 매크로 명령을 맵에서 OLE 명령 그룹 처리 명령을, OLE 명령, 및 명령 ID를 지정 하는 WM_COMMAND OLE 명령의 받았을 때 메시지가 보내집니다.또한 MFC 표준 OLE 명령에 대 한 여러 개의 미리 정의 된 매크로 제공합니다.원래 설계 된 명령 목록은 표준 OLE Microsoft Office 응용 프로그램을 사용 하 여, docobj.h에 정의 된 OLECMDID 열거형을 참조 하십시오.
MFC 응용 프로그램에서 포함 된 OLE 명령 지도 OLE 명령 받을 때 MFC 명령 ID와 명령 그룹 요청한 명령을 응용 프로그램의 OLE 명령 구조에서를 찾으려고 시도 합니다.일치 하는 항목이 발견 되 면은 WM_COMMAND 명령 지도 요청 된 명령 id가 포함 된 응용 프로그램 메시지가 발송 되어 있습니다.(에 대 한 설명을 참조 하십시오. ON_OLECMD 아래.) 이런이 방법으로 OLE 명령 신청서를 발송으로 설정 WM_COMMAND MFC 메시지.WM_COMMAND 표준 MFC를 사용 하 여 응용 프로그램의 메시지 맵을 통해 메시지를 라우팅하는 다음 명령 라우팅을 아키텍처.
메시지 맵은 달리 MFC OLE 명령 맵이 클래스 마법사에서 지원 되지 않습니다.MFC 개발자 OLE 명령 지도 지원 및 OLE 명령 맵 엔트리를 직접 추가 해야 합니다.OLE 명령 맵이 MFC 액티브 문서 서버에 있는 모든 클래스에 추가할 수 있습니다의 WM_COMMAND 메시지 라우팅 체인 시 활성 문서 컨테이너의 내부 활성화 됩니다.이러한 클래스에서 파생 되는 응용 프로그램의 클래스를 포함 CWinApp, CView, CDocument, 및 COleIPFrameWnd.액티브 문서 컨테이너에서 OLE 명령 지도 추가할 수 있습니다의 COleDocObjectItem-클래스를 파생 합니다.액티브 문서 컨테이너에서 또한는 WM_COMMAND 메시지 에서만 발송 될 수 메시지 맵에서 COleDocObjectItem-클래스를 파생 합니다.
OLE 명령 맵 매크로
다음 매크로 사용 하 여 명령 지도 기능 클래스에 추가 합니다.
DECLARE_OLECMD_MAP ()
이 매크로 명령을 맵에 포함 된 클래스 (일반적으로 헤더 파일)에서 클래스 선언에 전달 됩니다.
BEGIN_OLECMD_MAP(theClass, baseClass)
theClass
명령 맵이 들어 있는 클래스의 이름입니다.baseClass
명령 맵이 들어 있는 클래스의 기본 클래스의 이름입니다.
이 매크로 명령 지도 부분을 표시합니다.구현 명령 맵이 들어 있는 클래스 파일에서이 매크로 사용 합니다.
END_OLECMD_MAP()
이 매크로 명령 맵 끝을 표시 합니다.구현 명령 맵이 들어 있는 클래스 파일에서이 매크로 사용 합니다.이 매크로 항상 따라야는 BEGIN_OLECMD_MAP 매크로.
ON_OLECMD(pguid, olecmdid, id)
pguid
OLE 명령 명령 그룹의 GUID에 대 한 포인터입니다.이 매개 변수는 NULL 표준 OLE 명령 그룹입니다.olecmdid
호출할 명령의 OLE 명령 ID입니다.id
ID는 WM_COMMAND 이 OLE 명령을 호출 하면 명령 지도 포함 하는 응용 프로그램에 보낼 메시지입니다.
사용은 ON_OLECMD OLE에 대 한 항목을 추가 하려면 명령 맵의 매크로 명령을 처리 합니다.OLE 명령에 도착 하면 변환에 지정 된 WM_COMMAND 메시지 및 표준 MFC 명령 라우팅 아키텍처를 사용 하 여 응용 프로그램의 메시지 맵을 통해 라우팅된.
예제
OLE 명령 처리 기능이 처리 하려면 MFC 액티브 문서 서버를 추가 하는 방법 다음 예제는 OLECMDID_PRINT OLE 명령.액티브 문서 서버 MFC 응용 프로그램을 만들려면 응용 프로그램 마법사를 사용 하는 예제입니다.
사용자 CView-파생 클래스의 헤더 파일을 추가 DECLARE_OLECMD_MAP 매크로 클래스 선언.
[!참고]
사용은 CView-하나 되는 액티브 문서 서버에 클래스 이므로 파생 클래스는 WM_COMMAND 메시지 라우팅 체인.
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
구현 파일에 CView-클래스에서 파생 된 추가 BEGIN_OLECMD_MAP 및 END_OLECMD_MAP 매크로:
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
표준 OLE 인쇄 명령을 처리 하려면 추가 ON_OLECMD 매크로 명령 지도 표준 인쇄 명령에 대 한 OLE 명령 ID를 지정 하 고 ID_FILE_PRINT 에 WM_COMMAND id.ID_FILE_PRINT MFC 응용 프로그램 마법사에서 생성 된 응용 프로그램에서 인쇄 명령 ID에 사용 되는 표준입니다.
BEGIN_OLECMD_MAP(CMyServerView, CView) ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT) END_OLECMD_MAP()
Afxdocob.h에 정의 된 표준 OLE 명령 매크로 중 하나를 대신 사용할 수 있다는 것을 참고는 ON_OLECMD 매크로 때문에 OLECMDID_PRINT 는 표준 OLE 명령 ID입니다.ON_OLECMD_PRINT 매크로와 동일한 작업을 수행할 수 있는 ON_OLECMD 위의 매크로.
때 컨테이너 응용 프로그램 보냅니다이 서버는 OLECMDID_PRINT 명령을 통해 서버의 IOleCommandTarget 인터페이스를 MFC 인쇄 명령 처리기를 일으키는 응용 프로그램 인쇄 서버는 서버에 호출 됩니다.위의 단계에서 추가한 인쇄 명령을 호출 하는 액티브 문서 컨테이너 코드는 이와 같습니다.
void CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget *pCmd = NULL;
HRESULT hr = E_FAIL;
OLECMD ocm={OLECMDID_PRINT, 0};
hr = m_lpObject->QueryInterface(IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
if(FAILED(hr))
return;
hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
if(SUCCEEDED(hr) && (ocm.cmdf & OLECMDF_ENABLED))
{
//Command is available and enabled so call it
COleVariant vIn;
COleVariant vOut;
hr = pCmd->Exec(NULL, OLECMDID_PRINT,
OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
ASSERT(SUCCEEDED(hr));
}
pCmd->Release();
}