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 + -
显示快捷键?