mfc初步探索——mfc与html交互

首先添加webpage的头文件和源文件;

将需要用到的html文件放在工程目录下

在MFC中添加ActiveX控件WebBrowser在窗体上,绑定变量m_Map

在OnInitDialog()里面添加:

	//关联地图
	m_Map.put_Silent(TRUE);
	char szPath[255] = { 0 };
	GetCurrentDirectory(255, szPath);
	strcat(szPath, _T("\\高德.html"));
	m_Map.Navigate(szPath, NULL, NULL, NULL, NULL);

利用CallJScript调用JavaScript函数:

	CWebPage web;
	web.SetDocument(m_Map.get_Document());
        web.CallJScript("historyMap", lon, lat ,a);

 程序界面:

 主程序:

头文件:


// GPRS_mapDlg.h : 头文件
//

#pragma once
#include "mscomm1.h"
#include "explorer1.h"
#include "WebPage.h"


// CGPRS_mapDlg 对话框
class CGPRS_mapDlg : public CDialogEx
{
// 构造
public:
	CGPRS_mapDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_GPRS_MAP_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CMscomm1 m_mscomm;
	DECLARE_EVENTSINK_MAP()
	void OnCommMscomm1();
	CString m_editTemp;
	BOOL isShow;
	void sendMessageToJs(CString m_strLon, CString m_strLat);
	CExplorer1 m_Map;
	afx_msg void OnBnClickedOpencomm();
	afx_msg void OnCbnSelchangeCombo1();
	void createText(CString strData);
	void timeShow();
	CString m_recv;
	double dTemp;
	afx_msg void OnBnClickedClearmap();
	afx_msg void OnBnClickedHistorymap();
	CString a;
	void begin();
	afx_msg void OnBnClickedButton1();
};

源文件:


// GPRS_mapDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "GPRS_map.h"
#include "GPRS_mapDlg.h"
#include "afxdialogex.h"

#include "winsock.h" 
#include "stdio.h"
#include "mysql.h"
#include <iostream>
#include <afx.h>

#pragma comment(lib,"libmySQL.lib") 
#pragma comment(lib, "comsuppw.lib")//important

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CGPRS_mapDlg 对话框



CGPRS_mapDlg::CGPRS_mapDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CGPRS_mapDlg::IDD, pParent)
	, m_recv(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGPRS_mapDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	//	DDX_Control(pDX, IDC_MSCOMM1, m_mscomm);
	DDX_Control(pDX, IDC_EXPLORER1, m_Map);
	DDX_Text(pDX, IDC_EDIT, m_recv);
}

BEGIN_MESSAGE_MAP(CGPRS_mapDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPENCOMM, &CGPRS_mapDlg::OnBnClickedOpencomm)
//	ON_CBN_SELCHANGE(IDC_COMBO1, &CGPRS_mapDlg::OnCbnSelchangeCombo1)
	ON_BN_CLICKED(IDC_SHOWMAP, &CGPRS_mapDlg::timeShow)
	ON_BN_CLICKED(IDC_CLEARMAP, &CGPRS_mapDlg::OnBnClickedClearmap)
	ON_BN_CLICKED(IDC_HISTORYMAP, &CGPRS_mapDlg::OnBnClickedHistorymap)
	ON_BN_CLICKED(IDC_BUTTON1, &CGPRS_mapDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CGPRS_mapDlg 消息处理程序

BOOL CGPRS_mapDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标



	// TODO:  在此添加额外的初始化代码
	OnCbnSelchangeCombo1();

	//创建模块串口  
	if (!m_mscomm.Create(nullptr, WS_VISIBLE | WS_CHILD, CRect(0, 0, 0, 0), this, IDC_MSCOMM1))
	{
		MessageBox(_T("创建mscomm串口失败"));  
	}

	//关联地图
	m_Map.put_Silent(TRUE);
	char szPath[255] = { 0 };
	GetCurrentDirectory(255, szPath);
	strcat(szPath, _T("\\高德.html"));
	m_Map.Navigate(szPath, NULL, NULL, NULL, NULL);

	isShow = FALSE;
	a = "0";

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CGPRS_mapDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CGPRS_mapDlg::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
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CGPRS_mapDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

BEGIN_EVENTSINK_MAP(CGPRS_mapDlg, CDialogEx)
	ON_EVENT(CGPRS_mapDlg, IDC_MSCOMM1, 1, CGPRS_mapDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()


void CGPRS_mapDlg::OnCommMscomm1()
{
	// TODO:  在此处添加消息处理程序代码
	//AfxMessageBox("T1");
	if (m_mscomm.get_CommEvent() != 2)
	{
		return;
	}

	CString strRecv = _T("");
	CString strTemp1 = "";
	unsigned char rcvdata[1024] = { 0 };//接收的数据  
	COleSafeArray safearray_inp = m_mscomm.get_Input();//读缓冲区消息  
	DWORD len = safearray_inp.GetOneDimSize();//获取有效数据长度  
	for (long j = 0; j < len; j++)//转化为unsigned char数组  
	{
		safearray_inp.GetElement(&j, rcvdata + j);
	}	
	CString lon, lat;
	*((unsigned int*)(&dTemp)) = *(unsigned int*)(&rcvdata[0]);
	*((unsigned int*)(&dTemp) + 1) = *(unsigned int*)(&rcvdata[4]);
	lon.Format("%.15lf", dTemp);
	*((unsigned int*)(&dTemp)) = *(unsigned int*)(&rcvdata[8]);
	*((unsigned int*)(&dTemp) + 1) = *(unsigned int*)(&rcvdata[12]);
	lat.Format("%.15lf", dTemp);
	m_editTemp = lon + "," + lat;
	m_recv += m_editTemp;
	m_recv += "\r\n";
	createText(m_editTemp);
	m_editTemp = "";
	UpdateData(FALSE);
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT);
	pEdit->SetSel(m_recv.GetLength(), m_recv.GetLength());

	if (isShow)
	{
		sendMessageToJs(lon, lat);
	}

	m_mscomm.put_InBufferCount(0);
	m_mscomm.put_OutBufferCount(0);
}

void CGPRS_mapDlg::timeShow()
{
	isShow = TRUE;
}

void CGPRS_mapDlg::OnBnClickedOpencomm()
{
	// TODO:  在此添加控件通知处理程序代码
	if (m_mscomm.get_PortOpen())
		m_mscomm.put_PortOpen(FALSE); //关闭串口  
	CButton* pBtnOpencomm = (CButton*)GetDlgItem(IDC_OPENCOMM);
	CComboBox* pComboBoxComm = (CComboBox*)GetDlgItem(IDC_COMBO1);
	int nSelComm = pComboBoxComm->GetCurSel();

	m_mscomm.put_CommPort(nSelComm + 1); //设定串口为COM4  nSelComm + 1 
	m_mscomm.put_Settings(_T("9600,N,8,1")); //设定波特率115200,无奇偶校验,8位数据位,1位停止位  
	m_mscomm.put_InputMode(1); //设定数据接收模式,1为二进制,0为文本  
	m_mscomm.put_InputLen(0); //设定当前接收区数据长度,0表示全部读取  
	m_mscomm.put_InBufferSize(1024); //设定输入缓冲区大小为1024 byte  
	m_mscomm.put_OutBufferSize(1024); //设定输出缓冲区大小为1024 byte  
	m_mscomm.put_RThreshold(8); //每接收到1个字符时,触发OnComm事件  
	m_mscomm.put_SThreshold(0); //设定每发送多少个字符触发OnComm事件,0表示不触发OnComm事件  
	if (!m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(TRUE); //打开串口  
		pBtnOpencomm->SetWindowText(_T("串口已打开"));
	}
	else
		AfxMessageBox(_T("can't open serial port"));
}


void CGPRS_mapDlg::OnCbnSelchangeCombo1()
{
	// TODO:  在此添加控件通知处理程序代码
	CComboBox* pComboComm = (CComboBox*)GetDlgItem(IDC_COMBO1);
	ASSERT(pComboComm);

	//初始化串口窗口
	for (int i = 1; i <= 10; i++)
	{
		CString strComm;
		strComm.Format(_T("COM%d"), i);
		pComboComm->AddString(strComm);
	}
	pComboComm->AddString("com3");
	pComboComm->SetCurSel(0); //设置默认串口1
}

void CGPRS_mapDlg::createText(CString strData)
{
	CFile file;

	file.Open(_T("./1.txt"), CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate);
	//	file.SeekToBegin();
	file.SeekToEnd();
	DWORD dLen = file.GetLength();
	if (dLen == 0)
	{
		file.Write(strData, strData.GetLength());
	}
	else
	{
		file.Write(strData + "\r\n", strData.GetLength() + 2);
	}
	file.Flush();
	file.Close();
}

void CGPRS_mapDlg::sendMessageToJs(CString m_strLon, CString m_strLat)
{
	UpdateData(TRUE);
	CWebPage web;
	web.SetDocument(m_Map.get_Document());
	web.CallJScript("addMarker1", m_strLon, m_strLat, a);
}

void CGPRS_mapDlg::OnBnClickedClearmap()
{
	// TODO:  在此添加控件通知处理程序代码
	CWebPage web;
	web.SetDocument(m_Map.get_Document());
	web.CallJScript("clearMarker");

	CFile file;
	file.Open(_T("./1.txt"), CFile::modeCreate | CFile::modeWrite);
	DWORD dLen = file.GetLength();
	if (dLen != 0)
		AfxMessageBox(_T("清空失败!"));
}


void CGPRS_mapDlg::OnBnClickedHistorymap()
{
	// TODO:  在此添加控件通知处理程序代码
	CStdioFile file;
	file.Open(_T("./1.txt"), CFile::modeRead);
	CString strTemp;
	CString lon, lat;
	int nLen = 0;
	a = "1";
	file.SeekToBegin();
	CWebPage web;
	web.SetDocument(m_Map.get_Document());
	while (file.ReadString(strTemp))
	{
		nLen = strTemp.Find(",", 0);
		lon = strTemp.Left(nLen);
		int index = strTemp.GetLength();
		lat = strTemp.Mid(nLen + 1, index);
		web.CallJScript("historyMap", lon, lat ,a);
	}
	a = "0";
//	file.Close();
}

void CGPRS_mapDlg::begin()
{
	CStdioFile file;
	file.Open(_T("./2.txt"), CFile::modeRead);
	CString strTemp;
	CString lon, lat;
	int nLen = 0;
	a = "1";
	file.SeekToBegin();
	CWebPage web;
	web.SetDocument(m_Map.get_Document());
	while (file.ReadString(strTemp))
	{
		nLen = strTemp.Find(",", 0);
		lon = strTemp.Left(nLen);
		int index = strTemp.GetLength();
		lat = strTemp.Mid(nLen + 1, index);
		web.CallJScript("historyMap", lon, lat, a);
	}
	a = "0";
}

void CGPRS_mapDlg::OnBnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码
	begin();
}

猜你喜欢

转载自blog.csdn.net/no_zhushenghui/article/details/81304251
MFC