XTHtmlView.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:23k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTHtmlView.cpp : implementation of the CXTHtmlView class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPVC80Helpers.h"  // Visual Studio 2005 helper functions
  22. #include "Common/XTPColorManager.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "XTGlobal.h"
  25. #include "XTHtmlView.h"
  26. #ifdef _DEBUG
  27. #define new DEBUG_NEW
  28. #undef THIS_FILE
  29. static char THIS_FILE[] = __FILE__;
  30. #endif
  31. /////////////////////////////////////////////////////////////////////////////
  32. // CXTHtmlView
  33. /////////////////////////////////////////////////////////////////////////////
  34. CXTHtmlView::CXTHtmlView() : CFormView((LPCTSTR) NULL)
  35. {
  36. m_bLoading = true;
  37. m_strLoading = _T("Loading...");
  38. m_bLoadingMessage = false;
  39. m_pBrowserApp = NULL;
  40. }
  41. CXTHtmlView::~CXTHtmlView()
  42. {
  43. if (m_pBrowserApp != NULL)
  44. m_pBrowserApp->Release();
  45. }
  46. IMPLEMENT_DYNCREATE(CXTHtmlView, CFormView)
  47. BEGIN_MESSAGE_MAP(CXTHtmlView, CFormView)
  48. //{{AFX_MSG_MAP(CXTHtmlView)
  49. ON_WM_SIZE()
  50. ON_WM_DESTROY()
  51. ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
  52. ON_WM_ERASEBKGND()
  53. ON_WM_PAINT()
  54. //}}AFX_MSG_MAP
  55. END_MESSAGE_MAP()
  56. BEGIN_EVENTSINK_MAP(CXTHtmlView, CFormView)
  57. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 102 /* StatusTextChange */, OnStatusTextChange, VTS_BSTR)
  58. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 108 /* ProgressChange */, OnProgressChange, VTS_I4 VTS_I4)
  59. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 105 /* CommandStateChange */, OnCommandStateChange, VTS_I4 VTS_BOOL)
  60. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 106 /* DownloadBegin */, OnDownloadBegin, VTS_NONE)
  61. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 104 /* DownloadComplete */, OnDownloadComplete, VTS_NONE)
  62. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 113 /* TitleChange */, OnTitleChange, VTS_BSTR)
  63. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 252 /* NavigateComplete2 */, NavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
  64. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 250 /* BeforeNavigate2 */, BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
  65. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 112 /* PropertyChange */, OnPropertyChange, VTS_BSTR)
  66. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 251 /* NewWindow2 */, OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
  67. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 259 /* DocumentComplete */, DocumentComplete, VTS_DISPATCH VTS_PVARIANT)
  68. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 271, /* NavigateError */  NavigateError, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
  69. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 253 /* OnQuit */, OnQuit, VTS_NONE)
  70. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 254 /* OnVisible */, OnVisible, VTS_BOOL)
  71. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 255 /* OnToolBar */, OnToolBar, VTS_BOOL)
  72. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 256 /* OnMenuBar */, OnMenuBar, VTS_BOOL)
  73. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 257 /* OnStatusBar */, OnStatusBar, VTS_BOOL)
  74. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 258 /* OnFullScreen */, OnFullScreen, VTS_BOOL)
  75. ON_EVENT(CXTHtmlView, AFX_IDW_PANE_FIRST, 260 /* OnTheaterMode */, OnTheaterMode, VTS_BOOL)
  76. END_EVENTSINK_MAP()
  77. void CXTHtmlView::OnDraw(CDC* /* pDC */)
  78. {
  79. // this class should never do its own drawing;
  80. // the browser control should handle everything
  81. ASSERT(FALSE);
  82. }
  83. void CXTHtmlView::OnFilePrint()
  84. {
  85. // get the HTMLDocument
  86. if (m_pBrowserApp != NULL)
  87. {
  88. LPOLECOMMANDTARGET lpTarget = NULL;
  89. LPDISPATCH lpDisp = GetHtmlDocument();
  90. if (lpDisp != NULL)
  91. {
  92. // the control will handle all printing UI
  93. if (SUCCEEDED(lpDisp->QueryInterface(IID_IOleCommandTarget,
  94. (LPVOID*) &lpTarget)))
  95. {
  96. lpTarget->Exec(NULL, OLECMDID_PRINT, 0, NULL, NULL);
  97. lpTarget->Release();
  98. }
  99. lpDisp->Release();
  100. }
  101. }
  102. }
  103. #ifdef _DEBUG
  104. void CXTHtmlView::AssertValid() const
  105. {
  106. CFormView::AssertValid();
  107. }
  108. void CXTHtmlView::Dump(CDumpContext& dc) const
  109. {
  110. CFormView::Dump(dc);
  111. }
  112. #endif //_DEBUG
  113. void CXTHtmlView::OnDestroy()
  114. {
  115. if (m_pBrowserApp)
  116. {
  117. m_pBrowserApp->Release();
  118. m_pBrowserApp = 0;
  119. }
  120. }
  121. void CXTHtmlView::OnSize(UINT nType, int cx, int cy)
  122. {
  123. CFormView::OnSize(nType, cx, cy);
  124. if (::IsWindow(m_wndBrowser.m_hWnd))
  125. {
  126. // need to push non-client borders out of the client area
  127. int icx = ::GetSystemMetrics (SM_CXEDGE);
  128. int icy = ::GetSystemMetrics (SM_CYEDGE);
  129. m_wndBrowser.SetWindowPos(NULL, -icx, -icy,
  130. cx+(icx * 2), cy+(icy * 2), SWP_NOACTIVATE | SWP_NOZORDER);
  131. }
  132. }
  133. BOOL CXTHtmlView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
  134. DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
  135. UINT nID, CCreateContext* pContext)
  136. {
  137. // create the view window itself
  138. m_pCreateContext = pContext;
  139. if (!CView::Create(lpszClassName, lpszWindowName,
  140. dwStyle, rect, pParentWnd, nID, pContext))
  141. {
  142. return FALSE;
  143. }
  144. AfxEnableControlContainer();
  145. RECT rectClient;
  146. GetClientRect(&rectClient);
  147. // create the control window
  148. // AFX_IDW_PANE_FIRST is a safe but arbitrary ID
  149. if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, lpszWindowName,
  150. WS_VISIBLE | WS_CHILD, rectClient, this, AFX_IDW_PANE_FIRST))
  151. {
  152. DestroyWindow();
  153. return FALSE;
  154. }
  155. LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown();
  156. HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
  157. if (!SUCCEEDED(hr))
  158. {
  159. m_pBrowserApp = NULL;
  160. m_wndBrowser.DestroyWindow();
  161. DestroyWindow();
  162. return FALSE;
  163. }
  164. return TRUE;
  165. }
  166. CString CXTHtmlView::GetType() const
  167. {
  168. ASSERT(m_pBrowserApp != NULL);
  169. if (!m_pBrowserApp)
  170. return _T("");
  171. BSTR bstr;
  172. m_pBrowserApp->get_Type(&bstr);
  173. CString retVal(bstr);
  174. return retVal;
  175. }
  176. long CXTHtmlView::GetLeft() const
  177. {
  178. ASSERT(m_pBrowserApp != NULL);
  179. if (!m_pBrowserApp)
  180. return 0;
  181. long result;
  182. m_pBrowserApp->get_Left(&result);
  183. return result;
  184. }
  185. long CXTHtmlView::GetTop() const
  186. {
  187. ASSERT(m_pBrowserApp != NULL);
  188. if (!m_pBrowserApp)
  189. return 0;
  190. long result;
  191. m_pBrowserApp->get_Top(&result);
  192. return result;
  193. }
  194. int CXTHtmlView::GetToolBar() const
  195. {
  196. ASSERT(m_pBrowserApp != NULL);
  197. if (!m_pBrowserApp)
  198. return 0;
  199. int result;
  200. m_pBrowserApp->get_ToolBar(&result);
  201. return result;
  202. }
  203. long CXTHtmlView::GetHeight() const
  204. {
  205. ASSERT(m_pBrowserApp != NULL);
  206. if (!m_pBrowserApp)
  207. return 0;
  208. long result;
  209. m_pBrowserApp->get_Height(&result);
  210. return result;
  211. }
  212. BOOL CXTHtmlView::GetVisible() const
  213. {
  214. ASSERT(m_pBrowserApp != NULL);
  215. if (!m_pBrowserApp)
  216. return FALSE;
  217. VARIANT_BOOL result;
  218. m_pBrowserApp->get_Visible(&result);
  219. return result;
  220. }
  221. CString CXTHtmlView::GetLocationName() const
  222. {
  223. ASSERT(m_pBrowserApp != NULL);
  224. if (!m_pBrowserApp)
  225. return _T("");
  226. BSTR bstr;
  227. m_pBrowserApp->get_LocationName(&bstr);
  228. CString retVal(bstr);
  229. return retVal;
  230. }
  231. CString CXTHtmlView::GetLocationURL() const
  232. {
  233. ASSERT(m_pBrowserApp != NULL);
  234. if (!m_pBrowserApp)
  235. return _T("");
  236. BSTR bstr;
  237. m_pBrowserApp->get_LocationURL(&bstr);
  238. CString retVal(bstr);
  239. return retVal;
  240. }
  241. BOOL CXTHtmlView::GetBusy() const
  242. {
  243. ASSERT(m_pBrowserApp != NULL);
  244. if (!m_pBrowserApp)
  245. return FALSE;
  246. VARIANT_BOOL result;
  247. m_pBrowserApp->get_Busy(&result);
  248. return result;
  249. }
  250. READYSTATE CXTHtmlView::GetReadyState() const
  251. {
  252. ASSERT(m_pBrowserApp != NULL);
  253. if (!m_pBrowserApp)
  254. return READYSTATE_UNINITIALIZED;
  255. READYSTATE result;
  256. m_pBrowserApp->get_ReadyState(&result);
  257. return result;
  258. }
  259. BOOL CXTHtmlView::GetOffline() const
  260. {
  261. ASSERT(m_pBrowserApp != NULL);
  262. if (!m_pBrowserApp)
  263. return FALSE;
  264. VARIANT_BOOL result;
  265. m_pBrowserApp->get_Offline(&result);
  266. return result;
  267. }
  268. BOOL CXTHtmlView::GetSilent() const
  269. {
  270. ASSERT(m_pBrowserApp != NULL);
  271. if (!m_pBrowserApp)
  272. return FALSE;
  273. VARIANT_BOOL result;
  274. m_pBrowserApp->get_Silent(&result);
  275. return result;
  276. }
  277. LPDISPATCH CXTHtmlView::GetApplication() const
  278. {
  279. ASSERT(m_pBrowserApp != NULL);
  280. if (!m_pBrowserApp)
  281. return 0;
  282. LPDISPATCH result;
  283. m_pBrowserApp->get_Application(&result);
  284. return result;
  285. }
  286. LPDISPATCH CXTHtmlView::GetParentBrowser() const
  287. {
  288. ASSERT(m_pBrowserApp != NULL);
  289. if (!m_pBrowserApp)
  290. return 0;
  291. LPDISPATCH result;
  292. m_pBrowserApp->get_Parent(&result);
  293. return result;
  294. }
  295. LPDISPATCH CXTHtmlView::GetContainer() const
  296. {
  297. ASSERT(m_pBrowserApp != NULL);
  298. if (!m_pBrowserApp)
  299. return 0;
  300. LPDISPATCH result;
  301. m_pBrowserApp->get_Container(&result);
  302. return result;
  303. }
  304. LPDISPATCH CXTHtmlView::GetHtmlDocument() const
  305. {
  306. ASSERT(m_pBrowserApp != NULL);
  307. if (!m_pBrowserApp)
  308. return 0;
  309. LPDISPATCH result;
  310. m_pBrowserApp->get_Document(&result);
  311. return result;
  312. }
  313. BOOL CXTHtmlView::GetTopLevelContainer() const
  314. {
  315. ASSERT(m_pBrowserApp != NULL);
  316. if (!m_pBrowserApp)
  317. return FALSE;
  318. VARIANT_BOOL result;
  319. m_pBrowserApp->get_TopLevelContainer(&result);
  320. return result;
  321. }
  322. BOOL CXTHtmlView::GetMenuBar() const
  323. {
  324. ASSERT(m_pBrowserApp != NULL);
  325. if (!m_pBrowserApp)
  326. return FALSE;
  327. VARIANT_BOOL result;
  328. m_pBrowserApp->get_MenuBar(&result);
  329. return result;
  330. }
  331. BOOL CXTHtmlView::GetFullScreen() const
  332. {
  333. ASSERT(m_pBrowserApp != NULL);
  334. if (!m_pBrowserApp)
  335. return FALSE;
  336. VARIANT_BOOL result;
  337. m_pBrowserApp->get_FullScreen(&result);
  338. return result;
  339. }
  340. BOOL CXTHtmlView::GetStatusBar() const
  341. {
  342. ASSERT(m_pBrowserApp != NULL);
  343. if (!m_pBrowserApp)
  344. return FALSE;
  345. VARIANT_BOOL result;
  346. m_pBrowserApp->get_StatusBar(&result);
  347. return result;
  348. }
  349. OLECMDF CXTHtmlView::QueryStatusWB(OLECMDID cmdID) const
  350. {
  351. ASSERT(m_pBrowserApp != NULL);
  352. if (!m_pBrowserApp)
  353. return (OLECMDF)0;
  354. OLECMDF result;
  355. m_pBrowserApp->QueryStatusWB(cmdID, &result);
  356. return result;
  357. }
  358. void CXTHtmlView::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
  359. VARIANT* pvaIn, VARIANT* pvaOut)
  360. {
  361. ASSERT(m_pBrowserApp != NULL);
  362. if (!m_pBrowserApp)
  363. return;
  364. m_pBrowserApp->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
  365. }
  366. BOOL CXTHtmlView::GetRegisterAsBrowser() const
  367. {
  368. ASSERT(m_pBrowserApp != NULL);
  369. if (!m_pBrowserApp)
  370. return FALSE;
  371. VARIANT_BOOL result;
  372. m_pBrowserApp->get_RegisterAsBrowser(&result);
  373. return result;
  374. }
  375. BOOL CXTHtmlView::GetRegisterAsDropTarget() const
  376. {
  377. ASSERT(m_pBrowserApp != NULL);
  378. if (!m_pBrowserApp)
  379. return FALSE;
  380. VARIANT_BOOL result;
  381. m_pBrowserApp->get_RegisterAsDropTarget(&result);
  382. return result;
  383. }
  384. BOOL CXTHtmlView::GetTheaterMode() const
  385. {
  386. ASSERT(m_pBrowserApp != NULL);
  387. if (!m_pBrowserApp)
  388. return FALSE;
  389. VARIANT_BOOL result;
  390. m_pBrowserApp->get_TheaterMode(&result);
  391. return result;
  392. }
  393. BOOL CXTHtmlView::GetAddressBar() const
  394. {
  395. ASSERT(m_pBrowserApp != NULL);
  396. if (!m_pBrowserApp)
  397. return FALSE;
  398. VARIANT_BOOL result;
  399. m_pBrowserApp->get_AddressBar(&result);
  400. return result;
  401. }
  402. BOOL CXTHtmlView::LoadFromResource(LPCTSTR lpszResource)
  403. {
  404. HINSTANCE hInstance = AfxGetResourceHandle();
  405. ASSERT(hInstance != NULL);
  406. CString strResourceURL;
  407. BOOL bRetVal = TRUE;
  408. LPTSTR lpszModule = new TCHAR[_MAX_PATH];
  409. if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
  410. {
  411. strResourceURL.Format(_T("res://%s/%s"), lpszModule, lpszResource);
  412. Navigate(strResourceURL, 0, 0, 0);
  413. }
  414. else
  415. bRetVal = FALSE;
  416. delete[] lpszModule;
  417. return bRetVal;
  418. }
  419. BOOL CXTHtmlView::LoadFromResource(UINT nRes)
  420. {
  421. HINSTANCE hInstance = AfxGetResourceHandle();
  422. ASSERT(hInstance != NULL);
  423. CString strResourceURL;
  424. BOOL bRetVal = TRUE;
  425. LPTSTR lpszModule = new TCHAR[_MAX_PATH];
  426. if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
  427. {
  428. strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
  429. Navigate(strResourceURL, 0, 0, 0);
  430. }
  431. else
  432. bRetVal = FALSE;
  433. delete[] lpszModule;
  434. return bRetVal;
  435. }
  436. void CXTHtmlView::Navigate(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
  437. LPCTSTR lpszTargetFrameName /* = NULL */ ,
  438. LPCTSTR lpszHeaders /* = NULL */, LPVOID lpvPostData /* = NULL */,
  439. DWORD dwPostDataLen /* = 0 */)
  440. {
  441. CString strURL(lpszURL);
  442. BSTR bstrURL = strURL.AllocSysString();
  443. COleSafeArray vPostData;
  444. if (lpvPostData != NULL)
  445. {
  446. if (dwPostDataLen == 0)
  447. dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
  448. vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
  449. }
  450. m_pBrowserApp->Navigate(bstrURL,
  451. COleVariant((long) dwFlags, VT_I4),
  452. COleVariant(lpszTargetFrameName, VT_BSTR),
  453. vPostData,
  454. COleVariant(lpszHeaders, VT_BSTR));
  455. SysFreeString(bstrURL);
  456. }
  457. void CXTHtmlView::Navigate2(LPITEMIDLIST pIDL, DWORD dwFlags, LPCTSTR lpszTargetFrameName)
  458. {
  459. ASSERT(m_pBrowserApp != NULL);
  460. if (!m_pBrowserApp)
  461. return;
  462. #if (_MSC_VER <= 1100) // Using Visual C++ 5.0
  463. COleVariant vPIDL;
  464. AfxVariantInit(&vPIDL);
  465. if (pIDL != NULL)
  466. {
  467. // walk through entries in the list and accumulate their size
  468. UINT cbTotal = 0;
  469. SAFEARRAY *psa = NULL;
  470. LPCITEMIDLIST pidlWalker = pIDL;
  471. while (pidlWalker->mkid.cb)
  472. {
  473. cbTotal += pidlWalker->mkid.cb;
  474. pidlWalker = (LPCITEMIDLIST)
  475. (((LPBYTE)pidlWalker) + pidlWalker->mkid.cb);
  476. }
  477. // add the base structure size
  478. cbTotal += sizeof(ITEMIDLIST);
  479. // get a safe array for them
  480. psa = SafeArrayCreateVector(VT_UI1, 0, cbTotal);
  481. // copy it and set members
  482. if (psa != NULL)
  483. {
  484. memcpy(psa->pvData, (LPBYTE) pIDL, cbTotal);
  485. vPIDL.vt = VT_ARRAY | VT_UI1;
  486. vPIDL.parray = psa;
  487. }
  488. }
  489. #else
  490. COleVariant vPIDL(pIDL);
  491. #endif
  492. COleVariant empty;
  493. m_pBrowserApp->Navigate2(vPIDL,
  494. COleVariant((long) dwFlags, VT_I4),
  495. COleVariant(lpszTargetFrameName, VT_BSTR),
  496. empty, empty);
  497. }
  498. void CXTHtmlView::Navigate2(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
  499. LPCTSTR lpszTargetFrameName /* = NULL */,
  500. LPCTSTR lpszHeaders /* = NULL */,
  501. LPVOID lpvPostData /* = NULL */, DWORD dwPostDataLen /* = 0 */)
  502. {
  503. ASSERT(m_pBrowserApp != NULL);
  504. if (!m_pBrowserApp)
  505. return;
  506. COleSafeArray vPostData;
  507. if (lpvPostData != NULL)
  508. {
  509. if (dwPostDataLen == 0)
  510. dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
  511. vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
  512. }
  513. COleVariant vURL(lpszURL, VT_BSTR);
  514. COleVariant vHeaders(lpszHeaders, VT_BSTR);
  515. COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
  516. COleVariant vFlags((long) dwFlags, VT_I4);
  517. m_pBrowserApp->Navigate2(vURL,
  518. vFlags, vTargetFrameName, vPostData, vHeaders);
  519. }
  520. void CXTHtmlView::Navigate2(LPCTSTR lpszURL, DWORD dwFlags,
  521. CByteArray& baPostData, LPCTSTR lpszTargetFrameName /* = NULL */,
  522. LPCTSTR lpszHeaders /* = NULL */)
  523. {
  524. ASSERT(m_pBrowserApp != NULL);
  525. if (!m_pBrowserApp)
  526. return;
  527. COleVariant vPostData = baPostData;
  528. COleVariant vURL(lpszURL, VT_BSTR);
  529. COleVariant vHeaders(lpszHeaders, VT_BSTR);
  530. COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
  531. COleVariant vFlags((long) dwFlags, VT_I4);
  532. ASSERT(m_pBrowserApp != NULL);
  533. m_pBrowserApp->Navigate2(vURL, vFlags, vTargetFrameName,
  534. vPostData, vHeaders);
  535. }
  536. void CXTHtmlView::PutProperty(LPCTSTR lpszProperty, const VARIANT& vtValue)
  537. {
  538. ASSERT(m_pBrowserApp != NULL);
  539. if (!m_pBrowserApp)
  540. return;
  541. CString strProp(lpszProperty);
  542. BSTR bstrProp = strProp.AllocSysString();
  543. m_pBrowserApp->PutProperty(bstrProp, vtValue);
  544. ::SysFreeString(bstrProp);
  545. }
  546. BOOL CXTHtmlView::GetProperty(LPCTSTR lpszProperty, CString& strValue)
  547. {
  548. ASSERT(m_pBrowserApp != NULL);
  549. if (!m_pBrowserApp)
  550. return FALSE;
  551. CString strProperty(lpszProperty);
  552. BSTR bstrProperty = strProperty.AllocSysString();
  553. BOOL bResult = FALSE;
  554. VARIANT vReturn;
  555. vReturn.vt = VT_BSTR;
  556. vReturn.bstrVal = NULL;
  557. HRESULT hr = m_pBrowserApp->GetProperty(bstrProperty, &vReturn);
  558. if (SUCCEEDED(hr))
  559. {
  560. strValue = CString(vReturn.bstrVal);
  561. bResult = TRUE;
  562. }
  563. ::SysFreeString(bstrProperty);
  564. return bResult;
  565. }
  566. COleVariant CXTHtmlView::GetProperty(LPCTSTR lpszProperty)
  567. {
  568. COleVariant result;
  569. static BYTE parms[] =
  570. VTS_BSTR;
  571. m_wndBrowser.InvokeHelper(0x12f, DISPATCH_METHOD,
  572. VT_VARIANT, (void*)&result, parms, lpszProperty);
  573. return result;
  574. }
  575. CString CXTHtmlView::GetFullName() const
  576. {
  577. ASSERT(m_pBrowserApp != NULL);
  578. if (!m_pBrowserApp)
  579. return _T("");
  580. BSTR bstr;
  581. m_pBrowserApp->get_FullName(&bstr);
  582. CString retVal(bstr);
  583. return retVal;
  584. }
  585. void CXTHtmlView::NavigateComplete2(LPDISPATCH /* pDisp */, VARIANT* URL)
  586. {
  587. ASSERT(V_VT(URL) == VT_BSTR);
  588. CString str(V_BSTR(URL));
  589. OnNavigateComplete2(str);
  590. }
  591. void CXTHtmlView::BeforeNavigate2(LPDISPATCH /* pDisp */, VARIANT* URL,
  592. VARIANT* Flags, VARIANT* TargetFrameName,
  593. VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
  594. {
  595. ASSERT(V_VT(URL) == VT_BSTR);
  596. ASSERT(V_VT(TargetFrameName) == VT_BSTR);
  597. ASSERT(V_VT(PostData) == (VT_VARIANT | VT_BYREF));
  598. ASSERT(V_VT(Headers) == VT_BSTR);
  599. ASSERT(Cancel != NULL);
  600. VARIANT* vtPostedData = V_VARIANTREF(PostData);
  601. CByteArray array;
  602. if (V_VT(vtPostedData) & VT_ARRAY)
  603. {
  604. // must be a vector of bytes
  605. ASSERT(vtPostedData->parray->cDims == 1 && vtPostedData->parray->cbElements == 1);
  606. vtPostedData->vt |= VT_UI1;
  607. COleSafeArray safe(vtPostedData);
  608. DWORD dwSize = safe.GetOneDimSize();
  609. LPVOID pVoid;
  610. safe.AccessData(&pVoid);
  611. array.SetSize(dwSize);
  612. LPBYTE lpByte = array.GetData();
  613. MEMCPY_S(lpByte, pVoid, dwSize);
  614. safe.UnaccessData();
  615. }
  616. // make real parameters out of the notification
  617. CString strTargetFrameName(V_BSTR(TargetFrameName));
  618. CString strURL(V_BSTR(URL));
  619. CString strHeaders(V_BSTR(Headers));
  620. DWORD nFlags = V_I4(Flags);
  621. // notify the user's class
  622. OnBeforeNavigate2(strURL, nFlags, strTargetFrameName,
  623. array, strHeaders, Cancel);
  624. }
  625. void CXTHtmlView::DocumentComplete(LPDISPATCH /*pDisp*/, VARIANT* URL)
  626. {
  627. ASSERT(V_VT(URL) == VT_BSTR);
  628. CString str(V_BSTR(URL));
  629. OnDocumentComplete(str);
  630. }
  631. void CXTHtmlView::NavigateError(LPDISPATCH /*pDisp*/, VARIANT* pvURL,
  632. VARIANT* pvFrame, VARIANT* pvStatusCode, VARIANT_BOOL* pvbCancel)
  633. {
  634. ASSERT(pvURL != NULL);
  635. ASSERT(pvStatusCode != NULL);
  636. ASSERT(pvbCancel != NULL);
  637. if (!pvURL || !pvStatusCode || !pvbCancel)
  638. return;
  639. ASSERT(V_VT(pvURL) == VT_BSTR);
  640. ASSERT(pvFrame == NULL || V_VT(pvFrame) == VT_BSTR);
  641. CString strURL(V_BSTR(pvURL));
  642. CString strFrame(pvFrame ? V_BSTR(pvFrame) : NULL);
  643. DWORD dwError = V_I4(pvStatusCode);
  644. BOOL bCancel = FALSE;
  645. // notify the user's class
  646. OnNavigateError(strURL, strFrame, dwError, &bCancel);
  647. if (pvbCancel)
  648. *pvbCancel = bCancel ? (VARIANT_BOOL)AFX_OLE_TRUE : (VARIANT_BOOL)AFX_OLE_FALSE;
  649. }
  650. void CXTHtmlView::OnProgressChange(long /*lProgress*/, long /*lProgressMax*/)
  651. {
  652. // user will override to handle this notification
  653. }
  654. void CXTHtmlView::OnCommandStateChange(long /*lCommand*/, BOOL /*bEnable*/)
  655. {
  656. // user will override to handle this notification
  657. }
  658. void CXTHtmlView::OnDownloadBegin()
  659. {
  660. // user will override to handle this notification
  661. }
  662. void CXTHtmlView::OnDownloadComplete()
  663. {
  664. // user will override to handle this notification
  665. }
  666. void CXTHtmlView::OnTitleChange(LPCTSTR /*lpszText*/)
  667. {
  668. // user will override to handle this notification
  669. }
  670. void CXTHtmlView::OnPropertyChange(LPCTSTR /*lpszProperty*/)
  671. {
  672. // user will override to handle this notification
  673. }
  674. void CXTHtmlView::OnNewWindow2(LPDISPATCH* /*ppDisp*/, BOOL* bCancel)
  675. {
  676. // default to continuing
  677. *bCancel = FALSE;
  678. // user will override to handle this notification
  679. }
  680. void CXTHtmlView::OnDocumentComplete(LPCTSTR /*lpszURL*/)
  681. {
  682. // user will override to handle this notification
  683. }
  684. void CXTHtmlView::OnQuit()
  685. {
  686. // user will override to handle this notification
  687. }
  688. void CXTHtmlView::OnVisible(BOOL /*bVisible*/)
  689. {
  690. // user will override to handle this notification
  691. }
  692. void CXTHtmlView::OnToolBar(BOOL /*bToolBar*/)
  693. {
  694. // user will override to handle this notification
  695. }
  696. void CXTHtmlView::OnMenuBar(BOOL /*bMenuBar*/)
  697. {
  698. // user will override to handle this notification
  699. }
  700. void CXTHtmlView::OnStatusBar(BOOL /*bStatusBar*/)
  701. {
  702. // user will override to handle this notification
  703. }
  704. void CXTHtmlView::OnFullScreen(BOOL /*bFullScreen*/)
  705. {
  706. // user will override to handle this notification
  707. }
  708. void CXTHtmlView::OnTheaterMode(BOOL /*bTheaterMode*/)
  709. {
  710. // user will override to handle this notification
  711. }
  712. void CXTHtmlView::OnNavigateComplete2(LPCTSTR /*lpszURL*/)
  713. {
  714. // user will override to handle this notification
  715. }
  716. void CXTHtmlView::OnBeforeNavigate2(LPCTSTR /*lpszURL*/, DWORD /*nFlags*/,
  717. LPCTSTR /*lpszTargetFrameName*/, CByteArray& /*baPostData*/,
  718. LPCTSTR /*lpszHeaders*/, BOOL* pbCancel)
  719. {
  720. // default to continuing
  721. if (pbCancel)
  722. {
  723. *pbCancel = FALSE;
  724. }
  725. // user will override to handle this notification
  726. }
  727. void CXTHtmlView::OnStatusTextChange(LPCTSTR pszText)
  728. {
  729. // try to set the status bar text via the frame
  730. CFrameWnd* pFrame = GetParentFrame();
  731. if (pFrame != NULL)
  732. pFrame->SetMessageText(pszText);
  733. }
  734. void CXTHtmlView::OnNavigateError(LPCTSTR /*lpszURL*/, LPCTSTR /*lpszFrame*/, DWORD dwError, BOOL* pbCancel)
  735. {
  736. // default to continuing
  737. *pbCancel = FALSE;
  738. // user will override to handle this notification
  739. dwError;
  740. TRACE1("OnNavigateError called with status scode = 0x%Xn", dwError);
  741. }
  742. BOOL CXTHtmlView::OnEraseBkgnd(CDC* pDC)
  743. {
  744. if (m_bLoading == true)
  745. {
  746. // Get the client rect.
  747. CRect r;
  748. GetClientRect(&r);
  749. CXTPBufferDC memDC(*pDC, r);
  750. memDC.FillSolidRect(r, GetXtremeColor(COLOR_WINDOW));
  751. if (m_bLoadingMessage)
  752. {
  753. int iSavedDC = memDC.SaveDC();
  754. memDC.SelectObject(&XTAuxData().font);
  755. memDC.SetTextColor(GetXtremeColor(COLOR_GRAYTEXT));
  756. memDC.DrawText(m_strLoading, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  757. memDC.RestoreDC(iSavedDC);
  758. }
  759. m_bLoading = false;
  760. }
  761. return TRUE;
  762. }
  763. void CXTHtmlView::OnPaint()
  764. {
  765. // background is already filled in gray
  766. CPaintDC dc(this);
  767. // Get the client rect.
  768. CRect r;
  769. GetClientRect(&r);
  770. // Exclude it from painting, this will eliminate
  771. // screen flicker when view is resized, since we
  772. // actually don't draw the HTML page that is
  773. // displayed.
  774. dc.ExcludeClipRect(&r);
  775. // Paint to a memory device context to help
  776. // eliminate screen flicker.
  777. CXTPBufferDC memDC(dc);
  778. memDC.FillSolidRect(r, GetXtremeColor(COLOR_WINDOW));
  779. // Now let the window do its default painting...
  780. CWnd::DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0);
  781. }