void CameraObject::Release( View * view ) { if( view->GetType() == THREED_VIEW_TYPE ) { PerViewElementCont::iterator it = m_perViewElements.find( view ); if( it != m_perViewElements.end() ) { PerViewElements & perView = (*it).second; view->GetRenderer()->RemoveViewProp( perView.cameraActor ); perView.cameraActor->Delete(); view->GetRenderer()->RemoveViewProp( perView.cameraAxesActor ); perView.cameraAxesActor->Delete(); view->GetRenderer()->RemoveViewProp( perView.cameraTrackerAxesActor ); perView.cameraTrackerAxesActor->Delete(); view->GetRenderer()->RemoveViewProp( perView.cameraImageActor ); perView.cameraImageActor->Delete(); if( perView.cameraBackup ) { ReleaseControl( 0 ); } ClearDrawingOneView( view, perView ); m_perViewElements.erase( it ); disconnect( this, SIGNAL(ObjectModified()), view, SLOT(NotifyNeedRender()) ); RemoveClient(); view->RemoveInteractionObject(this); } } }
CFlashUI::~CFlashUI(void) { if (m_pFlashEventHandler) { m_pFlashEventHandler->Release(); m_pFlashEventHandler=NULL; } ReleaseControl(); }
DuiLib::CWebBrowserUI::~CWebBrowserUI( ) { ReleaseControl( ); if (m_pDefaultWebBrowserEventHandler) { delete m_pDefaultWebBrowserEventHandler; m_pDefaultWebBrowserEventHandler = NULL; } }
// 创建wke控件 bool CDuiWkeView::CreateControl() { if(m_bCreating) { return false; } m_bCreated = false; m_bCreating = true; // 设置wke事件回调函数 m_wkeHander.onTitleChanged = onTitleChanged; m_wkeHander.onURLChanged = onURLChanged; // 创建wke视图,并加载url或html内容 m_pWebView = wkeCreateWebView(); m_pWebView->setTransparent(m_bTransparent); m_pWebView->setClientHandler(&m_wkeHander); m_pWebView->setBufHandler(this); if(!m_strUrl.IsEmpty()) { Navigate(m_strUrl); }else if(!m_strHtml.IsEmpty()) { loadHTML(m_strHtml); } // 注册窗口类 RegisterWindowClass(); // 创建用于显示wke视图的窗口 HWND hWnd = ::CreateWindow(wkeWebViewClassName, 0, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 0, 0, m_hWnd, 0, DuiSystem::Instance()->GetInstance(), this); // 设置窗口句柄 if(hWnd && ::IsWindow(hWnd)) { ReleaseControl(); m_hwndHost = hWnd; } // 初始化wke渲染对象,将渲染对象关联到视图窗口 m_render.init(m_hwndHost); m_bCreated = true; m_bCreating = false; return true; }
bool CActiveXUI::DelayedControlCreation() { ReleaseControl(); // At this point we'll create the ActiveX control m_bCreated = true; IOleControl* pOleControl = NULL; HRESULT Hr = ::CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IOleControl, (LPVOID*) &pOleControl); ASSERT(SUCCEEDED(Hr)); if( FAILED(Hr) ) return false; pOleControl->QueryInterface(IID_IOleObject, (LPVOID*) &m_pUnk); pOleControl->Release(); if( m_pUnk == NULL ) return false; // Create the host too m_pControl = new CActiveXCtrl(); m_pControl->m_pOwner = this; // More control creation stuff DWORD dwMiscStatus = 0; m_pUnk->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus); IOleClientSite* pOleClientSite = NULL; m_pControl->QueryInterface(IID_IOleClientSite, (LPVOID*) &pOleClientSite); CSafeRelease<IOleClientSite> RefOleClientSite = pOleClientSite; // Initialize control if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) != 0 ) m_pUnk->SetClientSite(pOleClientSite); IPersistStreamInit* pPersistStreamInit = NULL; m_pUnk->QueryInterface(IID_IPersistStreamInit, (LPVOID*) &pPersistStreamInit); if( pPersistStreamInit != NULL ) { Hr = pPersistStreamInit->InitNew(); pPersistStreamInit->Release(); } if( FAILED(Hr) ) return false; if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) == 0 ) m_pUnk->SetClientSite(pOleClientSite); // Grab the view... Hr = m_pUnk->QueryInterface(IID_IViewObjectEx, (LPVOID*) &m_pControl->m_pViewObject); if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject2, (LPVOID*) &m_pControl->m_pViewObject); if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject, (LPVOID*) &m_pControl->m_pViewObject); // Activate and done... m_pUnk->SetHostNames(OLESTR("UIActiveX"), NULL); if( (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0 ) { Hr = m_pUnk->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pOleClientSite, 0, m_pManager->GetPaintWindow(), &m_rcItem); ::RedrawWindow(m_pManager->GetPaintWindow(), &m_rcItem, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME); } IObjectWithSite* pSite = NULL; m_pUnk->QueryInterface(IID_IObjectWithSite, (LPVOID*) &pSite); if( pSite != NULL ) { pSite->SetSite(static_cast<IOleClientSite*>(m_pControl)); pSite->Release(); } return SUCCEEDED(Hr); }
// 设置原生控件对象的窗口句柄 bool CDuiNativeWnd::SetNativeHWnd(HWND hWnd) { if(hWnd == NULL) { return false; } ReleaseControl(); m_hwndHost = hWnd; bool bRet = false; if(m_hwndHost && ::IsWindow(m_hwndHost)) { SetControlWndVisible(FALSE); OnAttributePosChange(GetPosStr(), FALSE); bRet = true; } return bRet; }
CActiveXUI::~CActiveXUI() { ReleaseControl(); }
bool CActiveXUI::DoCreateControl() { ReleaseControl(); // At this point we'll create the ActiveX control m_bCreated = true; IOleControl* pOleControl = NULL; HRESULT Hr = -1; if( !m_sModuleName.IsEmpty() ) { HMODULE hModule = ::LoadLibrary((LPCTSTR)m_sModuleName); if( hModule != NULL ) { IClassFactory* aClassFactory = NULL; DllGetClassObjectFunc aDllGetClassObjectFunc = (DllGetClassObjectFunc)::GetProcAddress(hModule, "DllGetClassObject"); Hr = aDllGetClassObjectFunc(m_clsid, IID_IClassFactory, (LPVOID*)&aClassFactory); if( SUCCEEDED(Hr) ) { Hr = aClassFactory->CreateInstance(NULL, IID_IOleObject, (LPVOID*)&pOleControl); } aClassFactory->Release(); } } if( FAILED(Hr) ) { Hr = ::CoCreateInstance(m_clsid, NULL, CLSCTX_ALL, IID_IOleControl, (LPVOID*)&pOleControl); } ASSERT(SUCCEEDED(Hr)); if( FAILED(Hr) ) return false; pOleControl->QueryInterface(IID_IOleObject, (LPVOID*) &m_pUnk); pOleControl->Release(); if( m_pUnk == NULL ) return false; // Create the host too m_pControl = new CActiveXCtrl(); m_pControl->m_pOwner = this; // More control creation stuff DWORD dwMiscStatus = 0; m_pUnk->GetMiscStatus(DVASPECT_CONTENT, &dwMiscStatus); IOleClientSite* pOleClientSite = NULL; m_pControl->QueryInterface(IID_IOleClientSite, (LPVOID*) &pOleClientSite); CSafeRelease<IOleClientSite> RefOleClientSite = pOleClientSite; // Initialize control if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) != 0 ) m_pUnk->SetClientSite(pOleClientSite); IPersistStreamInit* pPersistStreamInit = NULL; m_pUnk->QueryInterface(IID_IPersistStreamInit, (LPVOID*) &pPersistStreamInit); if( pPersistStreamInit != NULL ) { Hr = pPersistStreamInit->InitNew(); pPersistStreamInit->Release(); } if( FAILED(Hr) ) return false; if( (dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST) == 0 ) m_pUnk->SetClientSite(pOleClientSite); // Grab the view... Hr = m_pUnk->QueryInterface(IID_IViewObjectEx, (LPVOID*) &m_pControl->m_pViewObject); if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject2, (LPVOID*) &m_pControl->m_pViewObject); if( FAILED(Hr) ) Hr = m_pUnk->QueryInterface(IID_IViewObject, (LPVOID*) &m_pControl->m_pViewObject); // Activate and done... m_pUnk->SetHostNames(OLESTR("UIActiveX"), NULL); if( m_pManager != NULL ) m_pManager->SendNotify((CControlUI*)this, _T("showactivex"), 0, 0, false); if( (dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0 ) { Hr = m_pUnk->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, pOleClientSite, 0, m_pManager->GetPaintWindow(), &m_rcItem); //::RedrawWindow(m_pManager->GetPaintWindow(), &m_rcItem, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME); } IObjectWithSite* pSite = NULL; m_pUnk->QueryInterface(IID_IObjectWithSite, (LPVOID*) &pSite); if( pSite != NULL ) { pSite->SetSite(static_cast<IOleClientSite*>(m_pControl)); pSite->Release(); } return SUCCEEDED(Hr); }
CWebBrowserUI::~CWebBrowserUI() { ReleaseControl(); }
CActiveXUI::~CActiveXUI() { ReleaseControl(); ::CoUninitialize(); }
RobotPrimitiveDriver::~RobotPrimitiveDriver() { ReleaseControl(); }
CDuiNativeWnd::~CDuiNativeWnd() { ReleaseControl(); }