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

📄 xfkilnview.cpp

📁 关于串口通讯的多线程编程,希望可以为为大家提供参考
💻 CPP
字号:
// XFKILNView.cpp : implementation of the CXFKILNView class
//

#include "stdafx.h"
#include "XFKILN.h"

#include "XFKILNDoc.h"
#include "XFKILNView.h"
#include "DeviceNode.h"

#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView

IMPLEMENT_DYNCREATE(CXFKILNView, CView)

BEGIN_MESSAGE_MAP(CXFKILNView, CView)
	//{{AFX_MSG_MAP(CXFKILNView)
	ON_COMMAND(ID_CMD_TESTPORT, OnCmdTestport)
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_MENU_ADDNODE, OnAddnode)
	ON_COMMAND(IDC_METER1, OnMeter1)
	ON_COMMAND(IDC_METER2, OnMeter2)
	ON_COMMAND(IDC_MTER3, OnMter3)
	ON_COMMAND(IDC_MTER4, OnMter4)
	ON_UPDATE_COMMAND_UI(IDC_METER1, OnUpdateMeter1)
	ON_UPDATE_COMMAND_UI(IDC_METER2, OnUpdateMeter2)
	ON_UPDATE_COMMAND_UI(IDC_MTER3, OnUpdateMter3)
	ON_UPDATE_COMMAND_UI(IDC_MTER4, OnUpdateMter4)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView construction/destruction

CXFKILNView::CXFKILNView()
{
	// TODO: add construction code here
	m_count = 0;
  
}

CXFKILNView::~CXFKILNView()
{
}

BOOL CXFKILNView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
    
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView drawing

void CXFKILNView::OnDraw(CDC* pDC)
{
	
	CXFKILNDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	CRect rcView;
	GetClientRect(rcView);
	CString strTitle(_T("Kiln Control System"));
	//Set the background mode to transparent.
	 pDC->SetBkMode(TRANSPARENT);
	
//	 HDC hDC = ::GetDC(AfxGetMainWnd()->m_hWnd);

	char *sztemp[] = {"1700","1600", "1500","1400","1300",
	"1200","1100","1000","900","800","700","600","500",
	"400","300","200","100"};

	char time[40][3];
	for (int t = 0; t <= 40; t++)
	{
		sprintf(&time[t][0], "%d", t);
		
	}

	pDC->SetTextColor(RGB (0, 255, 0));
	int x = rcView.Width()/2 - strTitle.GetLength()*3;
	int y = 0;
	pDC->TextOut(x,y, strTitle);
	pDC->TextOut(0, 25, "1700");
	// 选用蓝色虚线笔 画曲线坐标系内线
	CPen pen(PS_DOT, 1, RGB(0,0,255));
	pDC->SelectObject(&pen);
	//  画横线并标注温度值
	for (int i = 35 , k = 0 ; i <= rcView.Height() - 25, k < 17; k++ ,i+= rcView.Height()/20)
	{
		pDC->MoveTo(40, i);
		pDC->TextOut(0, i - 10, sztemp[k]);
		pDC->LineTo(rcView.Width() - 40, i);
	}
	// 画竖线并标注时间值
	for (int j = 40 , l = 0 ; j <= rcView.Width() - 29 && l < 40; l++, j+= rcView.Height()/20)
	{
		pDC->MoveTo(j, 35);
		pDC->LineTo(j, rcView.Height()*91/100);
		pDC->TextOut(j -5 , rcView.Height()*91/100, time[l]);
	}
	
	// 选择白色实线笔 画坐标系X、Y轴
	CPen penSolid(PS_SOLID, 1, RGB(255,255,255));
	pDC->SelectObject(&penSolid);
	
	
	pDC->MoveTo(40, 25);
	pDC->LineTo(40, rcView.Height()*93/103);
	pDC->LineTo(rcView.Width() - 20, rcView.Height()*93/103);
	
	// 选用红色字标注X、Y轴单位
	pDC->SetTextColor(RGB(255,0,0));
	pDC->TextOut(0, 10, "Temperature C°");
	pDC->TextOut(rcView.Width() - 80, rcView.Height() -20, "Time");
}

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView printing

BOOL CXFKILNView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CXFKILNView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CXFKILNView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView diagnostics

#ifdef _DEBUG
void CXFKILNView::AssertValid() const
{
	CView::AssertValid();
}

void CXFKILNView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CXFKILNDoc* CXFKILNView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXFKILNDoc)));
	return (CXFKILNDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CXFKILNView message handlers

BOOL CXFKILNView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

void CXFKILNView::OnCmdTestport() 
{
	// TODO: Add your command handler code here
	m_CommMeter.WriteToPort("来个句子试试!");
	m_CommMeter.ReadFromPort();

	CDC *dc =GetDC();
	dc->TextOut(0, 100, strList);
	
	
	

}

BOOL CXFKILNView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	// Create a pruple brush.

	CBrush brush(RGB(0 , 0 , 0));
	// Select the brush into the device context .
	CBrush* pOldBrush = pDC->SelectObject(&brush);
	// Get the area that needs to be erased .
	CRect rcClip;
	pDC->GetClipBox(&rcClip);
	//Paint the area.
	pDC->PatBlt(rcClip.left, rcClip.top, rcClip.Width(), 
				rcClip.Height(), PATCOPY);
	//Unselect brush out of device context .
	pDC->SelectObject(pOldBrush);
	// Return nonzero to half fruther processing .
	return TRUE;
	
    return CView::OnEraseBkgnd(pDC);
	
}




LRESULT CXFKILNView::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	// TODO: Add your specialized code here and/or call the base class
	//WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
	
	
	if (message == WM_COMM_RXCHAR && wParam != NULL)
		 strList[m_count++] = wParam;
	strList[m_count] = '\0';
		 
 	return CView::DefWindowProc(message, wParam, lParam);
}




void CXFKILNView::OnAddnode() 
{
	// TODO: Add your command handler code here
	UINT uPort = 0;
	UINT uBaud  = 0;
	UINT uStopBit = 1;
	UINT uDataBit = 8;
	char sParity = 'N';
	
	CXFKILNDoc *pDoc = GetDocument();
	pDoc->m_DevNode.DoModal();
		
	int nLen  = pDoc->m_DevNode.m_Baud.GetLength();
	char *szBaud =pDoc->m_DevNode.m_Baud.GetBuffer(nLen);
	int weight[] ={1, 10, 100, 1000, 10000, 100000};
	
	char sTemp;
	for (int i = 0; i < nLen; i++)
	{
		
		sTemp = szBaud[i];
		uBaud += ((int)sTemp - 48) * weight[nLen - i -1];
	}

	
	char *szStopBit =pDoc->m_DevNode.m_StopBit.GetBuffer(1);
	char s_stop = szStopBit[0];
	uStopBit = (int)s_stop - 48;

	char *szDataBit = pDoc->m_DevNode.m_DataBit.GetBuffer(1);
	char s_data = szDataBit[0];
	uDataBit = (int)s_data -48;

	nLen  = pDoc->m_DevNode.m_Parity.GetLength();
	char *szParity = pDoc->m_DevNode.m_Parity.GetBuffer(nLen);
	//AfxMessageBox(szParity);
	if (szParity  == "无校验")
		sParity = 'N';
	else if (szParity == "奇校验")
		sParity = 'O';
	else if (szParity == "偶校验")
		sParity = 'E';
	
	
	/*
	char rev[10];
	sprintf(rev, "%d", uBaud);
	AfxMessageBox(rev);
	*/
	
	char *szPort = pDoc->m_DevNode.m_Port.GetBuffer(4);
	char s1 = szPort[3];
	uPort =(int)s1 - 48;

	if (m_CommMeter.InitPort(this,uPort, uBaud, sParity, uDataBit,
			uStopBit))
	{
		m_CommMeter.StartMonitoring();
	//	pDoc->nNodeNum++;
	}


}

void CXFKILNView::OnMeter1() 
{
	// TODO: Add your command handler code here
	if (m_bSelectMeter1 != 1)
	{
		m_bSelectMeter1 = 1;
		OnAddnode();
		return;
	}
	else
		m_bSelectMeter1 = 0;
	
	//m_CommMeter.StopMonitoring();

    
}

void CXFKILNView::OnMeter2() 
{
	// TODO: Add your command handler code here
	if (m_bSelectMeter2 != 1){
		m_bSelectMeter2 = 1;
		OnAddnode();
		
	}
	else
		m_bSelectMeter2 = 0;

	
}

void CXFKILNView::OnMter3() 
{
	// TODO: Add your command handler code here
	if (m_bSelectMeter3 != 1){
		m_bSelectMeter3 = 1;
		OnAddnode();
		
	}
	else
		m_bSelectMeter3 = 0;

	
}

void CXFKILNView::OnMter4() 
{
	// TODO: Add your command handler code here
	if (m_bSelectMeter4 != 1){
		m_bSelectMeter4 = 1;
		OnAddnode();
	
	}
	else
		m_bSelectMeter4 = 0;

	
}

void CXFKILNView::OnUpdateMeter1(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here

	if (m_bSelectMeter1 == 1)	
		pCmdUI->SetRadio();
}

void CXFKILNView::OnUpdateMeter2(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
//	if (this->GetDocument()->nNodeNum  < 2)
		
//	pCmdUI->Enable(FALSE);
	if (m_bSelectMeter2 == 1)	
		pCmdUI->SetRadio();
}

void CXFKILNView::OnUpdateMter3(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
//	if (this->GetDocument()->nNodeNum  < 3)
//			pCmdUI->Enable(FALSE);
	if (m_bSelectMeter3 == 1)	
		pCmdUI->SetRadio();
}

void CXFKILNView::OnUpdateMter4(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    if (m_bSelectMeter4 == 1)	
		pCmdUI->SetRadio();
}

⌨️ 快捷键说明

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