//////////////////////////////////////////////////////////////// // Microsoft Systems Journal -- December 1999 // If this code works, it was written by Paul DiLascia. // If not, I don't know who wrote it. // Compiles with Visual C++ 6.0, runs on Windows 98 and probably NT too. // #include "StdAfx.h" #include "HtmlCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CHtmlCtrl, CHtmlView) BEGIN_MESSAGE_MAP(CHtmlCtrl, CHtmlView) ON_WM_DESTROY() ON_WM_MOUSEACTIVATE() END_MESSAGE_MAP() ////////////////// // Create control in same position as an existing static control with // the same ID (could be any kind of control, really) // BOOL CHtmlCtrl::CreateFromStatic(UINT nID, CWnd* pParent) { CStatic wndStatic; if (!wndStatic.SubclassDlgItem(nID, pParent)) return FALSE; // Get static control rect, convert to parent's client coords. CRect rc; wndStatic.GetWindowRect(&rc); pParent->ScreenToClient(&rc); wndStatic.DestroyWindow(); // create HTML control (CHtmlView) return Create(NULL, // class name NULL, // title (WS_CHILD | WS_VISIBLE ), // style rc, // rectangle pParent, // parent nID, // control ID NULL); // frame/doc context not used } //////////////// // Override to avoid CView stuff that assumes a frame. // void CHtmlCtrl::OnDestroy() { // This is probably unecessary since ~CHtmlView does it, but // safer to mimic CHtmlView::OnDestroy. if (m_pBrowserApp) { m_pBrowserApp->Release(); m_pBrowserApp = NULL; } CWnd::OnDestroy(); // bypass CView doc/frame stuff } //////////////// // Override to avoid CView stuff that assumes a frame. // int CHtmlCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg) { // bypass CView doc/frame stuff return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg); } ////////////////// // Override navigation handler to pass to "app:" links to virtual handler. // Cancels the navigation in the browser, since app: is a pseudo-protocol. // void CHtmlCtrl::OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel ) { const char APP_PROTOCOL[] = "app:"; int len = _tcslen(APP_PROTOCOL); if (_tcsnicmp(lpszURL, APP_PROTOCOL, len)==0) { OnAppCmd(lpszURL + len); *pbCancel = TRUE; } } ////////////////// // Called when the browser attempts to navigate to "app:foo" // with "foo" as lpszWhere. Override to handle app commands. // void CHtmlCtrl::OnAppCmd(LPCTSTR lpszWhere) { // default: do nothing }