233 lines
5.7 KiB
C++
233 lines
5.7 KiB
C++
////////////////////////////////////////////////////////////////
|
|
// 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 unnecessary 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 TCHAR APP_PROTOCOL[] = _T("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
|
|
}
|
|
|
|
|
|
//new code
|
|
CString CHtmlCtrl::GetFullName() const
|
|
{
|
|
ASSERT(m_pBrowserApp != NULL);
|
|
|
|
BSTR bstr;
|
|
m_pBrowserApp->get_FullName(&bstr);
|
|
CString retVal(bstr);
|
|
|
|
SysFreeString(bstr); // Added this line to prevent leak.
|
|
return retVal;
|
|
}
|
|
|
|
CString CHtmlCtrl::GetType() const
|
|
{
|
|
ASSERT(m_pBrowserApp != NULL);
|
|
|
|
BSTR bstr;
|
|
m_pBrowserApp->get_Type(&bstr);
|
|
|
|
CString retVal(bstr);
|
|
|
|
SysFreeString(bstr); // Added this line to prevent leak.
|
|
return retVal;
|
|
}
|
|
|
|
CString CHtmlCtrl::GetLocationName() const
|
|
{
|
|
ASSERT(m_pBrowserApp != NULL);
|
|
|
|
BSTR bstr;
|
|
m_pBrowserApp->get_LocationName(&bstr);
|
|
CString retVal(bstr);
|
|
|
|
SysFreeString(bstr); // Added this line to prevent leak.
|
|
return retVal;
|
|
}
|
|
|
|
CString CHtmlCtrl::GetLocationURL() const
|
|
{
|
|
ASSERT(m_pBrowserApp != NULL);
|
|
|
|
BSTR bstr;
|
|
m_pBrowserApp->get_LocationURL(&bstr);
|
|
CString retVal(bstr);
|
|
|
|
SysFreeString(bstr); // Added this line to prevent leak.
|
|
return retVal;
|
|
}
|
|
|
|
void CHtmlCtrl::Navigate(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
|
|
LPCTSTR lpszTargetFrameName /* = NULL */ ,
|
|
LPCTSTR lpszHeaders /* = NULL */, LPVOID lpvPostData /* = NULL */,
|
|
DWORD dwPostDataLen /* = 0 */)
|
|
{
|
|
CString strURL(lpszURL);
|
|
BSTR bstrURL = strURL.AllocSysString();
|
|
|
|
COleSafeArray vPostData;
|
|
if (lpvPostData != NULL)
|
|
{
|
|
if (dwPostDataLen == 0)
|
|
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
|
|
|
|
vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
|
|
}
|
|
|
|
m_pBrowserApp->Navigate(bstrURL, COleVariant((long) dwFlags, VT_I4), COleVariant(lpszTargetFrameName, VT_BSTR),
|
|
vPostData, COleVariant(lpszHeaders, VT_BSTR));
|
|
|
|
SysFreeString(bstrURL); // Added this line to prevent leak.
|
|
}
|
|
|
|
|
|
BOOL CHtmlCtrl::LoadFromResource(LPCTSTR lpszResource)
|
|
{
|
|
HINSTANCE hInstance = AfxGetResourceHandle();
|
|
ASSERT(hInstance != NULL);
|
|
|
|
CString strResourceURL;
|
|
BOOL bRetVal = TRUE;
|
|
LPTSTR lpszModule = new TCHAR[_MAX_PATH];
|
|
|
|
if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
|
|
{
|
|
strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
|
|
Navigate(strResourceURL, 0, 0, 0);
|
|
}
|
|
else
|
|
bRetVal = FALSE;
|
|
|
|
delete [] lpszModule;
|
|
return bRetVal;
|
|
}
|
|
|
|
BOOL CHtmlCtrl::LoadFromResource(UINT nRes)
|
|
{
|
|
HINSTANCE hInstance = AfxGetResourceHandle();
|
|
ASSERT(hInstance != NULL);
|
|
|
|
CString strResourceURL;
|
|
BOOL bRetVal = TRUE;
|
|
LPTSTR lpszModule = new TCHAR[_MAX_PATH];
|
|
|
|
if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
|
|
{
|
|
strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
|
|
Navigate(strResourceURL, 0, 0, 0);
|
|
}
|
|
else
|
|
bRetVal = FALSE;
|
|
|
|
delete [] lpszModule;
|
|
return bRetVal;
|
|
}
|
|
//end new code
|
|
|
|
|
|
void CHtmlCtrl::OnDocumentComplete(LPCTSTR lpszURL)
|
|
{
|
|
|
|
CHtmlView::OnDocumentComplete(lpszURL);
|
|
}
|
|
|
|
|
|
void CHtmlCtrl::OnNavigateComplete2(LPCTSTR strURL)
|
|
{
|
|
CHtmlView::OnNavigateComplete2(strURL);
|
|
|
|
}
|
|
|
|
BOOL CHtmlCtrl::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
return CHtmlView::PreTranslateMessage(pMsg);
|
|
} |