⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfgcanview.cpp

📁 CAN__组建现场总线系统设计技术(光盘)
💻 CPP
字号:
// CfgCANView.cpp : implementation file
//

#include "stdafx.h"
#include "VCStyle.h"
#include "CfgCANView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#include "ModelDlg.h"

#include "data.h"
/////////////////////////////////////////////////////////////////////////////
// CCfgCANView

IMPLEMENT_DYNCREATE(CCfgCANView, CFormView)

CCfgCANView::CCfgCANView()
	: CFormView(CCfgCANView::IDD)
{
	//{{AFX_DATA_INIT(CCfgCANView)
	m_baud = -1;
	//}}AFX_DATA_INIT
}

CCfgCANView::~CCfgCANView()
{
}

void CCfgCANView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCfgCANView)
	DDX_Control(pDX, IDC_BUTTON_SAVE, m_btnsave);
	DDX_Control(pDX, IDC_BUTTON_MODIFY, m_btnmodify);
	DDX_Control(pDX, IDC_BUTTON_DEL, m_btndel);
	DDX_Control(pDX, IDC_BUTTON_ADD, m_btnadd);
	DDX_Control(pDX, IDC_LIST_MODELS, m_MdList);
	DDX_CBIndex(pDX, IDC_COMBO_BAUD, m_baud);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CCfgCANView, CFormView)
	//{{AFX_MSG_MAP(CCfgCANView)
	ON_BN_CLICKED(IDC_BUTTON_ADD, OnAddModel)
	ON_BN_CLICKED(IDC_BUTTON_MODIFY, OnModifyModel)
	ON_BN_CLICKED(IDC_BUTTON_DEL, OnDelModel)
	ON_BN_CLICKED(IDC_BUTTON_SAVE, OnSaveCfg)
	ON_WM_CTLCOLOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCfgCANView diagnostics

#ifdef _DEBUG
void CCfgCANView::AssertValid() const
{
	CFormView::AssertValid();
}

void CCfgCANView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
CCfgCANDoc *CCfgCANView::GetDocument ()  // non-debug version is inline
{
	ASSERT (m_pDocument->IsKindOf (RUNTIME_CLASS (CCfgCANDoc)));

	return (CCfgCANDoc *) m_pDocument;
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCfgCANView message handlers

void CCfgCANView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();

	m_bkbrush.CreateSolidBrush(RGB(240,250,245));
	
	// TODO: Add your specialized code here and/or call the base class
	//建立列表
	m_MdList.InsertColumn(0,"名称",LVCFMT_LEFT,100);
	m_MdList.InsertColumn(1,"类型",LVCFMT_LEFT,100);
	m_MdList.InsertColumn(2,"地址",LVCFMT_LEFT,50);
	m_MdList.SetExtendedStyle(
		m_MdList.GetExtendedStyle()|
		LVS_EX_FULLROWSELECT|
		LVS_EX_GRIDLINES);
	m_MdList.SetBkColor(RGB(240,255,245));

	// 添加数据到m_MdList
	int nItem = 0;
	for(int i=0;i<MAX_MODELS;i++){
		//获取数据
		BYTE addr = i;
		BYTE type = ModelTableBk[i].type;
		char sname[MAX_MD_NAME];
		strcpy(sname,ModelTableBk[i].name);
		CString saddr;
		saddr.Format("%d",addr);
		CString stype;

		switch(type){//判断是否为有效模块,如果是,则加入到列表中
		case T_AD_7703:
			m_MdList.InsertItem(nItem,sname);
			m_MdList.SetItem(nItem,1,LVIF_TEXT,"T_AD_7703",0,0,0,0);
			m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);
			nItem++;
			break;
		case T_AD_7703_2:
			m_MdList.InsertItem(nItem,sname);
			m_MdList.SetItem(nItem,1,LVIF_TEXT,"T_AD_7703_2",0,0,0,0);
			m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);
			nItem++;
			break;
		case T_AD_7710:
			m_MdList.InsertItem(nItem,sname);
			m_MdList.SetItem(nItem,1,LVIF_TEXT,"T_AD_7710",0,0,0,0);
			m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);
			nItem++;
			break;
		case T_QD:
			m_MdList.InsertItem(nItem,sname);
			m_MdList.SetItem(nItem,1,LVIF_TEXT,"T_QD",0,0,0,0);
			m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);
			nItem++;
			break;
		default:
			break;
		}
	}

	//
	switch(baud){
	case 0xC3:
		m_baud = 0;
		break;
	case 0xC9:
		m_baud = 1;
		break;
	case 0xD3:
		m_baud = 2;
		break;
	case 0xE7:
		m_baud = 3;
		break;
	default:
		break;
	}
	UpdateData(FALSE);
}

void CCfgCANView::OnAddModel() 
{
	CModelDlg dlg;
	int nItem = m_MdList.GetItemCount();
	UINT type;
	UINT addr;
	CString stype;
	CString saddr;
	CString sname;
	if(dlg.DoModal() == IDOK){
		type = dlg.GetSelType();
		switch(type){
		case T_NULL:
			stype = "T_NULL";
			break;
		case T_AD_7703:
			stype = "T_AD_7703";
			break;
		case T_AD_7703_2:
			stype = "T_AD_7703_2";
			break;
		case T_AD_7710:
			stype = "T_AD_7710";
			break;
		case T_QD:
			stype = "T_QD";
			break;
		default:
			stype = "未知类型";
			break;
		}

		saddr.Format("%d",dlg.m_addr);
		addr = dlg.m_addr;
		sname = dlg.m_name;

		//有效性检查
		if(addr>=MAX_MODELS || sname.GetLength()>=MAX_MD_NAME)
		{
			AfxMessageBox("模块参数不正确!");
			return;
		}
	
		//放到列表中
		m_MdList.InsertItem(nItem,sname);
		m_MdList.SetItem(nItem,1,LVIF_TEXT,stype,0,0,0,0);
		m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);

		//改变全局变量ModelTableBk
		ModelTableBk[addr].type = type;
		strcpy(ModelTableBk[addr].name,sname);
		delete ModelTableBk[addr].detail;
		ModelTableBk[addr].detail = NULL;
	}
}

void CCfgCANView::OnModifyModel() 
{
	//get type and address currently selected.
	POSITION pos = m_MdList.GetFirstSelectedItemPosition();
	if (pos == NULL){
	   TRACE0("No items were selected!\n");
	   return;
	}
	int nItem = m_MdList.GetNextSelectedItem(pos);

	CString sname = m_MdList.GetItemText(nItem,0);
	CString stype = m_MdList.GetItemText(nItem,1);
	CString saddr = m_MdList.GetItemText(nItem,2);

	UINT type;
	if(stype == "T_AD_7703")
		type = T_AD_7703;
	else if(stype == "T_AD_7703_2")
		type = T_AD_7703_2;
	else if(stype == "T_AD_7710")
		type = T_AD_7710;
	else if(stype == "T_QD")//"T_QD"
		type = T_QD;
	else
		type = T_NULL;

	UINT addr;
	sscanf(saddr,"%d",&addr);

//	CModelDlg dlg(type,addr);
	CModelDlg dlg;
	dlg.m_addr = addr;
	dlg.SetSel(type);
	dlg.m_name = sname;

	if(dlg.DoModal() == IDCANCEL) return;

	type = dlg.GetSelType();
	switch(type){
	case T_NULL:
		stype = "T_NULL";
		break;
	case T_AD_7703:
		stype = "T_AD_7703";
		break;
	case T_AD_7703_2:
		stype = "T_AD_7703_2";
		break;
	case T_AD_7710:
		stype = "T_AD_7710";
		break;
	case T_QD:
		stype = "T_QD";
		break;
	default:
		stype = "未知类型";
		break;
	}

	saddr.Format("%d",dlg.m_addr);
	addr = dlg.m_addr;
	sname = dlg.m_name;

	//有效性检查
	if(addr>=MAX_MODELS || sname.GetLength()>=MAX_MD_NAME)
	{
		AfxMessageBox("模块参数不正确!");
		return;
	}

	//修改列表
	m_MdList.SetItem(nItem,0,LVIF_TEXT,sname,0,0,0,0);
	m_MdList.SetItem(nItem,1,LVIF_TEXT,stype,0,0,0,0);
	m_MdList.SetItem(nItem,2,LVIF_TEXT,saddr,0,0,0,0);

	//改变全局变量ModelTableBk
	ModelTableBk[addr].type = type;
	strcpy(ModelTableBk[addr].name,sname);
	delete ModelTableBk[addr].detail;
	ModelTableBk[addr].detail = NULL;
}

void CCfgCANView::OnDelModel() 
{
	//get type and address currently selected.
	POSITION pos = m_MdList.GetFirstSelectedItemPosition();
	if (pos == NULL){
	   TRACE0("No items were selected!\n");
	   return;
	}
	int nItem = m_MdList.GetNextSelectedItem(pos);

	//从ModelTableBk中删除
	CString saddr = m_MdList.GetItemText(nItem,2);
	BYTE addr;
	sscanf(saddr,"%d",&addr);
	ModelTableBk[addr].type = T_NULL;
	delete ModelTableBk[addr].detail;
	ModelTableBk[addr].detail = NULL;

	//从列表中删除
	m_MdList.DeleteItem(nItem);
}

void CCfgCANView::OnSaveCfg() 
{
	//confirm
	if(AfxMessageBox("原先的配置文件将被覆盖。真的要继续吗?",
		MB_ICONQUESTION|MB_YESNO)
		== IDNO)
		return;
	UpdateData();
	switch(m_baud){
	case 0:
		baud = 0xc3;
		break;
	case 1:
		baud = 0xc9;
		break;
	case 2:
		baud = 0xd3;
		break;
	default:
		baud = 0xe7;
		break;
	}
	//write
	write_cfg_file();
	AfxMessageBox("配置被修改,需要重新运行程序。");
}

HBRUSH CCfgCANView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
//	HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here

	return m_bkbrush;
	// TODO: Return a different brush if the default is not desired
//	return hbr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -