This page is in Pre Alpha. That means no grammer checks, no editting and speeling mistakes galore! The explanations and the final version will come soon . Check it out at your own risk! a.bat md debug cl.exe /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR".\Debug/" /Fo".\Debug/" /Fd".\Debug/" /c "Carrot.cpp" rc.exe /l 0x409 /fo".\Debug/Carrot.res" /d "_DEBUG" /d "_AFXDLL" .\Carrot.rc link.exe ole32.lib oleaut32.lib ..\..\lib\uuid.lib /nologo /subsystem:windows /incremental:yes /pdb:".\Debug/Carrot.pdb" /debug /machine:I386 /out:".\Debug/Carrot.exe" ".\Debug\Carrot.obj" ".\Debug\Carrot.res" carrot.cpp #include #define VC_EXTRALEAN #include #include #include #include #include #include #include #include #include "urlmon.h" #include #include #include char aa[500]; BOOL Create( TCHAR* pchPath ); int m_fCreated=0; class CCarrotApp : public CWinApp { public: virtual BOOL InitInstance(); }; class CCarrotDoc:public CDocument { public: DECLARE_DYNCREATE(CCarrotDoc) }; class vvv : public IOleInPlaceFrame { public: STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void){return 0;} STDMETHODIMP_(ULONG) Release(void){return 0;} STDMETHODIMP GetWindow(HWND *){return 0;} STDMETHODIMP ContextSensitiveHelp(BOOL){return NOERROR;} STDMETHODIMP GetBorder(LPRECT){return NOERROR;} STDMETHODIMP RequestBorderSpace(LPCBORDERWIDTHS){return NOERROR;} STDMETHODIMP SetBorderSpace(LPCBORDERWIDTHS){return NOERROR;} STDMETHODIMP SetActiveObject(LPOLEINPLACEACTIVEOBJECT,LPCOLESTR){return NOERROR;} STDMETHODIMP InsertMenus(HMENU, LPOLEMENUGROUPWIDTHS){return E_NOTIMPL;} STDMETHODIMP SetMenu(HMENU, HOLEMENU, HWND){return E_NOTIMPL;} STDMETHODIMP RemoveMenus(HMENU){return E_NOTIMPL;} STDMETHODIMP SetStatusText(LPCOLESTR){return NOERROR;} STDMETHODIMP EnableModeless(BOOL){return NOERROR;} STDMETHODIMP TranslateAccelerator(LPMSG, WORD){return S_FALSE;} }; class CCarrotView : public CView { DECLARE_MESSAGE_MAP() DECLARE_DYNCREATE(CCarrotView) public: virtual void OnDraw(CDC* pDC); void OnBgcolor(); }; class CImpIOleClientSite : public IOleClientSite { public: STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void){return 0;} STDMETHODIMP_(ULONG) Release(void){return 0;} STDMETHODIMP SaveObject(void){return NOERROR;} STDMETHODIMP GetMoniker(DWORD, DWORD, LPMONIKER *){return E_NOTIMPL;} STDMETHODIMP GetContainer(LPOLECONTAINER *){return E_NOTIMPL;} STDMETHODIMP ShowObject(void){return E_NOTIMPL;} STDMETHODIMP OnShowWindow(BOOL){return NOERROR;} STDMETHODIMP RequestNewObjectLayout(void){return NOERROR;} }; class CImpIOleInPlaceSite : public IOleInPlaceSite { public: STDMETHODIMP QueryInterface(REFIID, void **); STDMETHODIMP_(ULONG) AddRef(void){return 0;} STDMETHODIMP_(ULONG) Release(void){return 0;} STDMETHODIMP GetWindow(HWND *); STDMETHODIMP ContextSensitiveHelp(BOOL){return NOERROR;} STDMETHODIMP CanInPlaceActivate(void){return NOERROR;} STDMETHODIMP OnInPlaceActivate(void){return 0;} STDMETHODIMP OnUIActivate(void){return NOERROR;} STDMETHODIMP GetWindowContext(LPOLEINPLACEFRAME *,LPOLEINPLACEUIWINDOW *, LPRECT, LPRECT, LPOLEINPLACEFRAMEINFO); STDMETHODIMP Scroll(SIZE){return E_NOTIMPL;} STDMETHODIMP OnUIDeactivate(BOOL){return NOERROR;} STDMETHODIMP OnInPlaceDeactivate(void){return NOERROR;} STDMETHODIMP DiscardUndoState(void){return NOERROR;} STDMETHODIMP DeactivateAndUndo(void){return NOERROR;} STDMETHODIMP OnPosRectChange(LPCRECT){return E_NOTIMPL;} }; class CImpIOleDocumentSite : public IOleDocumentSite { public: STDMETHODIMP QueryInterface(REFIID, void **){return 0;} STDMETHODIMP_(ULONG) AddRef(void){return 0;} STDMETHODIMP_(ULONG) Release(void){return 0;} STDMETHODIMP ActivateMe(IOleDocumentView *); }; vvv *v; class CCarrotView *m_pFR; CImpIOleInPlaceSite *m_pImpIOleIPSite; HWND m_hWnd1; LPOLEOBJECT m_pIOleObject; CImpIOleClientSite *m_pImpIOleClientSite; CImpIOleDocumentSite *m_pImpIOleDocumentSite; void abc(char *p){FILE * fp;fp = fopen("c:\\inetsdk\\samples\\carrot\\z.txt","a+");fprintf(fp,"%s\n",p);fclose(fp);} CCarrotApp theApp; BOOL CCarrotApp::InitInstance() { //abc("CCarrotApp::InitInstance"); OleInitialize( NULL ); CMultiDocTemplate* p=new CMultiDocTemplate(129,RUNTIME_CLASS(CCarrotDoc), RUNTIME_CLASS(CMDIChildWnd),RUNTIME_CLASS(CCarrotView)); AddDocTemplate(p); CMDIFrameWnd* pMainFrame = new CMDIFrameWnd; pMainFrame->LoadFrame(128); m_pMainWnd = pMainFrame; pMainFrame->ShowWindow(3); OnFileNew(); return TRUE; } IMPLEMENT_DYNCREATE(CCarrotDoc, CDocument) STDMETHODIMP CImpIOleDocumentSite::ActivateMe( IOleDocumentView *pView ) { //abc("CImpIOleDocumentSite::ActivateMe"); RECT rc; IOleDocument *pDoc; m_pIOleObject->QueryInterface(IID_IOleDocument,(void **)&pDoc); pDoc->CreateView(m_pImpIOleIPSite,NULL,0,&pView); m_pFR->GetClientRect( &rc ); pView->SetRect( &rc ); //pView->Show( TRUE ); return NOERROR; } STDMETHODIMP CImpIOleInPlaceSite::GetWindow( HWND *phWnd ) { //abc("CImpIOleInPlaceSite::GetWindow"); *phWnd = m_hWnd1; return NOERROR; } STDMETHODIMP CImpIOleInPlaceSite::GetWindowContext( LPOLEINPLACEFRAME* ppIIPFrame,LPOLEINPLACEUIWINDOW* ppIIPUIWindow, LPRECT prcPos,LPRECT prcClip, LPOLEINPLACEFRAMEINFO pFI ) { //abc("CImpIOleInPlaceSite::GetWindowContext"); *ppIIPFrame=v; pFI->cb = sizeof(OLEINPLACEFRAMEINFO); pFI->hwndFrame=m_hWnd1; return NOERROR; } BOOL Create() { //abc("CSite::Create"); v = new vvv; m_pImpIOleClientSite=new CImpIOleClientSite(); m_pImpIOleIPSite = new CImpIOleInPlaceSite(); m_pImpIOleDocumentSite = new CImpIOleDocumentSite(); CoCreateInstance(CLSID_HTMLDocument,0,CLSCTX_INPROC_SERVER,IID_IOleObject, (void **)&m_pIOleObject); m_pIOleObject->SetClientSite( m_pImpIOleClientSite ); OLECHAR szwName[256]; MultiByteToWideChar(CP_ACP,0,"http://www.microsoft.com",-1,szwName,256); IMoniker* pIMoniker; CreateURLMoniker(0,(LPWSTR)szwName,&pIMoniker); IPersistMoniker* pPMk; m_pIOleObject->QueryInterface(IID_IPersistMoniker,(void **)&pPMk); pPMk->Load(FALSE,pIMoniker,0,STGM_READ); m_pIOleObject->DoVerb(OLEIVERB_SHOW,0,m_pImpIOleClientSite,0,m_hWnd1,0); return TRUE; } IMPLEMENT_DYNCREATE(CCarrotView, CView) BEGIN_MESSAGE_MAP(CCarrotView, CView) ON_COMMAND(32786,OnBgcolor) END_MESSAGE_MAP() void CCarrotView::OnDraw(CDC*) { //abc("CCarrotView::OnDraw"); if ( m_fCreated == 0 ) { m_fCreated = 1; m_pFR = this; m_hWnd1=m_hWnd; ::Create(); } } STDMETHODIMP CImpIOleInPlaceSite::QueryInterface( REFIID riid, void **ppv ) { //abc("CImpIOleInPlaceSite::QueryInterface"); return v->QueryInterface( riid, ppv ); } char *xxx(unsigned short *c) { char *a, *b; b=(char *)malloc(500); a=b; while(*c) { *b=*c; b++; c++; } *b=0; return a; } STDMETHODIMP CImpIOleClientSite::QueryInterface( REFIID riid, void **ppv ) { BSTR bstr; abc("CImpIOleClientSite::QueryInterface"); StringFromCLSID(riid,&bstr); abc(xxx(bstr)); return v->QueryInterface( riid, ppv ); } STDMETHODIMP vvv::QueryInterface( REFIID riid, void **ppv ) { //abc("CCarrotView::QueryInterface"); if ( IID_IUnknown == riid || IID_IOleInPlaceUIWindow == riid || IID_IOleWindow == riid || IID_IOleInPlaceFrame == riid ){ *ppv = (IOleInPlaceFrame *)this; return NOERROR; } if ( IID_IOleDocumentSite == riid ) { *ppv = m_pImpIOleDocumentSite; return NOERROR; } return E_NOINTERFACE; } void CCarrotView::OnBgcolor() { //abc("CCarrotView::OnBgcolor"); CColorDialog* pColorDlg = new CColorDialog; pColorDlg->DoModal(); COLORREF color = pColorDlg->GetColor(); IUnknown* lpUnk = m_pIOleObject; IHTMLDocument2* pHTMLDocument2; lpUnk->QueryInterface(IID_IHTMLDocument2, (void **)&pHTMLDocument2); IHTMLBodyElement* pBody; pHTMLDocument2->get_body(&pBody); int idx; WCHAR buff[8]=L"#000000"; WCHAR HEX[17]=L"0123456789ABCDEF"; for (int i=0;i<3;i++) { //abc("CCarrotView::SetBgColor 4"); idx = color&0xF; buff[2*i+2] = HEX[idx]; color >>= 4; idx = color&0xF; buff[2*i+1] = HEX[idx]; color >>= 4; } pBody->put_bgColor(buff); } carrot.rc #include "afxres.h" 128 MENU PRELOAD DISCARDABLE BEGIN MENUITEM "Back&grond Color",32786 END 129 MENU PRELOAD DISCARDABLE BEGIN MENUITEM "Back&grond Color",32786 END