Будем дальше мучать наш проект.
Итак, нам нужна функция в классе вида, которая бы смогла определить щелкнули мы на объекте OLE и возвратить на него указатель или мы щелкнули в стороне. Давайте создадим её и назовем OleClickTest.
class CTestOleContView : public CView { .......... // Implementation public: CTestOleContCntrItem* OleClickTest(CPoint point); virtual ~CTestOleContView(); #ifdef _DEBUG ........Теперь мы с Вами её и реализуем.
CTestOleContCntrItem* CTestOleContView::OleClickTest(CPoint point) { CTestOleContCntrItem* testOle; testOle=m_pSelection; if (testOle!=NULL) { if (!testOle->m_Rect.PtInRect(point)) testOle=NULL; } return testOle; }Основа этой процедуры функция PtInRect, которая проверяет попала ли точка в объект CRect. Теперь надо создать реакцию на двойной щелчок мыши.
///////////////////////////////////////////// // CTestOleContView message handlers void CTestOleContView::OnLButtonDblClk(UINT nFlags, CPoint point) { CTestOleContCntrItem* testOle; testOle=OleClickTest(point); if (testOle!=NULL) testOle->DoVerb(OLEIVERB_PRIMARY,this); CView::OnLButtonDblClk(nFlags, point); }
Основа фунция DoVerb, которая позволяет инициализировать объект OLE.
Давайте проведем полевые испытания. Во-первых вставьте лист Excel, нажмите ESC, лист должен стать серым. Теперь двойной щелчок и вы опять сможете редактировать лист Excel. Вот работает. Есть возможность запустить Excel в отдельном окне. Для этого необходимо заменить константу в DoVerb на OLEIVERB_OPEN.