// 窗口消息处理函数 LRESULT CALLBACK CDuiWkeView::__WebViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CDuiWkeView* pThis = NULL; if( message == WM_NCCREATE ) { // 窗口创建时候保存当前对象指针(创建时候通过参数传入的) LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam); pThis = static_cast<CDuiWkeView*>(lpcs->lpCreateParams); ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LPARAM>(pThis)); }else { // 通过窗口保存的指针获取对象指针 pThis = reinterpret_cast<CDuiWkeView*>(::GetWindowLongPtr(hWnd, GWLP_USERDATA)); if( message == WM_DESTROY && pThis != NULL ) { // 窗口销毁 //LRESULT lRes = ::CallWindowProc(pThis->m_OldWndProc, hWnd, message, wParam, lParam); ::SetWindowLongPtr(hWnd, GWLP_USERDATA, 0L); pThis->ReleaseControl(); return 0;//lRes; } } // 如果获取到对象指针,则调用wke消息处理函数,否则调用默认窗口消息处理函数 if( pThis != NULL ) { return pThis->WebViewWindowProc(hWnd, message, wParam, lParam); }else { return ::DefWindowProc(hWnd, message, wParam, lParam); } }
// 页面标题变更的回调函数 void CDuiWkeView::onTitleChanged(const struct _wkeClientHandler* clientHandler, const wkeString title) { // 查找对应的控件对象 CDuiWkeView* pDuiWkeView = CDuiWkeView::GetWkeViewByClientHandler(clientHandler); if(pDuiWkeView) { pDuiWkeView->SendMessage(MSG_CONTROL_EVENT, (WPARAM)WKE_EVENT_TITLECHANGED, (LPARAM)wkeToStringW(title)); } }
// URL变更的回调函数 void CDuiWkeView::onURLChanged(const struct _wkeClientHandler* clientHandler, const wkeString URL) { // 查找对应的控件对象 CDuiWkeView* pDuiWkeView = CDuiWkeView::GetWkeViewByClientHandler(clientHandler); if(pDuiWkeView) { pDuiWkeView->setURL(wkeToStringW(URL)); pDuiWkeView->SendMessage(MSG_CONTROL_EVENT, (WPARAM)WKE_EVENT_URLCHANGED, (LPARAM)wkeToStringW(URL)); } }
// 根据回调指针获取wke对象指针 CDuiWkeView* CDuiWkeView::GetWkeViewByClientHandler(const wkeClientHandler* pWkeClientHandler) { int count = g_duiWkeViews.GetCount(); for(int i = 0; i < count; i ++) { POSITION pos = g_duiWkeViews.FindIndex(i); CDuiWkeView* pDuiWkeView = (CDuiWkeView*)g_duiWkeViews.GetAt(pos); if(pWkeClientHandler == pDuiWkeView->GetWkeClientHandler()) { return pDuiWkeView; } } return NULL; }
// URL变更的回调函数 void CDuiWkeView::onURLChanged(const struct _wkeClientHandler* clientHandler, const wkeString URL) { // 查找对应的控件对象 CDuiWkeView* pDuiWkeView = CDuiWkeView::GetWkeViewByClientHandler(clientHandler); if(pDuiWkeView) { #ifdef _UNICODE pDuiWkeView->setURL(wkeToStringW(URL)); pDuiWkeView->SendMessage(MSG_CONTROL_EVENT, (WPARAM)WKE_EVENT_URLCHANGED, (LPARAM)wkeToStringW(URL)); #else const wchar_t *pWchar=wkeToStringW(URL); CStringA strA=CEncodingUtil::UnicodeToAnsi(pWchar); pDuiWkeView->setURL(strA); pDuiWkeView->SendMessage(MSG_CONTROL_EVENT, (WPARAM)WKE_EVENT_URLCHANGED, (LPARAM)(LPCTSTR)(strA)); #endif } }