用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

297 lines
7.3 KiB

5 months ago
#include "StdAfx.h"
#include "SWkeWebkit.h"
#include <Imm.h>
#pragma comment(lib,"imm32.lib")
#pragma comment(lib,"msimg32.lib")
namespace SOUI
{
//////////////////////////////////////////////////////////////////////////
// SWkeLoader
SWkeLoader * SWkeLoader::s_pInst=0;
SWkeLoader* SWkeLoader::GetInstance()
{
return s_pInst;
}
SWkeLoader::SWkeLoader() :m_hModWke(0)
{
SASSERT(!s_pInst);
s_pInst=this;
}
SWkeLoader::~SWkeLoader()
{
if(m_hModWke) FreeLibrary(m_hModWke);
}
BOOL SWkeLoader::Init( LPCTSTR pszDll )
{
if(m_hModWke) return TRUE;
HMODULE m_hModWke=LoadLibrary(pszDll);
if(!m_hModWke) return FALSE;
m_funWkeInit = (FunWkeInit)GetProcAddress(m_hModWke,"wkeInit");
m_funWkeShutdown = (FunWkeShutdown)GetProcAddress(m_hModWke,"wkeShutdown");
m_funWkeCreateWebView = (FunWkeCreateWebView)GetProcAddress(m_hModWke,"wkeCreateWebView");
m_funWkeDestroyWebView = (FunWkeDestroyWebView)GetProcAddress(m_hModWke,"wkeDestroyWebView");
if(!m_funWkeInit
|| !m_funWkeShutdown
|| !m_funWkeCreateWebView
|| !m_funWkeDestroyWebView )
{
FreeLibrary(m_hModWke);
return FALSE;
}
m_funWkeInit();
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
// SWkeWebkit
SWkeWebkit::SWkeWebkit(void):m_pWebView(NULL)
{
m_bFocusable = true;
}
SWkeWebkit::~SWkeWebkit(void)
{
}
void SWkeWebkit::OnPaint(IRenderTarget *pRT)
{
CRect rcClip;
pRT->GetClipBox(&rcClip);
CRect rcClient;
GetClientRect(&rcClient);
CRect rcInvalid;
rcInvalid.IntersectRect(&rcClip,&rcClient);
HDC hdc=pRT->GetDC();
if(GetAlpha()!=0xff)
{
BLENDFUNCTION bf={AC_SRC_OVER,GetAlpha(),AC_SRC_ALPHA };
AlphaBlend(hdc,rcInvalid.left,rcInvalid.top,rcInvalid.Width(),rcInvalid.Height(),m_pWebView->getViewDC(),rcInvalid.left-rcClient.left,rcInvalid.top-rcClient.top,rcInvalid.Width(),rcInvalid.Height(),bf);
}else
{
BitBlt(hdc,rcInvalid.left,rcInvalid.top,rcInvalid.Width(),rcInvalid.Height(),m_pWebView->getViewDC(),rcInvalid.left-rcClient.left,rcInvalid.top-rcClient.top,SRCCOPY);
}
pRT->ReleaseDC(hdc);
}
void SWkeWebkit::OnSize( UINT nType, CSize size )
{
__super::OnSize(nType,size);
m_pWebView->resize(size.cx,size.cy);
m_pWebView->tick();
}
int SWkeWebkit::OnCreate( void * )
{
m_pWebView = SWkeLoader::GetInstance()->m_funWkeCreateWebView();
if(!m_pWebView) return 1;
m_pWebView->setBufHandler(this);
m_pWebView->loadURL(m_strUrl);
SetTimer(TM_TICKER,50); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>timer<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>idle<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>timer<EFBFBD><EFBFBD>onidleһ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
void SWkeWebkit::OnDestroy()
{
if(m_pWebView) SWkeLoader::GetInstance()->m_funWkeDestroyWebView(m_pWebView);
}
LRESULT SWkeWebkit::OnMouseEvent( UINT message, WPARAM wParam,LPARAM lParam)
{
if (message == WM_LBUTTONDOWN || message == WM_MBUTTONDOWN || message == WM_RBUTTONDOWN)
{
SetFocus();
SetCapture();
}
else if (message == WM_LBUTTONUP || message == WM_MBUTTONUP || message == WM_RBUTTONUP)
{
ReleaseCapture();
}
CRect rcClient;
GetClientRect(&rcClient);
int x = GET_X_LPARAM(lParam)-rcClient.left;
int y = GET_Y_LPARAM(lParam)-rcClient.top;
unsigned int flags = 0;
if (wParam & MK_CONTROL)
flags |= WKE_CONTROL;
if (wParam & MK_SHIFT)
flags |= WKE_SHIFT;
if (wParam & MK_LBUTTON)
flags |= WKE_LBUTTON;
if (wParam & MK_MBUTTON)
flags |= WKE_MBUTTON;
if (wParam & MK_RBUTTON)
flags |= WKE_RBUTTON;
bool bHandled = m_pWebView->mouseEvent(message, x, y, flags);
SetMsgHandled(bHandled);
return 0;
}
LRESULT SWkeWebkit::OnKeyDown( UINT uMsg, WPARAM wParam,LPARAM lParam )
{
unsigned int flags = 0;
if (HIWORD(lParam) & KF_REPEAT)
flags |= WKE_REPEAT;
if (HIWORD(lParam) & KF_EXTENDED)
flags |= WKE_EXTENDED;
SetMsgHandled(m_pWebView->keyDown(wParam, flags, false));
return 0;
}
LRESULT SWkeWebkit::OnKeyUp( UINT uMsg, WPARAM wParam,LPARAM lParam )
{
unsigned int flags = 0;
if (HIWORD(lParam) & KF_REPEAT)
flags |= WKE_REPEAT;
if (HIWORD(lParam) & KF_EXTENDED)
flags |= WKE_EXTENDED;
SetMsgHandled(m_pWebView->keyUp(wParam, flags, false));
return 0;
}
LRESULT SWkeWebkit::OnMouseWheel( UINT uMsg, WPARAM wParam,LPARAM lParam )
{
POINT pt;
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
CRect rc;
GetWindowRect(&rc);
pt.x -= rc.left;
pt.y -= rc.top;
int delta = GET_WHEEL_DELTA_WPARAM(wParam);
unsigned int flags = 0;
if (wParam & MK_CONTROL)
flags |= WKE_CONTROL;
if (wParam & MK_SHIFT)
flags |= WKE_SHIFT;
if (wParam & MK_LBUTTON)
flags |= WKE_LBUTTON;
if (wParam & MK_MBUTTON)
flags |= WKE_MBUTTON;
if (wParam & MK_RBUTTON)
flags |= WKE_RBUTTON;
//flags = wParam;
BOOL handled = m_pWebView->mouseWheel(pt.x, pt.y, delta, flags);
SetMsgHandled(handled);
return handled;
}
LRESULT SWkeWebkit::OnChar( UINT uMsg, WPARAM wParam,LPARAM lParam )
{
unsigned int charCode = wParam;
unsigned int flags = 0;
if (HIWORD(lParam) & KF_REPEAT)
flags |= WKE_REPEAT;
if (HIWORD(lParam) & KF_EXTENDED)
flags |= WKE_EXTENDED;
//flags = HIWORD(lParam);
SetMsgHandled(m_pWebView->keyPress(charCode, flags, false));
return 0;
}
LRESULT SWkeWebkit::OnImeStartComposition( UINT uMsg, WPARAM wParam,LPARAM lParam )
{
wkeRect caret = m_pWebView->getCaret();
CRect rcClient;
GetClientRect(&rcClient);
CANDIDATEFORM form;
form.dwIndex = 0;
form.dwStyle = CFS_EXCLUDE;
form.ptCurrentPos.x = caret.x + rcClient.left;
form.ptCurrentPos.y = caret.y + caret.h + rcClient.top;
form.rcArea.top = caret.y + rcClient.top;
form.rcArea.bottom = caret.y + caret.h + rcClient.top;
form.rcArea.left = caret.x + rcClient.left;
form.rcArea.right = caret.x + caret.w + rcClient.left;
COMPOSITIONFORM compForm;
compForm.ptCurrentPos=form.ptCurrentPos;
compForm.rcArea=form.rcArea;
compForm.dwStyle=CFS_POINT;
HWND hWnd=GetContainer()->GetHostHwnd();
HIMC hIMC = ImmGetContext(hWnd);
ImmSetCandidateWindow(hIMC, &form);
ImmSetCompositionWindow(hIMC,&compForm);
ImmReleaseContext(hWnd, hIMC);
return 0;
}
void SWkeWebkit::OnSetFocus(SWND wndOld)
{
__super::OnSetCursor(wndOld);
m_pWebView->focus();
}
void SWkeWebkit::OnKillFocus(SWND wndFocus)
{
m_pWebView->unfocus();
__super::OnKillFocus(wndFocus);
}
void SWkeWebkit::OnTimer( char cTimerID )
{
if(cTimerID==TM_TICKER)
{
m_pWebView->tick();
}
}
void SWkeWebkit::onBufUpdated( const HDC hdc,int x, int y, int cx, int cy )
{
CRect rcClient;
GetClientRect(&rcClient);
CRect rcInvalid(CPoint(x,y),CSize(cx,cy));
rcInvalid.OffsetRect(rcClient.TopLeft());
InvalidateRect(rcInvalid);
}
BOOL SWkeWebkit::OnIdle()
{
m_pWebView->tick();
return TRUE;
}
BOOL SWkeWebkit::OnSetCursor( const CPoint &pt )
{
return TRUE;
}
BOOL SWkeWebkit::OnAttrUrl( SStringW strValue, BOOL bLoading )
{
m_strUrl=strValue;
if(!bLoading) m_pWebView->loadURL(m_strUrl);
return !bLoading;
}
}