热度 15
2010-5-5 15:07
2015 次阅读|
0 个评论
续上 4. 使用 CHtmlCtrl 并意味我们要接受原作者的一切 source. 实际上 , CHtmlCtrl sample 上有一个显着的特性 , 非常接近我们的应用 . DiLascia 将 script 中对 button 的点击 event, 利用 a pref 的语法 , 设置一个 lias 传递给了 Host. 因为仅仅是加入 CHtmlCtrl 的 sample, 我们就能够实际相应来自于 web page 上任何 button 的 press event. 引人入胜的特性 ... 沉思了一段时间后 , 或者因为我们自身的愚鲁 , 这个特性似乎不能被我们所用 . 首先我们没有也不会设计各种 button 或者甚至是 false button trigger event 来触发我们的行为 . 另外 , 我们其实打算在任何 time wanted, send this requirement to host for our requirement. That means, we can call host function in any conditions or at any time, and then, we have to pass the propograte parameters to host also. 因此 , 实际上 , 无需的该段功能代码是被我们 disable 掉了 . 5. 现在我们有 CHtmlCtrl 导入了 CHtmlView. 一个 kernel level import step 是 , 来自 R. Lake 的 http://www.codeguru.com/cpp/w-d/doc_view/chtmlview/article.php/c3253 这是我们在这 2 个工作日中所能找到的最简洁与最清晰明了的思路和例程 . 用来暴露 IDocHostUIHandler 的实现 . 无论如何 , 简洁到 300 rows 不到的 source code, 对我们的 replantment 以及 know why/how 都是非常有帮助的 . Lake 引入了两个 class, 实际上 Allen 觉得很可能他们是一个 , 因为本来 ROleControlSite 应能 can everything. 增加的一个 ROccManager, 怎么看给人的感觉 , 就是为了在未来的项目拓展中 , 多个 instance 的管理吧 ? 该超级链接已经清楚说明了一切 , Allen 简单的理解就是 , Lake 用他定义的 ROleControlSite, 接管属于了 MFC IDocHostUIHandler 做的一切 . 因为从 source 中对 IDocHostUIHandler 的全部方法进行重写 , 证明了这个说法 . 6. 现在我们回到网络资源上一个常见的说法 , 那就是因为 doc/view 具有 AfxEnableControlContainer(), 因此我们替换上我们自己的 ROleControlSite, 于是便成功实现了这个 " 接管 " 的工作 . 那么我们自己的尝试 , 充分说明 , 并非只有 doc/view struction 许可这样实现 . dialog based 同样也有 AfxEnableControlContainer(), Lake 替换 AfxEnableControlContainer 的 site 参数的技巧 , 对 dialog based project 亦是有效 . 7. 我们引入了 sample 中的 ROleControlSite source, 但是对 Lake 完成这个工作的目的兴趣缺缺 , 毕竟我们不是像 Lake 那样 , 主要目的是打算 disable 掉 context Menu 的用法 , 不让 user 去选择观看 web page 的 source code... 因此我们没选择 Lake 的其他 source, but 除了 ... 重载 create(), 当然这是一切的提前 , 不是吗 ? 我们列出这份至关重要的代码 , 通过代码的执行 , 也证明了在 item6 中我们的讨论 : BOOL CMyHtmlCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class //return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); /////////////////////////////////// // The following does the same as MFC source, except that // AfxEnableControlContainer() is called with our handler. /////////////////////////////////// CRect c_clientRect; GetClientRect(c_clientRect); /////////////////////////////////// // create the view window: m_pCreateContext = pContext; if (!CView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext)) { return FALSE; } AfxEnableControlContainer(m_pROccManager); /////////////////////////////////// // create the control window: if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName, WS_VISIBLE | WS_CHILD, c_clientRect, this, AFX_IDW_PANE_FIRST)) { DestroyWindow(); return FALSE; } LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown(); HRESULT hr = lpUnk-QueryInterface(IID_IWebBrowser2, (void**) m_pBrowserApp); if (!SUCCEEDED(hr)) { m_pBrowserApp = NULL; m_wndBrowser.DestroyWindow(); DestroyWindow(); return FALSE; } return TRUE; } 基于 dialog 的vc project 与 内嵌java script的相互调用(一) 基于 dialog 的vc project 与 内嵌java script的相互调用(二) 基于 dialog 的vc project 与 内嵌java script的相互调用(三)