📄 hhctrl.cpp
字号:
/********************************************************************
filename: d:\spatools\chhctrl\hhctrl.cpp
Copyright (c) 2003 Chao Zuo. All rights reserved.
Email: suncho@vip.sina.com
Notice: If this code works, it was written by Chao Zuo.
Else, I don't know who wrote it.
I Wrote this code for all software developers in civil engineering,
and hope it help you.
Have any question, please email me.
*********************************************************************/
#include "stdafx.h"
#include "hhctrl.h"
#include "CIts.h"
#include "CHHRes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static const char THIS_FILE[] = __FILE__;
#endif
const int TB_PAD = 2; // vertical padding between toolbar and HTML window
IMPLEMENT_DYNAMIC(CHHCtrl, CWnd)
BEGIN_MESSAGE_MAP(CHHCtrl, CWnd)
//{{AFX_MSG_MAP(CHHCtrl)
ON_WM_SIZE()
ON_WM_PAINT()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
END_MESSAGE_MAP()
BEGIN_EVENTSINK_MAP(CHHCtrl, CWnd)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 102, OnStatusTextChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 108, OnProgressChange, VTS_I4 VTS_I4)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 105, OnCommandStateChange, VTS_I4 VTS_BOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 106, OnDownloadBegin, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 104, OnDownloadComplete, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 113, OnTitleChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 252, NavigateComplete2, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 250, BeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 112, OnPropertyChange, VTS_BSTR)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 251, OnNewWindow2, VTS_PDISPATCH VTS_PBOOL)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 259, DocumentComplete, VTS_DISPATCH VTS_PVARIANT)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 253, OnQuit, VTS_NONE)
ON_EVENT(CHHCtrl, AFX_IDW_PANE_FIRST, 254, OnVisible, VTS_BOOL)
END_EVENTSINK_MAP()
CHHCtrl::CHHCtrl() : CWnd()
{
m_pBrowserApp = NULL;
m_paMapIds = NULL;
m_pimg = NULL;
m_pimgHot = NULL;
m_pTB = NULL;
m_mapHome = 0;
m_idLastButton = HH_TB_CLOSE;
}
CHHCtrl::~CHHCtrl()
{
if (m_pBrowserApp != NULL)
m_pBrowserApp->Release();
if (m_paMapIds)
LocalFree((HLOCAL) m_paMapIds);
if (m_pimg)
delete m_pimg;
if (m_pimgHot)
delete m_pimgHot;
if (m_pTB)
delete m_pTB;
if (m_hWnd && IsWindow(m_hWnd))
DestroyWindow();
}
void CHHCtrl::OnFilePrint()
{
if (m_pBrowserApp != NULL) {
LPDISPATCH lpDisp = GetHtmlDocument();
if (lpDisp != NULL) {
// the control will handle all printing UI
LPOLECOMMANDTARGET lpTarget;
if (SUCCEEDED(lpDisp->QueryInterface(IID_IOleCommandTarget,
(LPVOID*) &lpTarget))) {
lpTarget->Exec(NULL, OLECMDID_PRINT, 0, NULL, NULL);
lpTarget->Release();
}
lpDisp->Release();
}
}
}
#ifdef _DEBUG
void CHHCtrl::AssertValid() const
{
CWnd::AssertValid();
}
void CHHCtrl::Dump(CDumpContext& dc) const
{
CWnd::Dump(dc);
}
#endif //_DEBUG
void CHHCtrl::OnDestroy()
{
if (m_pBrowserApp) {
m_pBrowserApp->Release();
m_pBrowserApp = NULL;
}
}
void CHHCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
if (::IsWindow(m_hWnd)) {
// need to push non-client borders out of the client area
CRect rectPos;
GetClientRect(rectPos);
rectPos.left = rectPos.left+10;
rectPos.top= rectPos.top+40;
rectPos.right = rectPos.left + cx -20;
rectPos.bottom = rectPos.top + cy -45;
CWnd::MoveWindow(rectPos);
}
}
void CHHCtrl::OnPaint()
{
Default();
}
#define TB_HEIGHT 50
#define TB_IMAGE_CX 20
bool CHHCtrl::Create(CWnd* pParent, const RECT& rc, DWORD dwBtns, LPCTSTR pszHomeURL, bool fText)
{
AfxEnableControlContainer();
CRect rcClient(rc);
if (IsBadReadPtr(pszHomeURL, sizeof(LPCTSTR)))
m_mapHome = (int) pszHomeURL;
else
m_cszHome = pszHomeURL;
if (dwBtns) {
if (m_pTB) {
delete m_pTB;
delete m_pimg;
delete m_pimgHot;
#ifdef _DEBUG
m_pTB = NULL;
m_pimg = NULL;
m_pimgHot = NULL;
#endif
}
// BUGBUG: Need to calculate height based on system font
rcClient.bottom = rcClient.top + TB_IMAGE_CX + (fText ? 23 : 8);
ASSERT(!m_pTB);
m_pTB = new CToolBarCtrl;
if (!m_pTB->Create(WS_CHILD | WS_VISIBLE |
TBSTYLE_FLAT | TBSTYLE_TOOLTIPS |
CCS_NODIVIDER | CCS_NORESIZE,
rcClient, pParent, 1)) {
TRACE0("Unable to create CToolBarCtrl");
ASSERT(FALSE);
delete m_pTB;
return false;
}
ASSERT(!m_pimg);
ASSERT(!m_pimgHot);
m_pimg = new CImageList;
m_pimgHot = new CImageList;
m_pimg->Create(IDB_CHHCTRL_TBGRAY, TB_IMAGE_CX, 0, RGB(255,0,255));
m_pimgHot->Create(IDB_CHHCTRL_TB, TB_IMAGE_CX, 0, RGB(255,0,255));
m_pTB->SetImageList(m_pimg);
m_pTB->SetHotImageList(m_pimgHot);
TBBUTTON tb[31]; // since we use bit flags, this is as high as you can go
ASSERT((m_idLastButton - HH_TB_HOME) < 31);
// Load the text for our buttons
if (fText) {
// Load the button string and change all pipe characters into null terminators
TCHAR szBuf[512];
if (LoadString(AfxGetInstanceHandle(), IDS_HHCTRL_TBSTRINGS, szBuf, sizeof(szBuf)) == 0) {
TRACE0("Missing IDS_HHCTRL_TBSTRINGS resource string");
ASSERT(FALSE);
return false;
}
TCHAR* psz = szBuf;
while ((psz = StrChr(psz, '|')))
*psz++ = '\0';
m_pTB->AddStrings(szBuf);
}
// Now add the buttons we are going to use
int iBtn = 0;
for (int i = 0; i <= (m_idLastButton - HH_TB_HOME); i++) {
if (dwBtns & (1 << i)) {
// Special-case the Home button which requires a URL or map id
if (i == 0 && !(pszHomeURL || m_mapHome))
continue;
tb[iBtn].fsState = TBSTATE_ENABLED;
tb[iBtn].fsStyle = TBSTYLE_BUTTON;
tb[iBtn].dwData = 0;
if (fText)
tb[iBtn].iString = i;
else
tb[iBtn].iString = 0;
tb[iBtn].iBitmap = i;
tb[iBtn].idCommand = HH_TB_HOME + i;
iBtn++;
}
}
m_pTB->AddButtons(iBtn, tb);
// Add some padding to the top of the window so there is a tiny bit of space
// between the top of the button and the top of the host window.
CRect rcBtn;
m_pTB->GetWindowRect(&rcBtn);
rcClient.top = rc.top + rcBtn.Height() + TB_PAD;
rcClient.bottom = rc.bottom;
}
if (!CreateControl(CLSID_WebBrowser, NULL,
WS_VISIBLE | WS_CHILD, rcClient, pParent, AFX_IDW_PANE_FIRST)) {
TRACE0("Unable to create control");
return false;
}
LPUNKNOWN lpUnk = GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowserApp);
if (FAILED(hr)) {
m_pBrowserApp = NULL;
TRACE0("Unable to create web browser");
return false;
}
return true;
}
bool CHHCtrl::ReplaceControl(CWnd* pDlg, UINT idCtrl, DWORD dwBtns, LPCTSTR pszHomeURL, bool fBtnText)
{
CRect rc;
pDlg->GetDlgItem(idCtrl)->GetWindowRect(&rc);
pDlg->ScreenToClient(&rc);
pDlg->GetDlgItem(idCtrl)->DestroyWindow();
return Create(pDlg, rc, dwBtns, pszHomeURL, fBtnText);
}
CString CHHCtrl::GetType() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_Type(&bstr);
CString retVal(bstr);
return retVal;
}
long CHHCtrl::GetLeft() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Left(&result);
return result;
}
long CHHCtrl::GetTop() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Top(&result);
return result;
}
long CHHCtrl::GetHeight() const
{
ASSERT(m_pBrowserApp != NULL);
long result;
m_pBrowserApp->get_Height(&result);
return result;
}
BOOL CHHCtrl::GetVisible() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Visible(&result);
return result;
}
CString CHHCtrl::GetLocationName() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationName(&bstr);
CString retVal(bstr);
return retVal;
}
CString CHHCtrl::GetLocationURL() const
{
ASSERT(m_pBrowserApp != NULL);
BSTR bstr;
m_pBrowserApp->get_LocationURL(&bstr);
CString retVal(bstr);
return retVal;
}
BOOL CHHCtrl::GetBusy() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Busy(&result);
return result;
}
READYSTATE CHHCtrl::GetReadyState() const
{
ASSERT(m_pBrowserApp != NULL);
READYSTATE result;
m_pBrowserApp->get_ReadyState(&result);
return result;
}
BOOL CHHCtrl::GetOffline() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Offline(&result);
return result;
}
BOOL CHHCtrl::GetSilent() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_Silent(&result);
return result;
}
LPDISPATCH CHHCtrl::GetApplication() const
{
ASSERT(m_pBrowserApp != NULL);
LPDISPATCH result;
m_pBrowserApp->get_Application(&result);
return result;
}
LPDISPATCH CHHCtrl::GetParentBrowser() const
{
ASSERT(m_pBrowserApp != NULL);
LPDISPATCH result;
m_pBrowserApp->get_Parent(&result);
return result;
}
LPDISPATCH CHHCtrl::GetContainer() const
{
ASSERT(m_pBrowserApp != NULL);
LPDISPATCH result;
m_pBrowserApp->get_Container(&result);
return result;
}
LPDISPATCH CHHCtrl::GetHtmlDocument() const
{
ASSERT(m_pBrowserApp != NULL);
LPDISPATCH result;
m_pBrowserApp->get_Document(&result);
return result;
}
BOOL CHHCtrl::GetTopLevelContainer() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_TopLevelContainer(&result);
return result;
}
OLECMDF CHHCtrl::QueryStatusWB(OLECMDID cmdID) const
{
ASSERT(m_pBrowserApp != NULL);
OLECMDF result;
m_pBrowserApp->QueryStatusWB(cmdID, &result);
return result;
}
void CHHCtrl::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt,
VARIANT* pvaIn, VARIANT* pvaOut)
{
ASSERT(m_pBrowserApp != NULL);
m_pBrowserApp->ExecWB(cmdID, cmdexecopt, pvaIn, pvaOut);
}
BOOL CHHCtrl::GetRegisterAsDropTarget() const
{
ASSERT(m_pBrowserApp != NULL);
VARIANT_BOOL result;
m_pBrowserApp->get_RegisterAsDropTarget(&result);
return result;
}
HRESULT CHHCtrl::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);
}
return m_pBrowserApp->Navigate(bstrURL,
COleVariant((long) dwFlags, VT_I4),
COleVariant(lpszTargetFrameName, VT_BSTR),
vPostData,
COleVariant(lpszHeaders, VT_BSTR));
}
void CHHCtrl::Navigate2(LPITEMIDLIST pIDL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */)
{
ASSERT(m_pBrowserApp != NULL);
COleVariant vPIDL(pIDL);
COleVariant empty;
m_pBrowserApp->Navigate2(vPIDL,
COleVariant((long) dwFlags, VT_I4),
COleVariant(lpszTargetFrameName, VT_BSTR),
empty, empty);
}
void CHHCtrl::Navigate2(LPCTSTR lpszURL, DWORD dwFlags /* = 0 */,
LPCTSTR lpszTargetFrameName /* = NULL */,
LPCTSTR lpszHeaders /* = NULL */,
LPVOID lpvPostData /* = NULL */, DWORD dwPostDataLen /* = 0 */)
{
ASSERT(m_pBrowserApp != NULL);
COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if (dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}
COleVariant vURL(lpszURL, VT_BSTR);
COleVariant vHeaders(lpszHeaders, VT_BSTR);
COleVariant vTargetFrameName(lpszTargetFrameName, VT_BSTR);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -