ActiveX Documents and SplitterWnd Views
Ratnakar Dev -- rdev@inacom.com Friday, December 06, 1996 Environment: VC++4.2b, Win95 Hi, I am looking for help on a problem with a View not being refreshed in the CSplitterWnd class, in an ActiveX Document application. The CSplitterWnd class member is created in the COleDocIPFrameWnd derived class of the application. This provides a way for the application to create a two pane SplitterWindow when it is invoked from IE 3.0. The splitter window is also created in CFrameWnd derived class of the application for cases where the application is invoked standalone. This case works fine. All the views are updated correctly, resized correctly. When the application is invoked from IE 3.0, the CSplitterWnd classview (which is a CListView derived class) is drawn correctly the first time and then redrawn with a blank view. This also happens when the IE 3.0 is resized. Is there a solution to this problem? Thanks, R Dev The code for Message handling functions for the errant View is shown below --------------------------------------------------------------------------------------------------------------------- int COptionsView::OnCreate(LPCREATESTRUCT lpCreateStruct) { lpCreateStruct->style |= LVS_ICON; if (CListView::OnCreate(lpCreateStruct) == -1) return -1; return 0; } >void COptionsView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { CListView::OnActivateView(bActivate, pActivateView, pDeactiveView); if(pDeactiveView != NULL) { pDeactiveView->SetFocus(); // Make sure focus is restored. } } void COptionsView::OnSetFocus(CWnd* pOldWnd) { CListView::OnSetFocus(pOldWnd); COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); if (pActiveItem != NULL && pActiveItem->GetItemState() == COleClientItem::activeUIState) { // need to set focus to this item if it is in the same view CWnd* pWnd = pActiveItem->GetInPlaceWindow(); if (pWnd != NULL) { pWnd->SetFocus(); // don't call the base class return; } } CListView::OnSetFocus(pOldWnd); } void COptionsView::OnSize(UINT nType, int cx, int cy) { // CView::OnSize(nType, cx, cy); CListView::OnSize(nType, cx, cy); // UpdateActiveItem(); } void COptionsView::UpdateActiveItem() { trace("COptionsView::UpdateActiveItem\n"); COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); if (pActiveItem != NULL && pActiveItem->GetItemState() == COleClientItem::activeUIState) { // this will update the item rectangles by calling // OnGetPosRect & OnGetClipRect. pActiveItem->SetItemRects(); } } void COptionsView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CListView::OnUpdate(pSender, lHint, pHint); switch (lHint) { case HINT_UPDATE_WINDOW: // redraw entire window Invalidate(FALSE); break; default: break; }; } BOOL COptionsView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll) { // return CListView::OnScrollBy(sizeScroll, bDoScroll); // do the scroll if (!CListView::OnScrollBy(sizeScroll, bDoScroll)) return FALSE; // update the position of any in-place active item if (bDoScroll) { UpdateActiveItem(); UpdateWindow(); } return TRUE; }
jmitchell@derwent.co.uk Tuesday, December 10, 1996 I had the same problem. What you need to do is override COleServerDoc::CreateInPlaceFrame and inside there set the parent of your splitter window that is in your CMainFrame to the COleIPFrameWnd that you create. Justin Mitchell ______________________________ Reply Separator _________________________________ Subject: ActiveX Documents and SplitterWnd Views Author:(Ratnakar Dev) at Internet Date: 12/6/96 11:19 AM Environment: VC++4.2b, Win95 Hi, I am looking for help on a problem with a View not being refreshed in the CSplitterWnd class, in an ActiveX Document application. The CSplitterWnd class member is created in the COleDocIPFrameWnd derived class of the application. This provides a way for the application to create a two pane SplitterWindow when it is invoked from IE 3.0. The splitter window is also created in CFrameWnd derived class of the application for cases where the application is invoked standalone. This case works fine. All the views are updated correctly, resized correctly. When the application is invoked from IE 3.0, the CSplitterWnd classview (which is a CListView derived class) is drawn correctly the first time and then redrawn with a blank view. This also happens when the IE 3.0 is resized. Is there a solution to this problem? Thanks, R Dev The code for Message handling functions for the errant View is shown below -------------------------------------------------------------------------------- ------------------------------------- int COptionsView::OnCreate(LPCREATESTRUCT lpCreateStruct) { lpCreateStruct->style |= LVS_ICON; if (CListView::OnCreate(lpCreateStruct) == -1) return -1; return 0; } >void COptionsView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { CListView::OnActivateView(bActivate, pActivateView, pDeactiveView); if(pDeactiveView != NULL) { pDeactiveView->SetFocus(); // Make sure focus is restored. } } void COptionsView::OnSetFocus(CWnd* pOldWnd) { CListView::OnSetFocus(pOldWnd); COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); if (pActiveItem != NULL && pActiveItem->GetItemState() == COleClientItem::activeUIState) { // need to set focus to this item if it is in the same view CWnd* pWnd = pActiveItem->GetInPlaceWindow(); if (pWnd != NULL) { pWnd->SetFocus(); // don't call the base class return; } } CListView::OnSetFocus(pOldWnd); } void COptionsView::OnSize(UINT nType, int cx, int cy) { // CView::OnSize(nType, cx, cy); CListView::OnSize(nType, cx, cy); // UpdateActiveItem(); } void COptionsView::UpdateActiveItem() { trace("COptionsView::UpdateActiveItem\n"); COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); if (pActiveItem != NULL && pActiveItem->GetItemState() == COleClientItem::activeUIState) { // this will update the item rectangles by calling // OnGetPosRect & OnGetClipRect. pActiveItem->SetItemRects(); } } void COptionsView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) { CListView::OnUpdate(pSender, lHint, pHint); switch (lHint) { case HINT_UPDATE_WINDOW: // redraw entire window Invalidate(FALSE); break; default: break; }; } BOOL COptionsView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll) { // return CListView::OnScrollBy(sizeScroll, bDoScroll); // do the scroll if (!CListView::OnScrollBy(sizeScroll, bDoScroll)) return FALSE; // update the position of any in-place active item if (bDoScroll) { UpdateActiveItem(); UpdateWindow(); } return TRUE; }
jmitchell@derwent.co.uk Friday, December 13, 1996 I had the same problem. What you need to do is override COleServerDoc::CreateInPlaceFrame and inside there set the parent of your splitter window that is in your CMainFrame to the COleIPFrameWnd that you create. Justin Mitchell
| Вернуться в корень Архива |