一 引言
CEF3嵌入后,用JS 彈出Alert框,按鈕錯位,確定按鈕勉強能看到。很難看。為了改善體驗,決定重寫提示框。
環境:VS2008 VC MFC.
二 原理
參看類 CefJSDialogHandler 的說明。
相關類:CefClient CefJSDialogHandler ClientHandler
三 准備
使用 cef_binary_3.1453.1255_windows.7z (http://www.magpcss.net/cef_downloads/) 在VS2008 環境建立 MFC 應用程序,調試通過。將加載主頁換成自己的測試頁面。
本文主要是描述重寫JSDialog,其他內容不做敘述。
四 步驟
1 繼承,為 ClientHandler 添加一個父類 CefJSDialogHandler class ClientHandler : public CefJSDialogHandler 2 聲明,在 ClientHandler 聲明以下方法: public: //CefJSDialogHandler virtual bool OnJSDialog(CefRefPtr browser, const CefString& origin_url, const CefString& accept_lang, JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) OVERRIDE; // CefClient methods // Return the handler for JavaScript dialogs. If no handler is provided the // default implementation will be used. virtual CefRefPtr GetJSDialogHandler() { return this; } 3 實現: 在client_handler_win.cpp 添加以下方法: //tony.guo,重寫js alert 框 bool ClientHandler::OnJSDialog(CefRefPtr browser, const CefString& origin_url, const CefString& accept_lang, JSDialogType dialog_type, const CefString& message_text, const CefString& default_prompt_text, CefRefPtr callback, bool& suppress_message) { if(dialog_type == JSDIALOGTYPE_ALERT)//普通提示框 詢問框 { string strTemp = message_text.ToString(); CString strMsg = _T(""); ConvertUtf8ToGBK(strTemp,strMsg); CCommonDlg dlg; dlg.setShowText(strMsg); dlg.setShowIcon(1); dlg.setButtonContent(_T(""),_T("確 定")); dlg.setShowTip(_T("提示")); dlg.DoModal(); suppress_message = true; return false; } else if(dialog_type == JSDIALOGTYPE_CONFIRM)//詢問框 { string strTemp = message_text.ToString(); CString strMsg = _T(""); ConvertUtf8ToGBK(strTemp,strMsg); CCommonDlg dlg; dlg.setShowText(strMsg); dlg.setShowIcon(3); dlg.setButtonContent(_T("確 定"),_T("取 消")); dlg.setShowTip(_T("詢問")); dlg.DoModal(); if(1 == dlg.m_nReturnValue) { callback->Continue(true,""); suppress_message = false; return true; } else { callback->Continue(false,""); suppress_message = false; return true; } } else if(dialog_type == JSDIALOGTYPE_PROMPT)//輸入框,不支持 { CCommonDlg dlg; dlg.setShowText(_T("系統不支持prompt形式的提示框")); dlg.setShowIcon(1); dlg.setButtonContent(_T(""),_T("確 定")); dlg.setShowTip(_T("提示")); dlg.DoModal(); suppress_message = true; return false; } return false; } 4 說明:CCommonDlg 是筆者寫的一個提示框,讀者也可以用MessageBox代替。ConvertUtf8ToGBK 只是一個字符串處理方法,如下: void ConvertUtf8ToGBK(string strUtf8,CString &strRet) { int len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8.c_str(), -1, NULL,0); TCHAR * wszGBK = new TCHAR[len+10]; ZeroMemory(wszGBK,len+10); MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8.c_str(), -1, wszGBK, len); strRet.Format(_T("%s"),wszGBK); delete []wszGBK; return; } 5 參數解釋 suppress_message參數: 如果這個參數被設置為true,並且函數返回值為false,將阻止頁面打開JS的彈出窗口。 如果這個參數被設置為false,並且函數返回值也是false,頁面將會打開這個JS彈出窗口。 message_text參數: 是彈出窗口將要顯示的內容 dialogType參數: 是彈出窗口的類型(alert,confirm,Prompt) callback參數: 當用戶點擊了彈出窗口的確定按鈕,可以用callback.Continue(true, string.Empty);回調確定函數 當用戶點擊了彈出窗口的取消按鈕,可以用callback.Continue(false, string.Empty);回調取消函數 五 測試 在測試頁面實現如下代碼: function AlertTest() { //alert('彈框測試'); if(confirm('您同意嗎?')) { alert('同意'); } }