// Program 1 - simple program with COleDocument class #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: vvv() { } void OnDraw(CDC *c) { } }; IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() zzz a; ------- RC FILE ------- 10 MENU BEGIN POPUP "File" BEGIN MENUITEM "New",100 END POPUP "OLE" BEGIN MENUITEM "Insert",200 END END 20 MENU BEGIN POPUP "File" BEGIN MENUITEM "New",100 END END ****************************************************************** // Program 2 - with COleInsertDialog and AfxOleInit() #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: vvv() { } void OnDraw(CDC *c) { } void aa() { COleInsertDialog d; d.DoModal(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() zzz a; ****************************************************************** // Program 3 - with derived class from COleClientItem // and Ole item displayed #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: iii(ddd *p=0):COleClientItem(p) { } void OnGetItemPosition(CRect& h) { ::MessageBox(0,"OnGetItemPosition()","Hello",0); h=CRect(10,50,150,200); } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: void OnDraw(CDC *c) { } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); iii *i; i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() zzz a; ****************************************************************** // Program 4 - with OnLButtonDown() and Close(). // The item closes only when we click outside of the item // clicking inside calls the OnLButtonDown() of the server class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; void OnDraw(CDC *c) { } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 5 - with Draw() class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; void OnDraw(CDC *c) { if(i!=0) { CRect r; r.SetRect(20,20,200,300); i->Draw(c,r); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) // The Draw size is larger than the initial size of the item. The Draw // will display the image always and at the fixed size ****************************************************************** // Program 6 - with OnChangeItemPosition() class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r=CRect(10,50,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { ::MessageBox(0,"In OnChangeItemPosition()","Hello",0); return 1; } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; vvv() { i=0; } void OnDraw(CDC *c) { if((i!=0)) i->Draw(c,i->r); } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) // no change in size and/or position ****************************************************************** // Program 7 - with original int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); return 1; } // with original alone sizing and moving allowed. `Draw' image // does not change to size and location ****************************************************************** // Program 8 - passing the changed size to our CRect object `r' int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); r=h; return 1; } // `Draw' image does change to size and location ****************************************************************** // Program 9 - with basic tracker class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { if((i!=0)) { i->Draw(c,i->r); t.m_nStyle=CRectTracker::dottedLine|CRectTracker::resizeInside; t.m_rect=i->r; t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 10 - with Track() void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); if(t.Track(this,p)) { Invalidate(); i->r=t.m_rect; } } ****************************************************************** // Program 11 - to show tracker is a separate entity class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0;t.m_rect=CRect(60,110,100,150); } void OnDraw(CDC *c) { if((i!=0)) { i->Draw(c,i->r); t.m_nStyle=CRectTracker::dottedLine|CRectTracker::resizeInside; t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); if(t.Track(this,p)) Invalidate(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 12 - with LButtonDblClk() class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0;t.m_rect=CRect(60,110,100,150); } void OnDraw(CDC *c) { if((i!=0)) { i->Draw(c,i->r); t.m_rect=i->r; t.m_nStyle=CRectTracker::dottedLine|CRectTracker::resizeInside; t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); if(t.Track(this,p)) { Invalidate(); i->r=t.m_rect; } } void OnLButtonDblClk(UINT,CPoint) { if(i!=0) i->DoVerb(OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 13 - with double click class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0;t.m_rect=CRect(60,110,100,150); } void OnDraw(CDC *c) { if((i!=0)) { i->Draw(c,i->r); t.m_rect=i->r; t.m_nStyle=CRectTracker::dottedLine|CRectTracker::resizeInside; t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint p) { if(i!=0) i->Close(); if(t.Track(this,p)) { Invalidate(); i->r=t.m_rect; } } void OnLButtonDblClk(UINT,CPoint) { if(i!=0) i->DoVerb(OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 14 - within the item void OnLButtonDblClk(UINT,CPoint) { if(i!=0) i->DoVerb(OLEIVERB_SHOW,this); } ****************************************************************** // Program 15 - for OLEIVERB_OPEN void OnLButtonDblClk(UINT,CPoint p) { if(i->r.PtInRect(p)) i->DoVerb(OLEIVERB_OPEN,this); } ****************************************************************** // Program 16 - with both OPEN and SHOW void OnLButtonDblClk(UINT,CPoint p) { if(i->r.PtInRect(p)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } ****************************************************************** // Program 17 - with OnChange() class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r=CRect(10,50,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { if(f==OLE_SAVED) ::MessageBox(0,"OnChange()","OLE_SAVED",0); else if(f==OLE_CHANGED) ::MessageBox(0,"OnChange()","OLE_CHANGED",0); else if(f==OLE_CHANGED_STATE) ::MessageBox(0,"OnChange()","OLE_CHANGED_STATE",0); else if(f==OLE_CLOSED) ::MessageBox(0,"OnChange()","OLE_CLOSED",0); } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) ****************************************************************** // Program 19 - with UpdateAllViews() and the original void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } ****************************************************************** // Program 20 - with SetContainerInfo() class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); y->SetContainerInfo(30); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() ------- RC FILE ------- #include 10 MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New",100 END POPUP "&OLE" BEGIN MENUITEM "&Insert",200 END END 20 MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New",100 END END 30 MENU BEGIN POPUP "File" BEGIN MENUITEM "New",100 MENUITEM "Open",101 MENUITEM "Save",ID_FILE_SAVE MENUITEM "Save As",ID_FILE_SAVE_AS END END ****************************************************************** // Program 21 - with Toolbars #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { if(i!=0) { i->Draw(c,i->r); t.m_nStyle|=CRectTracker::resizeInside|CRectTracker::dottedLine; t.m_rect=i->r; t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { if(!i->r.PtInRect(e)) i->Close(); else { t.m_rect=i->r; if(t.Track(this,e)) { Invalidate(); i->r=t.m_rect; } } Invalidate(); } void OnLButtonDblClk(UINT,CPoint e) { if(i->r.PtInRect(e)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class yyy:public CMDIFrameWnd { public: CToolBar b; int OnCreateClient(CREATESTRUCT *a,CCreateContext *c) { CMDIFrameWnd::OnCreateClient(a,c); b.Create(this); b.LoadBitmap(40); b.SetButtons(0,3); return 1; } }; class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); y->SetContainerInfo(30); AddDocTemplate(y); yyy *w=new yyy; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() zzz a; ------- RC FILE ------- // Menu Same As Before 40 BITMAP TOOLBAR.BMP ****************************************************************** // Program 22 - with OnShowControlBars() class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } int OnShowControlBars(CFrameWnd *w, int x) { ::MessageBox(0,"OnShowControlBars()","Hello",0); return COleClientItem::OnShowControlBars(w,x); } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) ****************************************************************** // Program 23- more of OnShowControlBars() int OnShowControlBars(CFrameWnd *w, int x) { if (x==1) ::MessageBox(0,"OnShowControlBars()","Show",0); else ::MessageBox(0,"OnShowControlBars()","Hide",0); return COleClientItem::OnShowControlBars(w,x); } ****************************************************************** // Program 24 - with last parameter as 1 and then 0. Our toolbar // remains displayed and is not shown at all resp; int OnShowControlBars(CFrameWnd *w, int x) { return COleClientItem::OnShowControlBars(w,1); } ****************************************************************** // Program 25 - with multiple items #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) public: }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class iii: public COleClientItem { DECLARE_DYNCREATE(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } }; IMPLEMENT_DYNCREATE(iii,COleClientItem) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (q!=0) { t.m_nStyle=0; x=(iii*)p->GetNextItem(q); t.m_nStyle|=CRectTracker::dottedLine; if((i!=0) && (x==i)) t.m_nStyle|=CRectTracker::resizeInside; t.m_rect=x->r; x->Draw(c,x->r); t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; if(i!=0) { i->Close(); i=0; } q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); if(x->r.PtInRect(e)) { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else i=x; } Invalidate(); } } void OnLButtonDblClk(UINT,CPoint e) { if(i!=0) if(i->r.PtInRect(e)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); y->SetContainerInfo(30); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) END_MESSAGE_MAP() zzz a; ****************************************************************** // Program 26 - with multiple items active #include 10 MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New",100 MENUITEM "&Open",101 MENUITEM "&Save",ID_FILE_SAVE MENUITEM "Save &As",ID_FILE_SAVE_AS END POPUP "&OLE" BEGIN MENUITEM "&Insert",200 END END 20 MENU BEGIN POPUP "&File" BEGIN MENUITEM "&New",100 MENUITEM "Open",101 END END 30 MENU BEGIN POPUP "File" BEGIN MENUITEM "&New",100 MENUITEM "&Open",101 MENUITEM "&Save",ID_FILE_SAVE MENUITEM "Save &As",ID_FILE_SAVE_AS END POPUP "&OLE" BEGIN MENUITEM "&Insert",200 END END ****************************************************************** // Program 27 - with previous item de-activated when new item is // inserted void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); if(i!=0) i->Close(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } ****************************************************************** // Program 28 - with serialize() #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) public: void Serialize(CArchive& ar) { ::MessageBox(0,"In COleDocument","Hello",0); COleDocument::Serialize(ar); } }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class iii: public COleClientItem { DECLARE_SERIAL(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } void Serialize(CArchive& ar) { ::MessageBox(0,"In COleClientItem","Hello",0); COleClientItem::Serialize(ar); if (ar.IsStoring()) ar<>r; } }; IMPLEMENT_SERIAL(iii,COleClientItem,0) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (q!=0) { t.m_nStyle=0; x=(iii*)p->GetNextItem(q); t.m_nStyle|=CRectTracker::dottedLine; if((i!=0) && (x==i)) t.m_nStyle|=CRectTracker::resizeInside; t.m_rect=x->r; x->Draw(c,x->r); t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; if(i!=0) { i->Close(); i=0; } q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); if(x->r.PtInRect(e)) { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else i=x; } Invalidate(); } } void OnLButtonDblClk(UINT,CPoint e) { if(i!=0) if(i->r.PtInRect(e)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); y->SetContainerInfo(30); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) ON_COMMAND(101,OnFileOpen) END_MESSAGE_MAP() zzz a; ------- RC FILE ------- // same as before ****************************************************************** // Program 29 - do not save CRect object `r' void Serialize(CArchive& ar) { COleClientItem::Serialize(ar); } ****************************************************************** // Program 30 - with status of the item also saved #include #include #include #include class ddd: public COleDocument { DECLARE_DYNCREATE(ddd) public: void Serialize(CArchive& ar) { COleDocument::Serialize(ar); } }; IMPLEMENT_DYNCREATE(ddd,COleDocument) class iii: public COleClientItem { DECLARE_SERIAL(iii) public: CRect r; CString a; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); r=h; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } void Serialize(CArchive& ar) { COleClientItem::Serialize(ar); if(ar.IsStoring()) ar<>r>>a; } }; IMPLEMENT_SERIAL(iii,COleClientItem,0) class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (q!=0) { x=(iii*)p->GetNextItem(q); if(x->a!="a") { t.m_nStyle=0; t.m_nStyle|=CRectTracker::dottedLine; if((i!=0 && x==i) ||( x->a=="s")) t.m_nStyle|=CRectTracker::resizeInside; x->Draw(c,x->r); t.m_rect=x->r; t.Draw(c); } else if(x->GetItemState()!=COleClientItem::activeUIState) { x->DoVerb(OLEIVERB_SHOW,this); i=x; } } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); i->a="a"; d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; if(i!=0) { i->Close(); i=0; } q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); x->a="c"; if(x->r.PtInRect(e)) { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else { x->a="s"; i=x; } } Invalidate(); } } void OnLButtonDblClk(UINT,CPoint e) { if(i!=0) if(i->r.PtInRect(e)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) class zzz:public CWinApp { public: int InitInstance() { AfxOleInit(); CMultiDocTemplate *y=new CMultiDocTemplate(10,RUNTIME_CLASS(ddd),RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(vvv)); y->SetContainerInfo(30); AddDocTemplate(y); CMDIFrameWnd *w=new CMDIFrameWnd; w->LoadFrame(20); w->ShowWindow(3); m_pMainWnd=w; OnFileNew(); return 1; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(zzz,CWinApp) ON_COMMAND(100,OnFileNew) ON_COMMAND(101,OnFileOpen) END_MESSAGE_MAP() zzz a; ****************************************************************** // Program 31 - Copy and Paste class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (q!=0) { x=(iii*)p->GetNextItem(q); if(x->a!="a") { t.m_nStyle=0; t.m_nStyle|=CRectTracker::dottedLine; if((i!=0 && x==i) ||( x->a=="s")) t.m_nStyle|=CRectTracker::resizeInside; x->Draw(c,x->r); t.m_rect=x->r; t.Draw(c); } else if(x->GetItemState()!=COleClientItem::activeUIState) { x->DoVerb(OLEIVERB_SHOW,this); i=x; } } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i = new iii(q); i->a="a"; d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; if(i!=0) { i->Close(); i=0; } q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); x->a="c"; if(x->r.PtInRect(e)) { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else { x->a="s"; i=x; } } Invalidate(); } } void OnLButtonDblClk(UINT,CPoint e) { if(i!=0) if(i->r.PtInRect(e)) i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } void bb() { if(i!=0) i->CopyToClipboard(); } void cc() { ddd *p; p=(ddd*)GetDocument(); iii *x; x=new iii(p); x->CreateFromClipboard(); Invalidate(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_COMMAND(300,bb) ON_COMMAND(301,cc) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 32 - with Paste item same state as copied item; void cc() { ddd *p=(ddd*)GetDocument(); iii *x; POSITION q; q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); if(x->GetItemState()==COleClientItem::activeUIState) { ::MessageBox(0,"in cc","",0); x->a="c"; x->Close(); } } x=new iii(p); x->CreateFromClipboard(); x->a=s; Invalidate(); } ****************************************************************** // Program 33 - with paste at clicked point class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; CString a; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (p!=0) { x=(iii*)p->GetNextItem(q); if(x->a!="a") { t.m_nStyle=0; t.m_nStyle|=CRectTracker::dottedLine; if((i!=0 && x==i) ||( x->a=="s")) t.m_nStyle|=CRectTracker::resizeInside; x->Draw(c,x->r); t.m_rect=x->r; t.Draw(c); } else if(x->GetItemState()!=COleClientItem::activeUIState) { x->DoVerb(OLEIVERB_SHOW,this); i=x; } } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); i=new iii(p); i->a="a"; d.CreateItem(i); i->DoVerb(OLEIVERB_SHOW,this); } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; if(i!=0) { i->Close(); i=0; } q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); x->a="c"; if(x->r.PtInRect(e)) { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else { x->a="s"; i=x; } } Invalidate(); } } void OnLButtonDblClk(UINT,CPoint e) { if(i!=0) if(i->r.PtInRect(e)) { i->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); i->a="a"; } } void bb() { if(i!=0) { i->CopyToClipboard(1); s=i->a; } } void OnRButtonDown(UINT,CPoint p) { ddd *p=(ddd*)GetDocument(); iii *x; POSITION p1; p1=q->GetStartPosition(); while(p1!=0) { x=(iii*)q->GetNextItem(p1); if(x->GetItemState()==COleClientItem::activeUIState) { x->a="c"; x->Close(); } } x=new iii(q); x->CreateFromClipboard(); x->a=s; CRect r; r=x->r; x->r.top=p.x;x->r.left=p.y; x->r.bottom=p.x + r.Height(); x->r.right=p.y + r.Width(); Invalidate(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_COMMAND(302,bb) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ****************************************************************** // Program 34 - clone void OnRButtonDown(UINT,CPoint e) { ddd *p; p=(ddd*)GetDocument(); iii *x; x=new iii(p); x->CreateCloneFrom(i); x->a=i->a; CRect r; r=x->r; x->r.top=e.x;x->r.left=e.y; x->r.bottom=e.x + r.Height(); x->r.right=e.y + r.Width(); if(i->a=="a") { i->a="c"; i->Close(); } Invalidate(); } ****************************************************************** // Program 35 - Delete() void bb() { if(i!=0) i->Delete(); Invalidate(); } ****************************************************************** // Program 36 - Icon void bb() { if(i!=0) { if(i->GetDrawAspect()==DVASPECT_ICON) i->SetDrawAspect(DVASPECT_CONTENT); else i->SetDrawAspect(DVASPECT_ICON); } Invalidate(); } ****************************************************************** // Program 37 - with CanActivate(), OnActivate() and OnActivateUI() class iii: public COleClientItem { DECLARE_SERIAL(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& s) { COleClientItem::OnChangeItemPosition(s); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); r=s; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } int CanActivate() { if(COleClientItem::CanActivate()) { ::MessageBox(0,"CanActivate()","",0); return 1; } else { ::MessageBox(0,"Sorry cannot Activate","",0); return 0; } } void OnActivate() { ::MessageBox(0,"OnActivate()","",0); COleClientItem::OnActivate(); } void OnActivateUI() { ::MessageBox(0,"OnActivateUI()","",0); COleClientItem::OnActivateUI(); } }; IMPLEMENT_SERIAL(iii,COleClientItem,0) // OnActivate calls OnChange() with OLE_CHANGED_STATE ****************************************************************** // Program 38 - with OnGetClipRects() and OnShowItem() class iii: public COleClientItem { DECLARE_SERIAL(iii) public: CRect r; iii(ddd *p=0):COleClientItem(p) { r.SetRect(10,125,150,200); } void OnGetItemPosition(CRect& h) { h=r; } int OnChangeItemPosition(const CRect& h) { COleClientItem::OnChangeItemPosition(h); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); r=s; return 1; } void OnChange(OLE_NOTIFICATION f,DWORD g) { COleClientItem::OnChange(f,g); ddd *p= (ddd*)GetDocument(); p->UpdateAllViews(0); } void OnShowItem() { ::MessageBox(0,"OnShowItem()","",0); COleClientItem::OnShowItem(); } void OnGetClipRect(CRect& r) { ::MessageBox(0,"OnGetClipRect()","",0); ddd *p=(ddd*)GetDocument(); COleClientItem::OnGetClipRect(r); } }; IMPLEMENT_SERIAL(iii,COleClientItem,0) ****************************************************************** // Program 39 - TrackPopupMenu() class vvv :public CView { DECLARE_DYNCREATE(vvv) public: iii *i; CRectTracker t; vvv() { i=0; } void OnDraw(CDC *c) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while (p!=0) { t.m_nStyle=0; x=(iii*)p->GetNextItem(q); if(x==i) t.m_nStyle|=CRectTracker::resizeInside; x->SetDrawAspect(x->GetDrawAspect()); t.m_nStyle|=CRectTracker::dottedLine; t.m_rect=x->r; x->Draw(c,x->r); t.Draw(c); } } void aa() { COleInsertDialog d; d.DoModal(); ddd *p; p=(ddd*)GetDocument(); iii *x; x=new iii(q); d.CreateItem(x); x->DoVerb(OLEIVERB_SHOW,this); i=x; } void OnLButtonDown(UINT, CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; i=0; q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); if(!x->r.PtInRect(e)) x->Close(); else { t.m_rect=x->r; if(t.Track(this,e)) { Invalidate(); x->r=t.m_rect; } else { if(x->GetItemState()!=COleClientItem::activeUIState) i=x; Invalidate(); } } } } void OnLButtonDblClk(UINT,CPoint e) { ddd *p; p=(ddd*)GetDocument(); POSITION q; iii *x; q=p->GetStartPosition(); while(q!=0) { x=(iii*)p->GetNextItem(q); if(x->r.PtInRect(e)) x->DoVerb(GetKeyState(VK_SHIFT)<0?OLEIVERB_OPEN:OLEIVERB_SHOW,this); } } void OnRButtonDown(UINT, CPoint p) { CMenu *m,*n; m=AfxGetMainWnd()->GetMenu(); n=m->GetSubMenu(0); n->TrackPopupMenu(TPM_RIGHTBUTTON,p.x,p.y,this) ; } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(vvv,CView) ON_COMMAND(200,aa) ON_WM_LBUTTONDOWN() ON_WM_RBUTTONDOWN() ON_WM_LBUTTONDBLCLK() END_MESSAGE_MAP() IMPLEMENT_DYNCREATE(vvv,CView) ******************************************************************