|
et->Release(); if (SUCCEEDED(hr)) { hr = pSP->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID*)&m_pBrowser); if(hr==S_OK) TRACE(_T("Get m_pBrowser: %x\n"),m_pBrowser); pSP->Release(); } } 这样就可以以得到这个Band对象对应的IE实例(即上述代码中的m_pBrowser)。通过m_pBrowser,Band对象可以访问当前浏览器浏览的页面、调用网页中的脚本代码以及实现其他的Band对象与网页之间的交互功能。 实现基于MFC的Band对象 为了将MFC类库的强大功能自然纳入Band对象,我们需要一个基于MFC的Frame窗口。我们注意到,CTangramBandImpl已经包含了一个成员变量: CFrameWnd* m_pFrameWnd; 这个变量建立了一座衔接Band对象与MFC类库的桥梁,在每个Band对象的RegisterAndCreateWindow函数中,均包含如下代码: BOOL CHBand::RegisterAndCreateWindow() { RECT rect; ::GetClientRect(m_hWndParent, &rect); AFX_MANAGE_STATE(AfxGetStaticModuleState()); theApp.m_pBand = this; m_pFrameWnd = new CTangramBandFrame(); CCreateContext m_Context; m_Context.m_pNewViewClass = RUNTIME_CLASS(TestFormView); CWnd* pWnd = CWnd::FromHandle(m_hWndParent); m_pFrameWnd->Create(NULL,_T("TangramBand"), WS_CHILD, CRect(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top), pWnd, NULL, NULL, &m_Context); theApp.m_pBand = NULL; return true; } 我们注意到,这段代码创建了一个MFC CFrameWnd对象m_pFrameWnd。由此,一切关于MFC的代码技巧自然而然地盘活了,我们看到一个典型的MFC框架被融入IE之中: BOOL CTangramBandFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if(!m_pBand->m_bCommBand) { m_SplitterWnd.CreateStatic(this, 2, 1); m_SplitterWnd.CreateView(0, 0, RUNTIME_CLASS(TestFormView), CSize(0, 100), NULL); m_SplitterWnd.CreateView(1, 0, RUNTIME_CLASS(TestFormView2), CSize(0, 100), NULL); } else { m_SplitterWnd.CreateStatic(this, 1, 2); m_SplitterWnd.CreateView(0, 0, RUNTIME_CLASS(TestFormView), CSize(150, 100), NULL); m_SplitterWnd.CreateView(0, 1, RUNTIME_CLASS(TestFormView2), CSize(0, 0), NULL); } return true; } 由于Band对象存在于一个动态链接库中,故创建MFC对象时要注意在合适的位置调用代码: AFX_MANAGE_STATE(AfxGetStaticModuleState()); 以使得MFC能够正确处理消息。 输入消息处理 接口IInputObject用于管理Band对象的输入以及对话框、加速键消息,关于MFC消息,由于Band对象本质上是一种IE插件,故消息队列由IE控制,因此MFC窗口的消息处理是个关键问题。当Band对象捕获输入焦点时,我们必须保证MFC窗口消息被正确处理,下述代码: STDMETHODIMP CTangramBandImpl::TranslateAcceleratorIO(LPMSG lpMsg) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(m_bFocus&&theApp.m_pWnd) { theApp.m_pWnd->PreTranslateMessage(lpMsg); TRACE(_T("TranslateAcceleratorIO\n")); return S_OK; } return S_FALSE; } 用来处理当前具有输入焦点的MFC窗口theApp.m_pWnd的相关消息,因此具有输入焦点的MFC窗口必须重载函数PreTranslateMessage,特别是CFormView的派生对象,在范例代码中我们给出了重载该函数的例子。 调试与中文处理 Band对象的调试例程是IE,因此需要修改工程配置,使得调试过程定向到IE。为使得Band对象能够正确接受中文输入,代码工程必须是基于UNICODE的。 您可以到杂志的站点(http://mag.csdn.net/msdn)上下载本刊附带的源代码,其中的MsdnJxControl解决方案中有本文所提到的项目的完整实现。该解决方案已经为您做好了所有的配置工作,但还是希望您能够通过属性面板仔细观察该解决方案的具体设置。 小结 正如Microsoft系列的其他产品一样,Internet Explorer中存在着丰富的扩展空间。对于Microsoft而言,框架窗口的四周存在着可停靠对象的口岸,因此你可以在这些岸边开拓你的软件空间以展示你的软件魅力,如果你读到了本文,那么你就开始吧,充满诱惑的海岸,等待你去开拓。
上一页 [1] [2] [系统软件]Internet Explorer 编程简述(繁体版) [系统软件]单击链接后无法打开新的 Internet Explorer 窗口或… [系统软件]delphi2005帮助系统使用了microsoft document exp… [系统软件]对Internet Explorer Web 控件做一点修改 [系统软件]OLE with the internet explorer [系统软件]3dMax导出.x文件以及3D Explorer [常用软件]微软Internet Explorer 8最新动向 [常用软件]PDF全能管家——PDFExplorer [常用软件]Internet Explorer 6 Public Preview 最新出击!! [常用软件]Internet Explorer中的潘多拉魔盒 作者:江海
|