brielwcontrol.cpp

来自「java调用ie浏览器demo源码,可以用在windows或者linux」· C++ 代码 · 共 961 行 · 第 1/3 页

CPP
961
字号
    OLE_HRT( IOleObjectPtr(m_spIWebBrowser2)->DoVerb(
        OLEIVERB_INPLACEACTIVATE, 
        &msg, 
        this, 
        0, 
        m_hwndParent, 
        &m_rcIE2))
    OLE_CATCH
}

void CBrIELWControl::updateTransparentMask(LPRECT prc)
{
}

void CBrIELWControl::PaintScreenShort()
{
    SEP(_T("PaintScreenShort"));
    int iWidth = m_rcIE2.right - m_rcIE2.left;//rc.right - rc.left;
    int iHeight = m_rcIE2.bottom - m_rcIE2.top;//rc.bottom - rc.top;
    if( (iWidth > m_shScreen.m_iWidth) ||  (iHeight > m_shScreen.m_iHeight) ){
        HDC hdc = ::GetDC(m_hwndIE);
        if(hdc){
            OLE_TRY
            m_shScreen.Create(
                hdc, 
                max(iWidth, m_shScreen.m_iWidth),
                max(iHeight, m_shScreen.m_iHeight),
                FALSE);
            OLE_CATCH
            ::ReleaseDC(m_hwndIE, hdc);
        }
    }

    ++m_cSkipDraw;
    OLE_TRY
    //lock the COM server any way!!!
    IViewObjectPtr spViewObject(m_spIWebBrowser2);
    OLE_CHECK_NOTNULLSP(spViewObject)
    if(PAINT_NATIVE == m_ePaintAlgorithm){
//          ::SendMessage(
//              m_hwndShell, 
//              WM_PRINT, 
//              (WPARAM)(HDC)m_shScreen,
//              PRF_CLIENT | PRF_NONCLIENT | PRF_OWNED | PRF_CHILDREN | PRF_ERASEBKGND);
        //PrintWindow(m_hwndIE?m_hwndIE:m_hwndShell, (HDC)m_shScreen, 0);
        PrintWindow(m_hwndShell, (HDC)m_shScreen, 0);
    } else {
        RECTL rcIE = {0, 0, iWidth, iHeight};
        SEP(_T("DrawJava"));
        OLE_HRT( spViewObject->Draw(
            DVASPECT_CONTENT,
            -1, 
            NULL, 
            NULL,
            NULL, 
            m_shScreen, 
            &rcIE, 
            NULL,
            NULL, 
            0
        ));
//         HDC hdc = ::GetDC(m_hwndParent); //TODO: pParent->GetDCFromComponent();
//         if(hdc) {
//             SEP1(_T("DrawNative"));
//             OLE_NEXT_TRY
//             OLE_HRW32_BOOL( ::SetViewportOrgEx(
//                 hdc, 
//                 m_rcIE2.left, 
//                 m_rcIE2.top, 
//                 NULL ))
//             OLE_HRT( spViewObject->Draw(
//                 DVASPECT_CONTENT,
//                 -1, 
//                 NULL, 
//                 NULL,
//                 NULL, 
//                 hdc, 
//                 &rcIE, 
//                 NULL,
//                 NULL, 
//                 0
//             ));
//             OLE_HRW32_BOOL( ::SetViewportOrgEx(
//                 hdc, 
//                 -m_rcIE2.left, 
//                 -m_rcIE2.top, 
//                 NULL ))
//             OLE_CATCH
//             ReleaseDC(m_hwndParent, hdc);
//         }
    }
    OLE_CATCH        
    --m_cSkipDraw;
}

void CBrIELWControl::RemoveHook(HWND hWnd)
{
    if(NULL==m_hwndIE || m_hwndIE!=hWnd){
        STRACE(_T("}hook-alarm! w:%08x"), hWnd);
        return;
    }
    ::SetWindowLongPtr(m_hwndIE, GWLP_WNDPROC, m_pOldIEWndProc);        
    ::RemoveProp(m_hwndIE, ms_lpPN);
    m_pOldIEWndProc = NULL;
    STRACE(_T("}hook ie:%08x"), m_hwndIE);
    m_hwndIE = NULL;
    m_hwndFrame = NULL;
}

void CBrIELWControl::AddHook()
{
    if(NULL!=m_hwndIE)
        RemoveHook(m_hwndIE);

    UpdateWindowRect();
    STRACE0(_T("hwndShell:%08x"), m_hwndShell);
    if(m_hwndShell){
        m_hwndFrame = ::GetWindow(m_hwndShell, GW_CHILD); 
        if(m_hwndFrame){
            m_hwndIE = ::GetWindow(m_hwndFrame, GW_CHILD); 
            if(m_hwndIE){
                WNDPROC pOldIEWndProc = (WNDPROC)::GetWindowLongPtr(m_hwndIE, GWLP_WNDPROC);
                if(NewIEProcStub!=pOldIEWndProc){
                    STRACE(_T("{hook %08x"), m_hwndIE);
                    ::SetProp(m_hwndIE, ms_lpPN, this);
                    m_pOldIEWndProc = ::SetWindowLongPtr(m_hwndIE, GWLP_WNDPROC, (LONG_PTR)NewIEProcStub);
                    SendIEEvent(
                        -3, 
                        _T(""), 
                        _T("")
                    );
                }
            }
        }
    }            
    if(PAINT_NATIVE!=m_ePaintAlgorithm){
        RedrawInParent();
    } 
}

LRESULT CBrIELWControl::NewIEProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    STRACE0(_T("msg:%08x hWnd:%08x"), msg, hWnd);
    if(PAINT_NATIVE!=m_ePaintAlgorithm && (WM_PAINT==msg || WM_NCPAINT==msg || WM_SYNCPAINT==msg) ){
        if( IsSmoothScroll() ){
            STRACE(_T("_SPAINT %08x"), msg);
            LaizyUpdate();
        } else {
            if( 0==m_cSkipDraw){
                RECT rc;            
                if( GetUpdateRect(hWnd, &rc, FALSE) ){
                    RECT clip = rc; 
                    UpdateWindowRect();       

                    STRACE(_T("_PAINT %08x %08x"), msg, hWnd);

                    if(0!=m_tidUpdate){
                        ::KillTimer(m_hwndIE, m_tidUpdate);
                        m_tidUpdate = 0;
                        rc = m_rcIE2;
                    } else {
                        rc.top += m_rcIE2.top;
                        rc.bottom += m_rcIE2.top;                                  
                        rc.left += m_rcIE2.left;
                        rc.right += m_rcIE2.left;
                    }

                    PaintScreenShort();

                    if(rc.top != rc.bottom && rc.left!=rc.right){
                        SEP(_T("Draw"));
                        if(PAINT_JAVA==m_ePaintAlgorithm){
                            ValidateRect(hWnd, &clip);
                        }
                        RedrawParentRect(&rc);
                    } 
                }
            } 
            //seems empty redraw is a signal...
            STRACE(_T("_NPAINT %08x"), msg);
            return ::CallWindowProc((WNDPROC)m_pOldIEWndProc, hWnd, msg, wParam, lParam);      
        } 
        //end paint processing
    } else if(WM_GETDLGCODE == msg){
        return DLGC_WANTALLKEYS 
            | DLGC_WANTARROWS
            | DLGC_HASSETSEL
            | DLGC_WANTCHARS
            | DLGC_WANTTAB;
    } else if(WM_TIMER == msg ){
        if(wParam == m_tidUpdate){
            if( IsSmoothScroll() ){
                LaizyUpdate();
            } else {
                ::KillTimer(m_hwndIE, m_tidUpdate);
                m_tidUpdate = 0;
                InvalidateRect(hWnd, NULL, FALSE);
                UpdateWindow(hWnd);
            }
            return 0;
        }
    } else if(WM_PARENTNOTIFY == msg && WM_CREATE==wParam){
        STRACE(_T("Created Child hWnd:%08x"), hWnd);
    }

    LONG_PTR pHook = NULL;
    if(WM_NCDESTROY==msg){
        RemoveHook(hWnd);
    } else if(
        (msg >= WM_KEYFIRST 
        && msg <= WM_KEYLAST)
    ){
        MSG _msg = { hWnd, msg, wParam, lParam, 0, { 0, 0 } };
        LPMSG lpMsg = &_msg;
        IOleInPlaceActiveObjectPtr spInPlaceActiveObject(m_spIWebBrowser2);
        if(spInPlaceActiveObject){
            OLE_DECL;
            OLE_HR = spInPlaceActiveObject->TranslateAccelerator(lpMsg);
            if(WM_KEYDOWN == msg && VK_TAB==wParam && !IsCtrlKeyDown() && !IsAltKeyDown()){
                STRACE(_T("WM_KEYDOWN tab %08x %08x"), lParam, OLE_HR);
                if(S_FALSE==OLE_HR){
                    SendIEEvent(
                        -2,
                        _T("FocusMove"),
                        IsShiftKeyDown() ? _T("false") : _T("true")
                    );
                }    
            }    
            if(OLE_HR == S_OK){
                return 0;
            }
        }
        pHook = ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, m_pOldIEWndProc);        
    }

    LRESULT res = ::CallWindowProc((WNDPROC)m_pOldIEWndProc, hWnd, msg, wParam, lParam);      
    if(pHook && m_hwndIE==hWnd) //window can be disconnected ;)
        ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, pHook);

    return res;
}

HRESULT CBrIELWControl::SendIEEvent(
    int iId,
    LPTSTR lpName, 
    LPTSTR lpValue,
    _bstr_t &bsResult)
{
    return S_OK;
}

// IDispatch
_bstr_t CreateParamString(DISPPARAMS  *pDispParams)
{
    _bstr_t ret(_T(""));
    for(UINT i = 0; i < pDispParams->cArgs; ++i )
    {
        if(0!=i)
            ret += _T(",");
        OLE_TRY
        ret += _bstr_t( _variant_t(pDispParams->rgvarg[i], true) );
        OLE_CATCH
        if(FAILED(OLE_HR)){
            ret += _T("<unknown>");
        }
    }
    return ret;
}

struct IE_EVENT {
   DISPID   dispid;
   LPCTSTR  lpEventName;
   static int __cdecl compare(const IE_EVENT *p1, const IE_EVENT *p2){
       return p1->dispid - p2->dispid;
   }
   static int sort(IE_EVENT *base, size_t count){
        qsort( 
            (void *)base, 
            count, 
            sizeof(IE_EVENT), 
            (int (*)(const void*, const void*))compare 
        );
        return 0;
   }
   static IE_EVENT *find(DISPID dispid, IE_EVENT *base, size_t count){
        IE_EVENT ev = {dispid, NULL};
        return (IE_EVENT *)bsearch( 
            (void *)&ev, 
            (void *)base, 
            count, 
            sizeof(IE_EVENT), 
            (int (*)(const void*, const void*))compare 
        );
   }
};

IE_EVENT g_aevSupported[] = {
    {DISPID_BEFORENAVIGATE                , _T("beforeNavigate")}, // this is sent before navigation to give a chance to abort
    {DISPID_NAVIGATECOMPLETE              , _T("navigateComplete")}, // in async, this is sent when we have enough to show
    {DISPID_STATUSTEXTCHANGE              , _T("statusTextChange")}, 
    {DISPID_QUIT                          , _T("quit")},
    {DISPID_DOWNLOADCOMPLETE              , _T("downloadComplete")},
    {DISPID_COMMANDSTATECHANGE            , _T("commandStateChange")},
    {DISPID_DOWNLOADBEGIN                 , _T("downloadBegin")},
    {DISPID_NEWWINDOW                     , _T("newWindow")},// sent when a new window should be created
    {DISPID_PROGRESSCHANGE                , _T("progressChange")},// sent when download progress is updated
    {DISPID_WINDOWMOVE                    , _T("windowMove")},// sent when main window has been moved
    {DISPID_WINDOWRESIZE                  , _T("windowResize")},// sent when main window has been sized
    {DISPID_WINDOWACTIVATE                , _T("windowActivate")},// sent when main window has been activated
    {DISPID_PROPERTYCHANGE                , _T("propertyChange")},// sent when the PutProperty method is called
    {DISPID_TITLECHANGE                   , _T("titleChange")},// sent when the document title changes
    {DISPID_TITLEICONCHANGE               , _T("titleIconChange")},// sent when the top level window icon may have changed.
                                          
    {DISPID_FRAMEBEFORENAVIGATE           , _T("frameBeforeNavigate")},  
    {DISPID_FRAMENAVIGATECOMPLETE         , _T("frameNavigateComplete")},
    {DISPID_FRAMENEWWINDOW                , _T("frameNewWindow")},
                                         
    {DISPID_BEFORENAVIGATE2               , _T("beforeNavigate2")},// hyperlink clicked on
    {DISPID_NEWWINDOW2                    , _T("newWindow2")},
    {DISPID_NAVIGATECOMPLETE2             , _T("navigateComplete2")},// UIActivate new document
    {DISPID_ONQUIT                        , _T("onQuit")},

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?