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

📄 comcontrol.cpp

📁 自已做的简单的库存管理软件。包含员工信息管理等
💻 CPP
字号:
// Comcontrol.cpp : implementation file
//

#include "stdafx.h"
#include "st6.h"
#include "Comcontrol.h"
#include "SerialControl.h"
#include "Userset.h"
#include "md5.h"


UINT MfcThreadProc(LPVOID lpParam);

// CComcontrol dialog

IMPLEMENT_DYNAMIC(CComcontrol, CDialog)

CComcontrol::CComcontrol(CWnd* pParent /*=NULL*/)
	: CDialog(CComcontrol::IDD, pParent)
	, m_bAutoSend(false)
{
	
	str_rx_data = _T("");
	str_tx_data = _T("");
	m_bAutoSend=FALSE;

	//OpenSerialPort1();

    //{{AFX_DATA_INIT(CSCommTestDlg)
	m_strRXData = _T("");
	m_strTXData = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

CComcontrol::~CComcontrol()
{
}

void CComcontrol::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

	//DDX_Text(pDX, IDC_EDIT_RX_DATA, str_rx_data);
	//DDX_Text(pDX, IDC_EDIT_TX_DATA, str_tx_data);

	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm);
	DDX_Text(pDX, IDC_EDIT_RX_DATA, m_strRXData);
	DDX_Text(pDX, IDC_EDIT_TX_DATA, m_strTXData);
	DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctrlHexSend);
	DDX_Control(pDX, IDC_CHECK_HEXDISPLAY, m_ctrlHexDiaplay);
}


BEGIN_MESSAGE_MAP(CComcontrol, CDialog)
	//ON_BN_CLICKED(IDC_BUTTON_TX, &CComcontrol::OnBnClickedButtonTx)
	//ON_MESSAGE(COM_RECVDATA,OnRecvData)
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_TX, &CComcontrol::OnButtonManualsend)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CComcontrol::OnBnClickedButtonClear)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_CHECK_AUTOSEND, &CComcontrol::OnBnClickedCheckAutosend)
	ON_EN_CHANGE(IDC_EDIT_TX_DATA, &CComcontrol::OnEnChangeEditTxData)
	ON_BN_CLICKED(IDC_BUTTON_USERSET, &CComcontrol::OnBnClickedButtonUserset)
	ON_WM_SIZE()
	ON_BN_CLICKED(IDOK, &CComcontrol::OnBnClickedOk)
END_MESSAGE_MAP()


// CComcontrol message handlers



void CComcontrol::OnBnClickedButtonTx()
{
	// TODO: Add your control notification handler code here
}



BOOL CComcontrol::OnInitDialog()
{
	CDialog::OnInitDialog();

	GetClientRect(&m_rect);

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


	//CButton*pbutton = (CButton*)GetDlgItem(IDC_BUTTON1);
	//pbutton->SetIcon((HICON)::LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON_HK), IMAGE_ICON, 60, 60, 0));
	//pbutton->SetIcon( ::LoadIcon(NULL, IDI_QUESTION) ); 

	m_btn1.SubclassDlgItem(IDC_BUTTON_USERSET,this);
	m_btn1.SetIcon(IDI_ICON_HK);
	//m_btn.SetFlat(FALSE);

	m_btn2.SubclassDlgItem(IDC_BUTTON2,this);
	m_btn2.SetIcon(IDI_ICON2,IDI_ICON1);


	m_btn3.SubclassDlgItem(IDC_BUTTON3,this);
	m_btn3.SetIcon(IDI_ICON3);
	m_btn3.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,208,208));
	m_btn3.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
	m_btn3.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);

	
	PostMessage( WM_SYSCOMMAND,  SC_MAXIMIZE, 0);  
	
	//m_bmenu.LoadMenu(IDR_MENU_SYSTEM);

	// TODO: 在此添加额外的初始化代码

	//启动串口监视线程
	/*DWORD threadID;
	hCommThread = ::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0,
		(LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess, AfxGetMainWnd()->m_hWnd, 0, &threadID);
	if (hCommThread == NULL)
	{
		::AfxMessageBox(_T("创建串口3处理线程失败"));
		::PostQuitMessage(0);
	}*/


	//AfxBeginThread( MfcThreadProc,NULL);


	m_ctrlHexSend.SetCheck(BST_CHECKED);
	m_ctrlHexDiaplay.SetCheck(BST_CHECKED);


	if(m_ctrlComm.get_PortOpen())
		m_ctrlComm.put_PortOpen(FALSE);

	m_ctrlComm.put__CommPort(3);   //选择com1
	if( !m_ctrlComm.get_PortOpen())
		m_ctrlComm.put_PortOpen(TRUE);//打开串口
	else
		AfxMessageBox(_T("cannot open serial port"));

	m_ctrlComm.put_Settings(_T("115200,n,8,1")); //波特率9600,无校验,8个数据位,1个停止位
	m_ctrlComm.put_InputMode(1); //1:表示以二进制方式检取数据
	m_ctrlComm.put_RThreshold(1); 
	//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_ctrlComm.put_InputLen(0);  //设置当前接收区数据长度为0
	m_ctrlComm.get_InputLen();//先预读缓冲区以清除残留数据



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


LRESULT CComcontrol::OnRecvData(WPARAM wParam, LPARAM lParam)
{
	/*CString recvStr((char *)wParam);
	//str_rx_data += recvStr;
	CString str_tmp;
	for( int i = 0; i <  recvStr.GetLength(); i++ )
	{
		str_tmp.Format(_T("%04x"),recvStr.GetAt(i));
		str_rx_data += str_tmp;
	}
	UpdateData(false);*/
	return 1;
}


UINT MfcThreadProc(LPVOID lpParam)
{
	
	char str[256];
	DWORD wCount = 0; //读取的字节数
	while(1)
	{
		printf("1111");

	}
	return TRUE;
}

BEGIN_EVENTSINK_MAP(CComcontrol, CDialog)
    //{{AFX_EVENTSINK_MAP(CSCommTestDlg)
	ON_EVENT(CComcontrol, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()


void CComcontrol::OnComm() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len ,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
	if(m_ctrlComm.get_CommEvent()==2)     //事件值为2表示接收缓冲区内有字符
	{
		variant_inp = m_ctrlComm.get_Input();   //读缓冲区
		safearray_inp = variant_inp;           //VARIANT型变量转换为ColeSafeArray型变量
		len = safearray_inp.GetOneDimSize(); //得到有效数据长度
		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
		for(k=0;k<len;k++)             //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k);      //字符型
			if(m_ctrlHexDiaplay.GetCheck())
				strtemp.Format(_T("%02X "),bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
			else 
				strtemp.Format(_T("%c"),bt); //将字符送入临时变量strtemp存放
			m_strRXData+=strtemp;    //加入接收编辑框对应字符串    
		}
	}
	UpdateData(FALSE);           //更新编辑框内容
	((CEdit*)GetDlgItem(IDC_EDIT_RX_DATA))->PostMessage(WM_VSCROLL, SB_BOTTOM, 0);
}


void CComcontrol::OnButtonManualsend() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE); //读取编辑框内容
	//m_ctrlComm.put_Output(COleVariant(m_strTXData));//发送数据
	if(m_ctrlHexSend.GetCheck())
	{
		CByteArray hexdata;
		int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
		m_ctrlComm.put_Output(COleVariant(hexdata)); //发送十六进制数据
	}
	else 
		m_ctrlComm.put_Output(COleVariant(m_strTXData));//发送ASCII字符数据
	
}

void CComcontrol::OnBnClickedButtonClear()
{
	// TODO: Add your control notification handler code here

	m_strRXData= _T("");
	UpdateData(FALSE); 

}

int CComcontrol::String2Hex(CString str, CByteArray & senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	senddata.SetSize(len/2);
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}
	senddata.SetSize(hexdatalen);
	return hexdatalen;
}

char CComcontrol::ConvertHexChar(char ch)
{
	if((ch>='0')&&(ch<='9'))
		return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else return (-1);
}

void CComcontrol::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default

	OnButtonManualsend();
	CDialog::OnTimer(nIDEvent);
}

void CComcontrol::OnBnClickedCheckAutosend()
{
	// TODO: Add your control notification handler code here
	m_bAutoSend=!m_bAutoSend;
	if(m_bAutoSend)
	{
		SetTimer(1,1000,NULL);//时间为1000毫秒
	}
	else
	{
		KillTimer(1);   //取消定时
	}

}

void CComcontrol::OnEnChangeEditTxData()
{
	// TODO:  If this is a RICHEDIT control, the control will not
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.

	// TODO:  Add your control notification handler code here
	UpdateData(TRUE); //读取编辑框内容
}

void CComcontrol::OnBnClickedButtonUserset()
{

	// TODO: Add your control notification handler code here

	CUserset userset;
	INT_PTR nResponse = userset.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此处放置处理何时用“确定”来关闭
		//  对话框的代码

		
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置处理何时用“取消”来关闭
		//  对话框的代码

		
	}
}


void CComcontrol::OnSize(UINT nType, int cx, int cy)
{
	CDialog::OnSize(nType, cx, cy);

	//最小化不需要调整位置
	if(nType == SIZE_MINIMIZED )
	{
		return;
	}

	// TODO: Add your message handler code here
	CWnd* pWnd = GetWindow(GW_CHILD); 

	while(pWnd)
	{
		CRect rect;   //获取控件变化前大小
		
		pWnd->GetWindowRect(&rect);
		
		ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
		
		// cx/m_rect.Width()为对话框在横向的变化比例
		rect.left = rect.left * cx / m_rect.Width();/////调整控件大小
		
		rect.right = rect.right * cx / m_rect.Width();
		
		rect.top=rect.top * cy / m_rect.Height();
		
		rect.bottom=rect.bottom * cy / m_rect.Height();
		
		pWnd->MoveWindow(rect);//设置控件大小

		pWnd = pWnd->GetWindow(GW_HWNDNEXT);

	}

	

	GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小


}

void CComcontrol::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	//OnOK();



}

⌨️ 快捷键说明

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