|
|
|
|
#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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|