⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hhctrl.cpp

📁 采用Vc++开发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/********************************************************************
	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 + -