Будем дальше мучать наш проект.
Итак, нам нужна функция в классе вида, которая бы смогла определить щелкнули мы на объекте 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.