在对话框中使用网页输入数据

类别:VC语言 点击:0 评论:0 推荐:

此对话框使用了IE5附带的DHTMLEdit控件。.

 

头文件

//{{AFX_INCLUDES()
#include "dhtmledit\dhtmledit.h"
//}}AFX_INCLUDES
#if !defined(AFX_PARAMDLG_H__0655C0B1_BEAD_4F17_AAAC_506C1D07D073__INCLUDED_)
#define AFX_PARAMDLG_H__0655C0B1_BEAD_4F17_AAAC_506C1D07D073__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ParamDlg.h : header file
//
class   CHtmlparam:public   CObject{
public:
    CString m_strAlt;
    COleVariant m_varVal;
};
#define HTML_TAG_INPUT  _T("INPUT")
#define HTML_TAG_SELECT _T("SELECT")
#define HTML_ATTRIB_NAME    _T("NAME")
#define HTML_ATTRIB_VALUE   _T("VALUE")
#define HTML_ATTRIB_CHECKED _T("checked")
#define HTML_ATTRIB_TYPE    _T("TYPE")
#define HTML_ATTRIB_ALT _T("ALT")
#define HTML_TYPE_CHECKBOX  _T("checkbox")
/////////////////////////////////////////////////////////////////////////////
// CParamDlg dialog
CString HTMLElement_GetValueAttributeName(CHTMLElement* pel);
CString HTMLElement_GetToolTipAttributeName(CHTMLElement*   pel);
CString HTMLElement_GetIDOrName(CHTMLElement*   pel);
BOOL    HTMLElement_IsInputElement(CHTMLElement*    pel);
BOOL    HTMLElement_IsInputCheckBoxElement(CHTMLElement*    pel);

class CParamDlg : public CDialog
{
// Construction
public:
    CParamDlg(CWnd* pParent = NULL);   // standard constructor
    ~CParamDlg();
// Dialog Data
    //{{AFX_DATA(CParamDlg)
    enum { IDD = IDD_PARAM_DLG };
    CDHTMLEdit  m_wndDhtmlEdit;
    //}}AFX_DATA
    CString m_strFilePath;
    CString m_strFileURL;
    COleVariant GetValue(CString    strName);
    void    GetValue(CString    strName,int& iVal);
    void    GetValue(CString    strName,long& lVal);
    void    GetValue(CString    strName,CString& strVal);
    void        SetValue(CString    strName,
        COleVariant varVal,
        LPCTSTR lpszAlt=NULL);//displayed as tooltip
    void        SetValue(CString    strName,
        int iVal,
        LPCTSTR lpszAlt=NULL);//displayed as tooltip
    void        SetValueBool(CString    strName,
        BOOL    bVal,
        LPCTSTR lpszAlt=NULL);//displayed as tooltip

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CParamDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL
// Implementation
protected:
    CMapStringToOb  m_mapNameToParam;
    BOOL    LoadValues();
    BOOL    SaveValues();
    // Generated message map functions
    //{{AFX_MSG(CParamDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnDocumentCompleteDhtmledit1();
    virtual void OnOK();
    DECLARE_EVENTSINK_MAP()
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined (AFX_PARAMDLG_H__0655C0B1_BEAD_4F17_AAAC_506C1D07D073__INCLUDED_)


 

实现文件

// ParamDlg.cpp : implementation file
//

#include "stdafx.h"
#include <atlbase.h>
#include <mshtml.h>
#include <mshtmdid.h>
#include "dhtmledit\htmlelementcollection.h"
#include "dhtmledit\htmldocument2.h"
#include "dhtmledit\htmlelement.h"
#include "WorkBench.h"
#include "ParamDlg.h"
#include "global.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CParamDlg dialog


CParamDlg::CParamDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CParamDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CParamDlg)
    //}}AFX_DATA_INIT
    m_strFileURL.Empty();
    m_strFilePath.Empty();
    m_mapNameToParam.RemoveAll();
}
CParamDlg::~CParamDlg()
{
    POSITION    pos=m_mapNameToParam.GetStartPosition();
    CString strKey;
    CObject*    pOb;
    while(pos){
        m_mapNameToParam.GetNextAssoc(pos,strKey,pOb);
        delete  pOb;
    }
}

void CParamDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CParamDlg)
    DDX_Control(pDX, IDC_DHTMLEDIT1, m_wndDhtmlEdit);
    //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CParamDlg, CDialog)
    //{{AFX_MSG_MAP(CParamDlg)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CParamDlg message handlers

BOOL CParamDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
   
    // TODO: Add extra initialization here
    COleVariant varFile,varPrompt;
    varPrompt.vt=VT_BOOL;
    varPrompt.boolVal=FALSE;
    if(!m_strFileURL.IsEmpty())
        varFile=m_strFileURL;
    else
        varFile=m_strFilePath;
    TRY{
        m_wndDhtmlEdit.LoadDocument(&varFile,&varPrompt);
    }
    CATCH(COleDispatchException,pEx)
    {
        CGlobal::ProcessOleDispatchException(pEx);
        return  FALSE;
    }
    AND_CATCH(CException,pEx)
    {
        CGlobal::ProcessException(pEx);
        return  FALSE;
    }
    END_CATCH
    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

BEGIN_EVENTSINK_MAP(CParamDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CParamDlg)
    ON_EVENT(CParamDlg, IDC_DHTMLEDIT1, 1 /* DocumentComplete */, OnDocumentCompleteDhtmledit1, VTS_NONE)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CParamDlg::OnDocumentCompleteDhtmledit1()
{
    GetDlgItem(IDOK)->EnableWindow(TRUE);
    //read value from data
    LoadValues();
}

void CParamDlg::OnOK()
{
    // TODO: Add extra validation here
    if(!SaveValues())return;   
    CDialog::OnOK();
}

BOOL    CParamDlg::LoadValues()
{
    TRY{
        CHTMLElementCollection  ecAll=m_wndDhtmlEdit.GetDom().GetAll();
        long    lecLength=ecAll.GetLength();
        COleVariant varIndex,varTemp;//var2 is not used because accessing index,not name
        varIndex.vt=VT_I4;
        CString strElementID,strTemp;
        CHtmlparam* pHtmlparam;
        CObject*    pOb;
        for(int i=0;i<lecLength;i++){
            varIndex.lVal=i;
            CHTMLElement    el(ecAll.item(varIndex,varTemp));
            strTemp=HTMLElement_GetValueAttributeName(&el);
            if(!strTemp.IsEmpty()){//can have values
                strElementID=HTMLElement_GetIDOrName(&el);
                if(m_mapNameToParam.Lookup(strElementID,pOb)){//found
                    pHtmlparam=(CHtmlparam*)pOb;
                    el.setAttribute(strTemp,pHtmlparam->m_varVal,0);
                }
            }
            strTemp=HTMLElement_GetToolTipAttributeName(&el);
            if(!strTemp.IsEmpty()){//can have ToolTip
                varTemp=pHtmlparam->m_strAlt;
                el.setAttribute(strTemp,varTemp,0);
            }

        }
    }
    CATCH(CException,pEx)
    {
        CGlobal::ProcessException(pEx);
        return  FALSE;
    }
    END_CATCH
    return  TRUE;
}

BOOL    CParamDlg::SaveValues()
{
    TRY{
        CHTMLElementCollection  ecAll=m_wndDhtmlEdit.GetDom().GetAll();
        long    lecLength=ecAll.GetLength();
        COleVariant varIndex,varTemp;//var2 is not used because accessing index,not name
        varIndex.vt=VT_I4;
        CString strElementID,strTemp;
        CHtmlparam* pHtmlparam;
        CObject*    pOb;
        for(int i=0;i<lecLength;i++){
            varIndex.lVal=i;
            CHTMLElement    el(ecAll.item(varIndex,varTemp));
            varIndex.lVal=i;
            strTemp=HTMLElement_GetValueAttributeName(&el);
            if(!strTemp.IsEmpty()){//can have values
                strElementID=HTMLElement_GetIDOrName(&el);
                if(m_mapNameToParam.Lookup(strElementID,pOb)){//found
                    pHtmlparam=(CHtmlparam*)pOb;
                    varTemp=el.getAttribute(strTemp,0);
                }
                TRY{
                    pHtmlparam->m_varVal.ChangeType(pHtmlparam->m_varVal.vt,&varTemp);
                }
                CATCH(CException,pEx)
                {
                    CGlobal::ProcessException(pEx);
                    el.InvokeHelper(DISPID_IHTMLELEMENT2_FOCUS,DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
                    return  FALSE;
                }
                END_CATCH
            }
        }
    }
    CATCH(CException,pEx)
    {
        CGlobal::ProcessException(pEx);
        return  FALSE;
    }
    END_CATCH
    return  TRUE;
}
COleVariant CParamDlg::GetValue(CString strName)
{
    COleVariant varRet;
    CHtmlparam* pHtmlparam;
    CObject*    pOb;
    if(m_mapNameToParam.Lookup(strName,pOb)){//found
        pHtmlparam=(CHtmlparam*)pOb;
        varRet=pHtmlparam->m_varVal;
    }
    return  varRet;
}
void    CParamDlg::GetValue(CString strName,int& iVal)
{
    COleVariant var=GetValue(strName);
    var.ChangeType(VT_I4);
    iVal=var.iVal;
}
void    CParamDlg::GetValue(CString strName,long& lVal)
{
    COleVariant var=GetValue(strName);
    var.ChangeType(VT_I4);
    lVal=var.lVal;
}

void    CParamDlg::GetValue(CString strName,CString& strVal)
{
    COleVariant var=GetValue(strName);
    var.ChangeType(VT_BSTR);
    strVal=var.bstrVal;
}


void        CParamDlg::SetValue(CString strName,
    COleVariant varVal,
    LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
    COleVariant varRet;
    CHtmlparam* pHtmlparam;
    CObject*    pOb;
    if(m_mapNameToParam.Lookup(strName,pOb)){//found
        pHtmlparam=(CHtmlparam*)pOb;
    }
    else{
        pHtmlparam=new  CHtmlparam;
        m_mapNameToParam.SetAt(strName,pHtmlparam);
    }
    pHtmlparam->m_varVal=varVal;
    if(lpszAlt)
        pHtmlparam->m_strAlt=lpszAlt;
}
void        CParamDlg::SetValue(CString strName,
        int iVal,
        LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
    COleVariant var;
    var.vt=VT_I4;
    var.iVal=iVal;
    SetValue(strName,var,lpszAlt);
}
void        CParamDlg::SetValueBool(CString strName,
        BOOL    bVal,
        LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
    SetValue(strName,COleVariant((long)bVal,VT_BOOL),lpszAlt);
}
CString     HTMLElement_GetValueAttributeName(CHTMLElement* pel)
{
    CString strValAttribName;
    CString strTagName=pel->GetTagName();
    if(!strTagName.CompareNoCase(HTML_TAG_INPUT)||!strTagName.CompareNoCase(HTML_TAG_SELECT)){
        strValAttribName=HTML_ATTRIB_VALUE;
    }
    if(HTMLElement_IsInputCheckBoxElement(pel))
        strValAttribName=HTML_ATTRIB_CHECKED;
    //to be continued
    return  strValAttribName;
}

CString     HTMLElement_GetToolTipAttributeName(CHTMLElement*   pel)
{
    CString strTipAttribName;
    CString strTagName=pel->GetTagName();
    if(!strTagName.CompareNoCase(HTML_TAG_INPUT))
        strTipAttribName=HTML_ATTRIB_ALT;
    //to be continued
    return  strTipAttribName;
}
CString HTMLElement_GetIDOrName(CHTMLElement*   pel)
{
    COleVariant varTemp;
    CString strElementID=pel->GetId();
    if(strElementID.IsEmpty()){
        varTemp=pel->getAttribute(HTML_ATTRIB_NAME,0);
        varTemp.ChangeType(VT_BSTR);
        strElementID=varTemp.bstrVal;
    }
    return  strElementID;
}
BOOL    HTMLElement_IsInputElement(CHTMLElement*    pel)
{
    CString strTagName=pel->GetTagName();
    return  (!strTagName.CompareNoCase(HTML_TAG_INPUT));
}
BOOL    HTMLElement_IsInputCheckBoxElement(CHTMLElement*    pel)
{
    BOOL    bRet=FALSE;
    if(HTMLElement_IsInputElement(pel)){
        COleVariant varTemp=pel->getAttribute(HTML_ATTRIB_TYPE,0);
        varTemp.ChangeType(VT_BSTR);
        CString strTemp=varTemp.bstrVal;
        if(!strTemp.CompareNoCase(HTML_TYPE_CHECKBOX))
            bRet=TRUE;
    }
    return  bRet;
}

* pHtmlparam;
  CObject* pOb;
  for(int i=0;i<lecLength;i++){
   varIndex.lVal=i;
   CHTMLElement el(ecAll.item(varIndex,varTemp));
   strTemp=HTMLElement_GetValueAttributeName(&el);
   if(!strTemp.IsEmpty()){//can have values
    strElementID=HTMLElement_GetIDOrName(&el);
    if(m_mapNameToParam.Lookup(strElementID,pOb)){//found
     pHtmlparam=(CHtmlparam*)pOb;
     el.setAttribute(strTemp,pHtmlparam->m_varVal,0);
    }
   }
   strTemp=HTMLElement_GetToolTipAttributeName(&el);
   if(!strTemp.IsEmpty()){//can have ToolTip
    varTemp=pHtmlparam->m_strAlt;
    el.setAttribute(strTemp,varTemp,0);
   }

  }
 }
 CATCH(CException,pEx)
 {
  CGlobal::ProcessException(pEx);
  return FALSE;
 }
 END_CATCH
 return TRUE;
}

BOOL CParamDlg::SaveValues()
{
 TRY{
  CHTMLElementCollection ecAll=m_wndDhtmlEdit.GetDom().GetAll();
  long    lecLength=ecAll.GetLength();
  COleVariant varIndex,varTemp;//var2 is not used because accessing index,not name
  varIndex.vt=VT_I4;
  CString strElementID,strTemp;
  CHtmlparam* pHtmlparam;
  CObject* pOb;
  for(int i=0;i<lecLength;i++){
   varIndex.lVal=i;
   CHTMLElement el(ecAll.item(varIndex,varTemp));
   varIndex.lVal=i;
   strTemp=HTMLElement_GetValueAttributeName(&el);
   if(!strTemp.IsEmpty()){//can have values
    strElementID=HTMLElement_GetIDOrName(&el);
    if(m_mapNameToParam.Lookup(strElementID,pOb)){//found
     pHtmlparam=(CHtmlparam*)pOb;
     varTemp=el.getAttribute(strTemp,0);
    }
    TRY{
     pHtmlparam->m_varVal.ChangeType(pHtmlparam->m_varVal.vt,&varTemp);
    }
    CATCH(CException,pEx)
    {
     CGlobal::ProcessException(pEx);
     el.InvokeHelper(DISPID_IHTMLELEMENT2_FOCUS,DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
     return FALSE;
    }
    END_CATCH
   }
  }
 }
 CATCH(CException,pEx)
 {
  CGlobal::ProcessException(pEx);
  return FALSE;
 }
 END_CATCH
 return TRUE;
}
COleVariant CParamDlg::GetValue(CString strName)
{
 COleVariant varRet;
 CHtmlparam* pHtmlparam;
 CObject* pOb;
 if(m_mapNameToParam.Lookup(strName,pOb)){//found
  pHtmlparam=(CHtmlparam*)pOb;
  varRet=pHtmlparam->m_varVal;
 }
 return varRet;
}
void CParamDlg::GetValue(CString strName,int& iVal)
{
 COleVariant var=GetValue(strName);
 var.ChangeType(VT_I4);
 iVal=var.iVal;
}
void CParamDlg::GetValue(CString strName,long& lVal)
{
 COleVariant var=GetValue(strName);
 var.ChangeType(VT_I4);
 lVal=var.lVal;
}

void CParamDlg::GetValue(CString strName,CString& strVal)
{
 COleVariant var=GetValue(strName);
 var.ChangeType(VT_BSTR);
 strVal=var.bstrVal;
}


void  CParamDlg::SetValue(CString strName,
 COleVariant varVal,
 LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
 COleVariant varRet;
 CHtmlparam* pHtmlparam;
 CObject* pOb;
 if(m_mapNameToParam.Lookup(strName,pOb)){//found
  pHtmlparam=(CHtmlparam*)pOb;
 }
 else{
  pHtmlparam=new CHtmlparam;
  m_mapNameToParam.SetAt(strName,pHtmlparam);
 }
 pHtmlparam->m_varVal=varVal;
 if(lpszAlt)
  pHtmlparam->m_strAlt=lpszAlt;
}
void  CParamDlg::SetValue(CString strName,
  int iVal,
  LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
 COleVariant var;
 var.vt=VT_I4;
 var.iVal=iVal;
 SetValue(strName,var,lpszAlt);
}
void  CParamDlg::SetValueBool(CString strName,
  BOOL bVal,
  LPCTSTR lpszAlt/*=NULL*/)//displayed as tooltip
{
 SetValue(strName,COleVariant((long)bVal,VT_BOOL),lpszAlt);
}
CString  HTMLElement_GetValueAttributeName(CHTMLElement* pel)
{
 CString strValAttribName;
 CString strTagName=pel->GetTagName();
 if(!strTagName.CompareNoCase(HTML_TAG_INPUT)||!strTagName.CompareNoCase(HTML_TAG_SELECT)){
  strValAttribName=HTML_ATTRIB_VALUE;
 }
 if(HTMLElement_IsInputCheckBoxElement(pel))
  strValAttribName=HTML_ATTRIB_CHECKED;
 //to be continued
 return strValAttribName;
}

CString  HTMLElement_GetToolTipAttributeName(CHTMLElement* pel)
{
 CString strTipAttribName;
 CString strTagName=pel->GetTagName();
 if(!strTagName.CompareNoCase(HTML_TAG_INPUT))
  strTipAttribName=HTML_ATTRIB_ALT;
 //to be continued
 return strTipAttribName;
}
CString HTMLElement_GetIDOrName(CHTMLElement* pel)
{
 COleVariant varTemp;
 CString strElementID=pel->GetId();
 if(strElementID.IsEmpty()){
  varTemp=pel->getAttribute(HTML_ATTRIB_NAME,0);
  varTemp.ChangeType(VT_BSTR);
  strElementID=varTemp.bstrVal;
 }
 return strElementID;
}
BOOL HTMLElement_IsInputElement(CHTMLElement* pel)
{
 CString strTagName=pel->GetTagName();
 return (!strTagName.CompareNoCase(HTML_TAG_INPUT));
}
BOOL HTMLElement_IsInputCheckBoxElement(CHTMLElement* pel)
{
 BOOL bRet=FALSE;
 if(HTMLElement_IsInputElement(pel)){
  COleVariant varTemp=pel->getAttribute(HTML_ATTRIB_TYPE,0);
  varTemp.ChangeType(VT_BSTR);
  CString strTemp=varTemp.bstrVal;
  if(!strTemp.CompareNoCase(HTML_TYPE_CHECKBOX))
   bRet=TRUE;
 }
 return bRet;
}

本文地址:http://com.8s8s.com/it/it3225.htm