📄 connect.cpp
字号:
m_ptrMainToolWindow->PutVisible(VARIANT_TRUE);
}
m_CommandManager.OnConnection(m_pDTE, m_pAddInInstance, m_hwndResOrg, m_ptrMainToolWindow /*ptrToolWindow*/);
m_CommandManager.CreateCommandHandlers();
// If the add-ins commands don't exist, a previous run of the IDE probably
// failed to save them, so recreate them...
if (!m_CommandManager.CommandsExist() )
{
CString sErrorMsg;
if (!SUCCEEDED(m_CommandManager.ConfigureCommands(&sErrorMsg) ) )
{
ATLASSERT(!sErrorMsg.IsEmpty() );
::AfxMessageBox(sErrorMsg,
MB_OK | MB_ICONSTOP);
}
}
}
ConfigureEvents();
return S_OK;
}
STDMETHODIMP CConnect::OnDisconnection(AddInDesignerObjects::ext_DisconnectMode eRemoveMode,
SAFEARRAY** ppCustom)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
UNREFERENCED_PARAMETER(eRemoveMode);
UNREFERENCED_PARAMETER(ppCustom);
UnadviseEvents();
m_CommandManager.OnDisconnection();
Workspace.SetDTE(NULL);
DisconnectApp();
m_pDTE = NULL;
return S_OK;
}
STDMETHODIMP CConnect::OnAddInsUpdate(SAFEARRAY** ppCustom)
{
UNREFERENCED_PARAMETER(ppCustom);
return S_OK;
}
STDMETHODIMP CConnect::OnStartupComplete(SAFEARRAY** ppCustom)
{
UNREFERENCED_PARAMETER(ppCustom);
return S_OK;
}
STDMETHODIMP CConnect::OnBeginShutdown(SAFEARRAY** ppCustom)
{
UNREFERENCED_PARAMETER(ppCustom);
return S_OK;
}
STDMETHODIMP CConnect::raw_QueryStatus( BSTR bstrCommandName,
EnvDTE::vsCommandStatusTextWanted eNeededText,
EnvDTE::vsCommandStatus* pStatusOption,
VARIANT* pvarCommandText)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
return m_CommandManager.QueryStatus(bstrCommandName,
eNeededText,
pStatusOption,
pvarCommandText);
}
STDMETHODIMP CConnect::raw_Exec(BSTR bstrCommandName,
EnvDTE::vsCommandExecOption eExecuteOption,
VARIANT* pvarVariantIn,
VARIANT* pvarVariantOut,
VARIANT_BOOL* pvbHandled)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
return m_CommandManager.Exec( bstrCommandName,
eExecuteOption,
pvarVariantIn,
pvarVariantOut,
pvbHandled);
}
HRESULT CConnect::FinalConstruct(void)
{
return S_OK;
}
void CConnect::FinalRelease(void)
{
}
/////////////////////////////////////////////////////////////////////////////
// CConnect implementation
void CConnect::ConnectApp(void)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
::GetApp()->OnConnection();
m_hwndResOrg = ::AfxGetMainWnd()->GetSafeHwnd();
}
void CConnect::DisconnectApp(void)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
::GetApp()->OnDisconnection();
}
HRESULT CConnect::ConfigureEvents(void)
{
HRESULT hr = S_OK;
{
CComPtr<EnvDTE::Events> pEvents;
CComPtr<EnvDTE::_SolutionEvents> pSolutionEvents;
if (SUCCEEDED(m_pDTE->get_Events(&pEvents) ) )
{
if (SUCCEEDED(pEvents->get_SolutionEvents(&pSolutionEvents) ) )
{
m_SolutionEventsSink.DispEventAdvise( (IUnknown*)pSolutionEvents.p);
// Tell our event sink where the main tool window lives
m_SolutionEventsSink.OnConnection(m_pMainToolWindowCtrl);
hr = S_OK;
}
}
}
return hr;
}
HRESULT CConnect::UnadviseEvents(void)
{
HRESULT hr = S_OK;
{
CComPtr<EnvDTE::Events> pEvents;
CComPtr<EnvDTE::_SolutionEvents> pSolutionEvents;
if (SUCCEEDED(m_pDTE->get_Events(&pEvents) ) )
{
if (SUCCEEDED(pEvents->get_SolutionEvents(&pSolutionEvents) ) )
{
m_SolutionEventsSink.DispEventUnadvise( (IUnknown*)pSolutionEvents.p);
m_SolutionEventsSink.OnDisconnection();
//pSolutionEvents = NULL;
hr = S_OK;
}
}
}
return hr;
}
HRESULT CConnect::RefreshMainToolWindow(void)
{
return m_SolutionEventsSink.RefreshMainToolWindow();
}
// This is a bit of a bodge...since the event handler needs to call this it makes
// sense to make it a member of this class, although it really doesn't make sense!
HRESULT CConnect::SolutionEventsSink::RefreshMainToolWindow(void)
{
AFX_MANAGE_STATE( ::AfxGetStaticModuleState() );
ASSERT(m_pMainToolWindowCtrl != NULL);
if (m_pMainToolWindowCtrl != NULL)
{
m_pMainToolWindowCtrl->Refresh();
}
return S_OK;
}
void __stdcall CConnect::SolutionEventsSink::Opened(void)
{
TRACE( _T("SolutionEvents::Opened\n") );
RefreshMainToolWindow();
}
void __stdcall CConnect::SolutionEventsSink::BeforeClosing(void)
{
TRACE( _T("SolutionEvents::BeforeClosing\n") );
}
void __stdcall CConnect::SolutionEventsSink::AfterClosing(void)
{
TRACE( _T("SolutionEvents::AfterClosing\n") );
RefreshMainToolWindow();
}
void __stdcall CConnect::SolutionEventsSink::QueryCloseSolution(VARIANT_BOOL *fCancel)
{
UNREFERENCED_PARAMETER(fCancel);
TRACE( _T("SolutionEvents::QueryCloseSolution\n") );
}
void __stdcall CConnect::SolutionEventsSink::Renamed(BSTR OldName)
{
UNREFERENCED_PARAMETER(OldName);
TRACE( _T("SolutionEvents::Renamed\n") );
}
void __stdcall CConnect::SolutionEventsSink::ProjectAdded(EnvDTE::Project* pProject)
{
UNREFERENCED_PARAMETER(pProject);
#ifdef _DEBUG
TRACE( _T("SolutionEvents::ProjectAdded\n") );
CComBSTR bsName;
pProject->get_Name(&bsName);
TRACE( _T("\tProject name: %s\n"), bsName);
#endif
RefreshMainToolWindow();
}
void __stdcall CConnect::SolutionEventsSink::ProjectRemoved(EnvDTE::Project* pProject)
{
UNREFERENCED_PARAMETER(pProject);
#ifdef _DEBUG
TRACE( _T("SolutionEvents::ProjectRemoved\n") );
CComBSTR bsName;
pProject->get_Name(&bsName);
TRACE( _T("\tProject name: %s\n"), bsName);
#endif
RefreshMainToolWindow();
}
void __stdcall CConnect::SolutionEventsSink::ProjectRenamed(EnvDTE::Project* pProject, BSTR bsOldName)
{
UNREFERENCED_PARAMETER(pProject);
UNREFERENCED_PARAMETER(bsOldName);
TRACE( _T("SolutionEvents::ProjectRenamed\n") );
RefreshMainToolWindow();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -