DHTMLDLG 界面制作

来源:互联网 发布:网络教育2018招生时间 编辑:程序博客网 时间:2024/06/06 03:46
  DHTMLDLG 界面制作
dlg为dialog


与普通对话框的区别
1.类的继承关系
class CSingleDlg : public CDHtmlDialog 


2.资源枚举
 enum {
        IDD = IDD_DLG_Single, IDH = IDR_HTML_SINGLE};
3.构造函数
CSingleDlg::CSingleDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(IDD_DLG_Single, IDR_HTML_SINGLE, pParent)
{
    EnableAutomation();//此句不能少,少了dlg上的按件会无响应
}


4.rc资源
IDR_HTML_TESTHTMLDIALOG_DIALOG HTML "TestHtmlDialog.htm"


5-6做dlg与html交互用
5.event 动作
DECLARE_DHTML_EVENT_MAP()  
//此间定义函数用于html发消息给,dlg,而dlg处理后不需返回


6.
DECLARE_DISPATCH_MAP 
//此间定义函数,用于html发消息给,dlg,而dlg处理后再发消息给html.




对于对话框的处理:
1.去掉border 设置border 值为none
2.窗口移动:(因为窗口移动与combo-box消息冲突的问题,搞到晚上11点,主要是没找到问题根源)
  两种方式添加消息函数
  第一种:以代码的方式
  1)在BEGIN_MESSAGE_MAP(CSingleDlg, CDHtmlDialog)中添加
  ON_WM_MOUSEACTIVATE()
  2)在头文件中添加
  afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
  3)  在cpp文件中实现 
  int CSingleDlg::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    PostMessage(WM_SYSCOMMAND, 0xF012, 0);//此种方法切实可行
    return CDHtmlDialog::OnMouseActivate(pDesktopWnd, nHitTest, message);
}


第二种:利用mfc方式(添加类向导)
   1)右击dlg,选择添加类向导
   2)点消息,搜索MouseActivate
   3)确定,然后在.cpp中实现。


//与标准mfc无任何差别。。。。






3.dlg禁用消息
.h文件
// 屏蔽掉网页弹出的ActiveX安全警告对话框。
    virtual BOOL IsExternalDispatchSafe() { return TRUE; }
    virtual BOOL CanAccessExternal();
    // 屏蔽右击菜单
    virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);
    // 拦截一些系统快捷键
    STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);


.cpp文件(实现 )
// CDhtmDlg 消息处理程序
BOOL CSingleDlg::CanAccessExternal()
{
    return TRUE;
}


HRESULT STDMETHODCALLTYPE CSingleDlg::ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{
    return S_OK;
}


HRESULT STDMETHODCALLTYPE CSingleDlg::TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
{
    if (lpMsg && lpMsg->message == WM_KEYDOWN)
    {
        bool bCtrl = (0x80 == (0x80 & GetKeyState(VK_CONTROL)));
        // prevent Ctrl+N
        if (lpMsg->wParam == 'N' && bCtrl)
        {
            return S_OK;
        }
        // prevent Ctrl+F
        if (lpMsg->wParam == 'F' && bCtrl)
        {
            return S_OK;
        }
        // prevent F5
        if (lpMsg->wParam == VK_F5)
        {
            return S_OK;
        }
        // prevent ESC
        if (lpMsg->wParam == VK_ESCAPE)
        {
            return S_OK;
        }
        // prevent ENTER
        if (lpMsg->wParam == VK_RETURN)
        {
            return S_OK;
        }
    }
    return CDHtmlDialog::TranslateAccelerator(lpMsg, pguidCmdGroup, nCmdID);
}


4.禁用ctrl+鼠标滚动(dlg上的网页界面大小变化)
 .h 中
virtual BOOL PreTranslateMessage(MSG* pMsg);


.cpp中
BOOL CSingleDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 在此添加专用代码和/或调用基类


    if (LOWORD(pMsg->wParam) == MK_CONTROL && pMsg->message == WM_MOUSEWHEEL)
    {
        return true;
    }
    return CDHtmlDialog::PreTranslateMessage(pMsg);
}






对话框与HTML消息交互:
1.
BEGIN_DISPATCH_MAP(CSingleDlg, CDHtmlDialog)    
    DISP_FUNCTION(CSingleDlg, "starts", OnButtonRun, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()


//这里以启动按键为例
void CSingleDlg::OnButtonRun()
{
    IHTMLDocument2* pDoc = NULL;
    CDHtmlDialog::GetDHtmlDocument(&pDoc);


    DISPPARAMS param = { 0 };
    VARIANT vtRet;


    OnBnClickedBtnRun2();


    if (m_dRunFlg == 1)
    {
        vtRet.bVal = TRUE;
        CBcTools::CallJSFunction(pDoc, _T("OnButtonRun"), param, &vtRet, NULL, NULL);//OnButtonRun 为javascript里的函数,界面上的一些动作放在此函数中。
    }
}




HRESULT CBcTools::CallJSFunction(IHTMLDocument2* pDoc2,
    CString strFunctionName,
    DISPPARAMS dispParams,
    VARIANT* varResult,
    EXCEPINFO* exceptInfo,
    UINT* nArgErr)
{
    IDispatch *pDispScript = NULL;
    HRESULT hResult;
    hResult = pDoc2->get_Script(&pDispScript);
    if (FAILED(hResult))
    {
        return S_FALSE;
    }


    DISPID   dispid;
    CComBSTR objbstrValue = strFunctionName;
    BSTR bstrValue = objbstrValue.Copy();
    OLECHAR *pszFunct = bstrValue;
    hResult = pDispScript->GetIDsOfNames(IID_NULL,
        &pszFunct,
        1,
        LOCALE_SYSTEM_DEFAULT,
        &dispid);
    if (FAILED(hResult))
    {
        pDispScript->Release();
        return hResult;
    }


    varResult->vt = VT_VARIANT;
    hResult = pDispScript->Invoke(dispid,
        IID_NULL, LOCALE_USER_DEFAULT,
        DISPATCH_METHOD,
        &dispParams,
        varResult,
        exceptInfo,
        nArgErr);
    pDispScript->Release();


    return hResult;
}




对话框上各控件的文字处理,背景处理 此方面的事情与普通dialog一致,这里不再说明。



原创粉丝点击