📄 mydhtmldlg.cpp
字号:
// mydhtmlDlg.cpp : 实现文件
//
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
文件:mydhtmlDlg.cpp
版权:FireBall Software Workroom
声明:本源程序的版权受《中华人民共和国著作权法》以及其
它相关法律和条约的保护。任何有机会得到本源程序的
个人和机构,未经作者明确授权,不得将本源程序用于
任何商业目的(直接的或间接的)。对于非商业目的的使
用 (包括复制、传播、编译和修改), 原则上没有特别
的限制条款,但请在相关文档中说明其来源,并尊重原
作者的署名权。
编写:丁称林(Besiding) 2004.10.27
联络:Tel:(0591)3703333-7806 E_mail:besiding@etang.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
#include "stdafx.h"
#include "mydhtml.h"
#include "mydhtmlDlg.h"
#include "FormDialog.h"
#include "afxwin.h"
#define ARRAYSIZE(a) (sizeof(a)/sizeof((a)[0]))
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
int BSTRToLocal(LPTSTR pLocal, BSTR pWide, DWORD dwChars);
int LocalToBSTR(BSTR pWide, LPTSTR pLocal, DWORD dwChars);
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
CString m_szVDesc;
afx_msg void OnBnClickedCheck1();
CEdit www;
DECLARE_EVENTSINK_MAP()
void BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel);
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
, m_szVDesc(_T(""))
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_VDESC, m_szVDesc);
DDX_Control(pDX, IDC_EDIT1, www);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1)
END_MESSAGE_MAP()
// CmydhtmlDlg 对话框
BEGIN_DHTML_EVENT_MAP(CmydhtmlDlg)
DHTML_EVENT_ONCLICK(_T("ButtonOK"), OnButtonOK)
DHTML_EVENT_ONCLICK(_T("ButtonCancel"), OnButtonCancel)
DHTML_EVENT_ONCLICK(_T("Test1"), OnButtonTest1)
DHTML_EVENT_ONCLICK(_T("Test2"), OnButtonTest2)
DHTML_EVENT_ONCLICK(_T("Test3"), OnButtonTest3)
DHTML_EVENT_ONCLICK(_T("Test4"), OnButtonTest4)
DHTML_EVENT_ONCLICK(_T("Button_Show"), OnShowHTMLDialog)
DHTML_EVENT_ONCLICK(_T("Button_Form"), OnShowFormDialog)
DHTML_EVENT_ONCHANGE(_T("s1"), OnSelectTest1)
DHTML_EVENT_ONMOUSEMOVE(_T("d1"), OnDivMouseMove1 )
DHTML_EVENT_ONMOUSEOUT(_T("d1"), OnDivMouseOut1 )
END_DHTML_EVENT_MAP()
CmydhtmlDlg::CmydhtmlDlg(CWnd* pParent /*=NULL*/)
: CDHtmlDialog(CmydhtmlDlg::IDD, CmydhtmlDlg::IDH, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_szP4 = "test for p4";
m_szInput1= "test for input1";
m_iInput2 = 101;
}
void CmydhtmlDlg::DoDataExchange(CDataExchange* pDX)
{
CDHtmlDialog::DoDataExchange(pDX);
//// for html ddx
DDX_DHtml_ElementInnerHtml(pDX,"p4",m_szP4);
DDX_DHtml_ElementValue(pDX,"input1",m_szInput1);
DDX_DHtml_ElementValue(pDX,"input2",m_iInput2);
}
BEGIN_MESSAGE_MAP(CmydhtmlDlg, CDHtmlDialog)
ON_WM_SYSCOMMAND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CmydhtmlDlg 消息处理程序
BOOL CmydhtmlDlg::OnInitDialog()
{
CDHtmlDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO:在此添加额外的初始化代码
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CmydhtmlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDHtmlDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CmydhtmlDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDHtmlDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CmydhtmlDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
HRESULT CmydhtmlDlg::OnButtonOK(IHTMLElement* /*pElement*/)
{
OnOK();
return S_OK;
}
HRESULT CmydhtmlDlg::OnButtonCancel(IHTMLElement* /*pElement*/)
{
OnCancel();
return S_OK;
}
HRESULT CmydhtmlDlg::OnButtonTest1(IHTMLElement* /*pElement*/)
{
AfxMessageBox("test1 button clicked");
return S_OK;
}
HRESULT CmydhtmlDlg::OnSelectTest1(IHTMLElement* /*pElement*/)
{
TRACE("select1 changed\n");
return S_OK;
}
HRESULT CmydhtmlDlg::OnDivMouseMove1(IHTMLElement* /*pElement*/)
{
TRACE("div1 mouse move\n");
return S_OK;
}
HRESULT CmydhtmlDlg::OnDivMouseOut1(IHTMLElement* /*pElement*/)
{
TRACE("div1 mouse out\n");
return S_OK;
}
HRESULT CmydhtmlDlg::OnButtonTest2(IHTMLElement* /*pElement*/)
{
CComPtr<IHTMLElement> spP1;
HRESULT hr = S_OK;
// Use the template overload
hr = GetElementInterface("p2", IID_IHTMLElement, reinterpret_cast<void**>(&spP1));
if(S_OK == hr)
{
BSTR bStr;
spP1->get_innerHTML(&bStr);
CString szTemp;
szTemp = bStr;
AfxMessageBox(szTemp);
CString strTable="abcdefg";
BSTR bstrTable = strTable.AllocSysString();
spP1->put_innerHTML(bstrTable);
}
else
{
AfxMessageBox("error");
}
return S_OK;
}
HRESULT CmydhtmlDlg::OnButtonTest3(IHTMLElement* /*pElement*/)
{
CComPtr<IHTMLElement> spP1;
HRESULT hr = S_OK;
hr = GetElement("p3", &spP1);
if(S_OK == hr)
{
}
else
{
AfxMessageBox("error");
}
BSTR bStr;
bStr = GetElementHtml("p3");
CString szTemp;
szTemp = bStr;
AfxMessageBox(szTemp);
CString strTable="ABCDEFG";
BSTR bstrTable = strTable.AllocSysString();
//spP1->put_innerHTML(bstrTable);
SetElementHtml("p3",bstrTable);
return S_OK;
}
HRESULT CmydhtmlDlg::OnButtonTest4(IHTMLElement* /*pElement*/)
{
UpdateData();
TRACE("p4=%s\n",m_szP4);
CString szTemp=m_szP4;
m_szP4 =m_szInput1;
m_szInput1=szTemp;
m_iInput2 ++;
UpdateData(FALSE);
return S_OK;
}
//用ShowHTMLDialog显示HTML对话框
HRESULT CmydhtmlDlg::OnShowHTMLDialog(IHTMLElement* /*pElement*/)
{
HINSTANCE hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL"));
if(hinstMSHTML)
{
SHOWHTMLDIALOGFN *pfnShowHTMLDialog;
pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML, TEXT("ShowHTMLDialog"));
if(pfnShowHTMLDialog)
{
IMoniker *pmk;
TCHAR szTemp[MAX_PATH*2];
OLECHAR bstr[MAX_PATH*2];
lstrcpy(szTemp, TEXT("res://"));
GetModuleFileName(NULL, szTemp + lstrlen(szTemp), ARRAYSIZE(szTemp) - lstrlen(szTemp));
// lstrcat(szTemp, TEXT("/HTML_RESOURCE"));
wsprintf(szTemp+lstrlen(szTemp), TEXT("/%d"), IDR_HTML_SHOW);//加入HTML网页资源
LocalToBSTR(bstr, szTemp, ARRAYSIZE(bstr));
CreateURLMoniker(NULL, bstr, &pmk);
if(pmk)
{
HRESULT hr;
VARIANT varArgs, varReturn;
VariantInit(&varReturn);
varArgs.vt = VT_BSTR;
varArgs.bstrVal = SysAllocString(L"产品ID号;用户名;公司名称;应用程序版本号");
hr = (*pfnShowHTMLDialog)(NULL, pmk, &varArgs, NULL, &varReturn);
VariantClear(&varArgs);
pmk->Release();
if(SUCCEEDED(hr))
{
switch(varReturn.vt)
{
case VT_BSTR:
{
TCHAR szData[MAX_PATH];
BSTRToLocal(szData, varReturn.bstrVal, ARRAYSIZE(szData));
wsprintf(szTemp, TEXT("经对话框修改后的返回值组合为 \"%s\"."), szData);
VariantClear(&varReturn);
}
break;
default:
lstrcpy(szTemp, TEXT("Cancel was selected."));
break;
}
MessageBox(szTemp, TEXT("HTML Dialog Sample"), MB_OK | MB_ICONINFORMATION);
}
else
MessageBox(TEXT("ShowHTMLDialog Failed."), TEXT("HTML Dialog Sample"), MB_OK | MB_ICONERROR);
}
}
FreeLibrary(hinstMSHTML);
}
return S_OK;
}
//用FORM显示HTML对话框
HRESULT CmydhtmlDlg::OnShowFormDialog(IHTMLElement* /*pElement*/)
{
CFormDialog FormDlg;
FormDlg.DoModal();
return S_OK;
}
void CAboutDlg::OnBnClickedCheck1()
{
// TODO: 在此添加控件通知处理程序代码
}
/************************************************************************** BSTRToLocal() **************************************************************************/
int BSTRToLocal(LPTSTR pLocal, BSTR pWide, DWORD dwChars)
{
*pLocal = 0;
#ifdef UNICODE
lstrcpyn(pLocal, pWide, dwChars);
#else
WideCharToMultiByte( CP_ACP, 0, pWide, -1,pLocal,dwChars,NULL,NULL);
#endif
return lstrlen(pLocal);
}
/************************************************************************** LocalToBSTR() **************************************************************************/
int LocalToBSTR(BSTR pWide, LPTSTR pLocal, DWORD dwChars)
{
*pWide = 0;
#ifdef UNICODE
lstrcpyn(pWide, pLocal, dwChars);
#else
MultiByteToWideChar( CP_ACP, 0,pLocal,-1,pWide,dwChars);
#endif
return lstrlenW(pWide);
}
BEGIN_EVENTSINK_MAP(CAboutDlg, CDialog)
// ON_EVENT(CAboutDlg, IDC_EXPLORER1, 250, BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
END_EVENTSINK_MAP()
//void CAboutDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
//{
// TODO: 在此处添加消息处理程序代码
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -