专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » vr中ao参数:AO中接口的一般使用方法 »正文

vr中ao参数:AO中接口的一般使用方法

来源: 发布时间:星期四, 2009年2月12日 浏览:168次 评论:0


我们通过例子来学习在AO中接口使用思路方法我们要学这个例子是在VC6.0下用ATL创建个COM
COM创建主要步骤是:
1.实现esriUIICommand接口使用户可以把这个组建模型加入ArcScene或其他工具栏上在点击这个按钮时候实现相关操作
2.创建个连接点实现ISceneGraphEvents接口事件并改写fire事件相关我在Fire_BeforeDraw和Fire_AfterDraw中加了些OpenGL以实现雾化效果
3.回过头我们具体实现ICommand接口在ICommandOnCreate中用ISceneHookHelper钩住IScene在OnClick中我们通过ISceneHookHelper进步获得ISceneViewer用来刷新场景在刷新场景前后分别Fire_BeforeDraw和Fire_AfterDraw来绘制雾化效果这样ArcScene中sink们就可以响应fire事件www.
主要流程是这样:用户-->ArcScene-->ICommand接口-->自定义接口-->连接点-->fire事件-->OpenGL-->ArcScene
工程名:Walkthrough1Cpp;自定义接口类:CZoomIn;代理接口事件类CProxyISceneGraphEvents
注意:在用ATL创建接口时候要在属性面板Interface中选择Custom而不是Dual前者继承IUnkown后者继承IDispatch还要选择支持连接点
//stdafx.h:fileforstandardsystemfiles,
//orprojectspecicfilesthatareusedfrequently,
//butarechangedinfrequently
#!d(AFX_STDAFX_H__FF23B542_C904_4F39_8A97_C4DE3C45A0E6__INCLUDED_)
#AFX_STDAFX_H__FF23B542_C904_4F39_8A97_C4DE3C45A0E6__INCLUDED_
#_MSC_VER>1000
#pragmaonce
#end//_MSC_VER>1000
#STRICT
#ndef_WIN32_WINNT
#_WIN32_WINNT0x0400
#end
#_ATL_APARTMENT_THREADED
#<atlbase.h>
//YoumayderiveafromCComModuleanduseityouwanttooverride
//something,butdonotchangethenameof_Module
externCComModule_Module;
#<atlcom.h>
#pragmawarning(push)
#pragmawarning(disable:4146)
#pragmawarning(disable:4192)
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esri.olb\"raw_erfaces_onlyraw_native_typesno_
named_guidsexclude(\"OLE_COLOR\",\"OLE_HANDLE\",\"VARTYPE\") [Page]
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriUI.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriGeometry.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriDisplay.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriGeoDatabase.olb\"raw_erfaces_onlyraw_native_types
no_named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriCarto.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriControlCommands.olb\"raw_erfaces_onlyraw_native_types
no_named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esriFramework.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#import\"e:\\ProgramFiles\\ArcGIS\\com\\esri3DAnalyst.olb\"raw_erfaces_onlyraw_native_typesno_
named_guids
#pragmawarning(pop)
#\"gl\\gl.h\"
#\"gl\\glu.h\"
#\"gl\\glaux.h\"
#<GL/glut.h>
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualCwillinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#end//!d(AFX_STDAFX_H__FF23B542_C904_4F39_8A97_C4DE3C45A0E6__INCLUDED)


//ZoomIn.h:DeclarationoftheCZoomIn
#ndef__ZOOMIN_H_
#__ZOOMIN_H_
#\"resource.h\"//symbols
#\"esri3DAnalystCP.h\"
//#import\"D:\\ProgramFiles\\ArcGIS\\com\\esriUI.olb\"raw_erfaces_only,raw_native_types,
no_,named_guids
/////////////////////////////////////////////////////////////////////////////
//CZoomIn
ATL_NO_VTABLECZoomIn:


publicCComObjectRootEx<CComSingleThreadModel>,
publicCComCoClass<CZoomIn,&CLSID_ZoomIn>,
publicIZoomIn,
publicICommand,
publicCProxyISceneGraphEvents<CZoomIn>,
publicIConnectionPoContainerImpl<CZoomIn> [Page]
{
public:
CZoomIn
{
m_hBitmap=::LoadBitmap(_Module.GetResourceInstance,MAKEINTRESOURCE(IDB_ZOOMIN));
}
~CZoomIn
{
DeleteObject(m_hBitmap);
}
IHookHelperPtrm_ipHookHelper;
ISceneHookHelperPtrm_ipSceneHookHelper;
DECLARE_REGISTRY_RESOURCEID(IDR_ZOOMIN)
DECLARE_PROTECT_FINAL_CONSTRUCT
BEGIN_COM_MAP(CZoomIn)
COM_INTERFACE_ENTRY(IZoomIn)
COM_INTERFACE_ENTRY(ICommand)
COM_INTERFACE_ENTRY_IMPL(IConnectionPoContainer)
END_COM_MAP
//IZoomIn
private:
HBITMAPm_hBitmap;
public:
//ICommand
STDMETHOD(get_Enabled)(VARIANT_BOOL*Enabled);
STDMETHOD(get_Checked)(VARIANT_BOOL*Checked);
STDMETHOD(get_Name)(BSTR*Name);
STDMETHOD(get_Caption)(BSTR*Caption);
STDMETHOD(get_Tooltip)(BSTR*Tooltip);
STDMETHOD(get_Message)(BSTR*Message);
STDMETHOD(get_HelpFile)(BSTR*HelpFile);
STDMETHOD(get_HelpContextID)(LONG*helpID);
STDMETHOD(get_Bitmap)(OLE_HANDLE*Bitmap);
STDMETHOD(get_Category)(BSTR*categoryName);
STDMETHOD(OnCreate)(IDispatch*hook);
STDMETHOD(OnClick);
public:
BEGIN_CONNECTION_POINT_MAP(CZoomIn)
CONNECTION_POINT_ENTRY(IID_ISceneGraphEvents)
END_CONNECTION_POINT_MAP
};
#end//__ZOOMIN_H_


//ZoomIn.cpp:ImplementationofCZoomIn
#\"stdafx.h\"
#\"Walkthrough1Cpp.h\"
#\"ZoomIn.h\"
/////////////////////////////////////////////////////////////////////////////
//CZoomIn
STDMETHODIMPCZoomIn::get_Enabled(VARIANT_BOOL*Enabled)
{
(EnabledNULL)
E_POINTER;

*Enabled=VARIANT_TRUE;//Enablethetoolalways
S_OK;
}
STDMETHODIMPCZoomIn::get_Checked(VARIANT_BOOL*Checked)
{
(CheckedNULL)
E_POINTER;

E_NOTIMPL;
}
STDMETHODIMPCZoomIn::get_Name(BSTR*Name)
{
(NameNULL) [Page]
E_POINTER;
*Name=::SysAllocString(L\"ZoomInx0.5Cpp\");
S_OK;
}
STDMETHODIMPCZoomIn::get_Caption(BSTR*Caption)
{
(CaptionNULL)
E_POINTER;
*Caption=::SysAllocString(L\"ZoomInx0.5Cpp\");
S_OK;
}
STDMETHODIMPCZoomIn::get_Tooltip(BSTR*Tooltip)
{
(TooltipNULL)
E_POINTER;

E_NOTIMPL;
}
STDMETHODIMPCZoomIn::get_Message(BSTR*Message)
{
(MessageNULL)
E_POINTER;

E_NOTIMPL;
}
STDMETHODIMPCZoomIn::get_HelpFile(BSTR*HelpFile)
{
(HelpFileNULL)
E_POINTER;

E_NOTIMPL;
}
STDMETHODIMPCZoomIn::get_HelpContextID(LONG*helpID)
{
(helpIDNULL)
E_POINTER;

E_NOTIMPL;
}
STDMETHODIMPCZoomIn::get_Bitmap(OLE_HANDLE*Bitmap)
{
(BitmapNULL)
E_POINTER;
*Bitmap=(OLE_HANDLE)m_hBitmap;
S_OK;
}
STDMETHODIMPCZoomIn::get_Category(BSTR*categoryName)
{
(categoryNameNULL)
E_POINTER;


*categoryName=::SysAllocString(L\"DeveloperSamples\");
S_OK;
}
STDMETHODIMPCZoomIn::OnCreate(IDispatch*hook)
{
m_ipSceneHookHelper.CreateInstance(CLSID_SceneHookHelper);
HRESULThr=m_ipSceneHookHelper->putref_Hook(hook);
hr;
}
STDMETHODIMPCZoomIn::OnClick
{
//HRESULTcheckingomittedforclarity
IScenePtripScene;
m_ipSceneHookHelper->get_Scene(&ipScene);
ISceneGraphPtripSceneGraph;
ipScene->get_SceneGraph(&ipSceneGraph);

ISceneViewer*pViewer;
ipSceneGraph->get_ActiveViewer(&pViewer); [Page]
Fire_BeforeDraw(pViewer,NULL);
ipSceneGraph->RefreshViewers;
Fire_AfterDraw(pViewer);
S_OK;
}


//Walkthrough1Cpp.idl:IDLsourceforWalkthrough1Cpp.dll
//
//ThisfilewillbeprocessedbytheMIDLtoolto
//producethetypelibrary(Walkthrough1Cpp.tlb)andmarshallingcode.
import\"oaidl.idl\";
import\"ocidl.idl\";
[
object,
uuid(5CA669DE-0DFE-4C49-8546-B8AE24A629D5),

help(\"IZoomInInterface\"),
poer_default(unique)
]
erfaceIZoomIn:IUnknown
{
};
[
uuid(5C0841D7-80E7-4CDB-AFCD-5D77B23B879E),
version(1.0),
help(\"Walkthrough1Cpp1.0TypeLibrary\")
]
libraryWALKTHROUGH1CPPLib
{
importlib(\"stdole32.tlb\");
importlib(\"stdole2.tlb\");
importlib(\"e:\\ProgramFiles\\ArcGIS\\com\\esriUI.olb\");
[
uuid(C9265E95-7317-4CB2-9ACC-E3EA5C9CA550),
help(\"ZoomInClass\")
]
coZoomIn
{
[default]erfaceIUnknown;
erfaceIZoomIn;
erfaceICommand;
//[default]erfaceIZoomIn;
};
};


//esri3DAnalystCP.h
#ndef_ESRI3DANALYSTCP_H_
#_ESRI3DANALYSTCP_H_
#import\"E:\\ProgramFiles\\ArcGIS\\com\\esri3DAnalyst.olb\"raw_erfaces_only,raw_native_types,
no_,named_guids//\"Importtypelib\"
template<T>
CProxyISceneGraphEvents:publicIConnectionPoImpl<T,&IID_ISceneGraphEvents,
CComDynamicUnkArray>
{
//Warningthismayberecreatedbythewizard.
public:
HRESULTFire_ActiveViewerChanged(ISceneViewer*pViewer)
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex); [Page]
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->ActiveViewerChanged(pViewer);
}ret;

}
HRESULTFire_ViewerAdded(ISceneViewer*pViewer)
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->ViewerAdded(pViewer);
}ret;



}
HRESULTFire_ViewerRemoved(ISceneViewer*pViewer)
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->ViewerRemoved(pViewer);
}ret;

}
HRESULTFire_InteractionStopped
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex) [Page]
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->InteractionStopped;
}ret;

}
HRESULTFire_RecordingStarted(BSTRName)
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->RecordingStarted(Name);
}ret;

}
HRESULTFire_RecordingStopped
{
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->RecordingStopped;
}ret;

}
HRESULTFire_BeforeDraw(ISceneViewer*pViewer,VARIANT_BOOL*pbHandled)
{
ISceneGraphPtripSceneGraph;
pViewer->get_SceneGraph(&ipSceneGraph); [Page]
IEnvelopePtrpExtent;
ipSceneGraph->get_Extent(&pExtent);

ICameraPtrpCamera;
pViewer->get_Camera(&pCamera);
doubleNear;
doubleFar;
doubleAngle;
doublem_aspect;
pCamera->QueryViewingPlatformMBB(pExtent,&Near,&Far,&Angle,&m_aspect);
glEnable(GL_FOG);
glFogf(GL_FOG_MODE,GL_LINEAR);
glFogf(GL_FOG_START,Near);
glFogf(GL_FOG_END,Far);
floatred=0.8;
floatgreen=0.4;
floatblue=0.4;

GLfloatFogColor[4]={red,green,blue,1};


glFogfv(GL_FOG_COLOR,FogColor);


HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*>
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->BeforeDraw(pViewer,pbHandled);
}ret;

}
HRESULTFire_AfterDraw(ISceneViewer*pViewer)
{

glDisable(GL_FOG);
HRESULTret;
T*pT=_cast<T*>(this);
nConnectionIndex;
nConnections=m_vec.GetSize;

for(nConnectionIndex=0;nConnectionIndex<nConnections;nConnectionIndex)
{
pT->Lock;
CComPtr<IUnknown>sp=m_vec.GetAt(nConnectionIndex);
pT->Unlock;
ISceneGraphEvents*pISceneGraphEvents=reerpret_cast<ISceneGraphEvents*> [Page]
(sp.p);
(pISceneGraphEvents!=NULL)
ret=pISceneGraphEvents->AfterDraw(pViewer);
}ret;

}
};
#end
处理前
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: