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

📄 scommtestdlg.cpp

📁 可实现也下位机的通信
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					senddata[len++] = xy[m_nCurScreen][ii][jj];
				}
			}
			senddata[len++] = 0x16;
		}
		else if(m_nType==1)	//内码功能          ////////幕数高四位代表颜色
		{
			for(i=0;i<(length-m_nEnterNum);i++)
			{
				senddata[len++]=HZKcode[i];
			}
			senddata[len++] = 0x16;
		}
		break;
	case 2:
		if(m_nType==0)
		{
			for(color=0;color<2;color++)
			{
				for(ii=0;ii<m_nHeight;ii++)
				{
					for(jj=0;jj<m_nWidth/8;jj++)
					{
						senddata[len++] = xy[m_nCurScreen][ii][jj];
					}
				}
			}
			senddata[len++] = 0x16;
		}
		else if(m_nType==1)///////功能号
		{
			for(i=0;i<(length-m_nEnterNum);i++)
			{
				senddata[len++]=HZKcode[i];
			}
			senddata[len++] = 0x16;
		}
		break;
	default:
		MessageBox("程序错误!","提示",MB_OK);
	
	}
	if(len>4096)
	{
		VARIANT   SendData   =   FormVARIANT(senddata,   len/2);
		if   (SendData.vt   !=   VT_EMPTY)   
		{   
			  m_ctrlComm.SetOutput(SendData);   
			  SafeArrayDestroy(SendData.parray);   
		} 
		SendData   =   FormVARIANT(senddata+len/2,   len-len/2);
		if   (SendData.vt   !=   VT_EMPTY)   
		{   
			  m_ctrlComm.SetOutput(SendData);   
			  SafeArrayDestroy(SendData.parray);   
		} 
	}
	else
	{
		VARIANT   SendData   =   FormVARIANT(senddata,   len);
		if   (SendData.vt   !=   VT_EMPTY)   
		{   
			  m_ctrlComm.SetOutput(SendData);   
			  SafeArrayDestroy(SendData.parray);   
		} 
	}
	EndWaitCursor();
}

void CSCommTestDlg::OnSend() 
{
	// TODO: Add your control notification handler code her
}


void CSCommTestDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
	m_nShow="";
	UpdateData(FALSE);
	GetDlgItem(IDC_SHOW)->SetFocus();
}

void CSCommTestDlg::OnReadFile() 
{
	// TODO: Add your control notification handler code here

	CFileDialog dlg(TRUE,"txt",".txt",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"文本文件(*.TXT)|*.TXT||");;
	if(dlg.DoModal()==IDOK)
	{
		m_nShow="";
		readfile=TRUE;
		GetDlgItem(IDC_SHOW)->SetFont(&font); 
		ifstream ifs(dlg.GetPathName());
		filename=dlg.GetPathName();
		char fch[1000];
		memset(fch,0,1000);
		ifs.read(fch,1000);

		UpdateData();
		m_nType=m_nType;
		
		file1=fch;
		UpdateData(FALSE);

		for(i=0;;i++)
		{
			m_nShow+=file1.GetAt(i);
			UpdateData(FALSE);
		}
		ifs.close();

		GetDlgItem(IDC_SHOW)->SetFocus();

		for(int h=0;h<50;h++)
		{
			::keybd_event(VK_DOWN, 0, 0, 0);//模拟Down键按下使光标移动到下一行
			::keybd_event(VK_END, 0, 0, 0);//模拟End键按下使光标移动到文字后面
		}

	//	SetTimer(2,50,NULL);
	//	SetTimer(3,10,NULL);
	}
}

void CSCommTestDlg::OnOpencomm() 
{
	// TODO: Add your control notification handler code here
	if( !m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
		GetDlgItem(IDC_OPENCOMM)->EnableWindow(FALSE);
		GetDlgItem(IDC_CLOSECOMM)->EnableWindow(TRUE);
	}
	else
	MessageBox("串口打开失败!","提示",MB_OK);
}

void CSCommTestDlg::OnClosecomm() 
{
	// TODO: Add your control notification handler code here
	if(m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);//关闭串口
		GetDlgItem(IDC_OPENCOMM)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLOSECOMM)->EnableWindow(FALSE);
	}
	else
	MessageBox("串口关闭失败!","提示",MB_OK);
}

void CSCommTestDlg::OnSettime() 
{
	// TODO: Add your control notification handler code here
	unsigned char senddata[100];
	unsigned int  len=0; 
	if(readfile)
	{
		KillTimer(2);
		KillTimer(3);
	}
	if(!m_ctrlComm.GetPortOpen())
	{
		MessageBox("串口没有打开!","提示",MB_OK);
		return;
	}

	UpdateData();
	time=CTime::GetCurrentTime();
//	unsigned short CRC = 0;//2byte
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;

	senddata[len++] = m_nChipnum;// addr
	senddata[len++] = 0x07;// func
    //len

	senddata[len++] = 0x00;
	senddata[len++] = 0x00;
	senddata[len++] = 0x00;
	senddata[len++] = 0x07;

	//time
	senddata[len++] = (unsigned char)(time.GetYear()%100);
	senddata[len++] = (unsigned char)time.GetMonth();
	senddata[len++] = (unsigned char)time.GetDay();
	senddata[len++] = (unsigned char)((time.GetDayOfWeek())-1);
	senddata[len++] = (unsigned char)time.GetHour();
	senddata[len++] = (unsigned char)time.GetMinute();
	senddata[len++] = (unsigned char)time.GetSecond();


	senddata[len++] = 0x16;

	VARIANT   SendData   =   FormVARIANT(senddata,   len);
	if   (SendData.vt   !=   VT_EMPTY)   
	{   
          m_ctrlComm.SetOutput(SendData);   
          SafeArrayDestroy(SendData.parray);   
	}  
	if(readfile)
	{
		SetTimer(2,50,NULL);
		SetTimer(3,10,NULL);
	}
}

void CSCommTestDlg::OnChecktime() 
{
	// TODO: Add your control notification handler code here
	unsigned char senddata[100];
	unsigned int  len=0;  
	if(readfile)
	{
		KillTimer(2);
		KillTimer(3);
	}	
	if(!m_ctrlComm.GetPortOpen())
	{
		MessageBox("串口没有打开!","提示",MB_OK);
		return;
	}

	UpdateData();
//	unsigned short CRC = 0;//2byte
	CTime time=CTime::GetCurrentTime();
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;
	senddata[len++] = 0xcc;

	senddata[len++] = m_nChipnum;// addr屏号
	senddata[len++] = 0x08;// func
    //len

	senddata[len++] = 0x00;
	senddata[len++] = 0x00;
	senddata[len++] = 0x00;
	senddata[len++] = 0x00;

	//time

	senddata[len++] = 0x16;

	SetTimer(1,2000,NULL);
	VARIANT   SendData   =   FormVARIANT(senddata,   len);
	if   (SendData.vt   !=   VT_EMPTY)   
	{   
          m_ctrlComm.SetOutput(SendData);   
          SafeArrayDestroy(SendData.parray);   
	} 
	if(readfile)
	{
		SetTimer(2,50,NULL);
		SetTimer(3,10,NULL);
	}
}


void CSCommTestDlg::OnAlignLeft() 
{
	// TODO: Add your control notification handler code here
	AlignmentChange(IDC_RADIO5);

}

void CSCommTestDlg::OnAlignCenter() 
{
	// TODO: Add your control notification handler code here
	AlignmentChange(IDC_RADIO6);

}

void CSCommTestDlg::OnAlignRight() 
{
	// TODO: Add your control notification handler code here
	AlignmentChange(IDC_RADIO7);

}
void CSCommTestDlg::AlignmentChange(UINT nID) 
{
	UpdateData();

	DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_TABSTOP/*|WS_BORDER*/|ES_AUTOHSCROLL;

	switch( m_nAlign)
	{
		case 1:
			dwStyle |= ES_CENTER;
			GetDlgItem(IDC_SHOW)->ModifyStyle(ES_RIGHT|ES_LEFT,ES_CENTER);
			break;
		case 2:
			dwStyle |= ES_RIGHT;
			GetDlgItem(IDC_SHOW)->ModifyStyle(ES_CENTER|ES_LEFT,ES_RIGHT);
			break;
		default:
			dwStyle |= ES_LEFT;
			GetDlgItem(IDC_SHOW)->ModifyStyle(ES_CENTER|ES_RIGHT,ES_LEFT);
			break;
	}
	GetDlgItem(IDC_SHOW)->Invalidate();
	GetDlgItem(IDC_SHOW)->SetFocus();
}

void CSCommTestDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	static int bUpdateChar = 0;

	switch (nIDEvent)
	{
	case 1:
		{
			KillTimer(1);
			MessageBox("下位机无响应!","提示",MB_OK);
			CDialog::OnTimer(nIDEvent);
			break;
		}
	case 2://///////////////////////读文件许做修改!!
		{
			KillTimer(2);
			ifstream ifs(filename);
			char ch[1000];
			memset(ch,0,1000);
			ifs.read(ch,1000);
			ifs.close();
			file2=ch;
			if(file1!=file2)
			{
				file1=file2;
				UpdateData();
				m_nType=m_nType;
				m_nShow=file1;
				UpdateData(FALSE);
				GetDlgItem(IDC_SEND)->SetFocus();
				filechange=TRUE;
				m_Winstate=m_bShow;		//保存当前窗口状态(显示还是隐藏)
				if(m_nType==0)
				{
					OnShow();			//如果隐藏让窗口显示
					Top();
				}
				bUpdateChar = 1;

			}
			SetTimer(2,500,NULL);
			break;
		}
	case 3:
		if(bUpdateChar == 1)
		{
			OnSend();
			bUpdateChar = 0;
		}
		break;
	default:
		break;
	}
}

void CSCommTestDlg::OnChangeWidth() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	CWnd *pWnd=GetDlgItem(IDC_SHOW);
	pWnd->MoveWindow(CRect(25,60,m_nWidth+6+25,m_nHeight+6+60));

}

void CSCommTestDlg::OnChangeHeight() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	CWnd *pWnd=GetDlgItem(IDC_SHOW);
	pWnd->MoveWindow(CRect(25,60,m_nWidth+6+25,m_nHeight+6+60));
}

void CSCommTestDlg::OnMaxtextShow() 
{
	// TODO: Add your control notification handler code here
	if(m_nScreen<5)
	{
		ShowCursor(FALSE);
		Top();
		UpdateData();
		CClientDC dc(GetDlgItem(IDC_SHOW));
		for(i=0;i<m_nHeight;i++)
			for(m=0;m<m_nWidth/8;m++)
			{
				xy[m_nScreen-1][i][m]=0xff;
				for(j=8*m;j<8*(m+1);j++)
					if(dc.GetPixel(j+1,i+1)!=0x00ffffff)
					xy[m_nScreen-1][i][m] &=(0xfe<<(7-(j%8)));
			}
		Down();
		ShowCursor(TRUE);
		switch (m_nScreen)
		{
		case 1:
			string1=m_nShow;
			color1=textcolor;
			alignment1=m_nAlign;
			break;
		case 2:
			string2=m_nShow;
			color2=textcolor;
			alignment2=m_nAlign;
			break;
		case 3:
			string3=m_nShow;
			color3=textcolor;
			alignment3=m_nAlign;
			break;
		case 4:
			string4=m_nShow;
			color4=textcolor;
			alignment4=m_nAlign;
			break;
		default:
			break;
		}
		if(m_nScreen<4)
		{
			m_nScreen++;
			m_cScreen.SetCurSel(m_nScreen-1);
			m_nShow=string;
			UpdateData(FALSE);
			GetDlgItem(IDC_SHOW)->SetFocus();
			::keybd_event(VK_END, 0, 0, 0);//模拟End键按下使光标移动到文字后面
		}
		else
		MessageBox("内容已经超过4幕,请检查或者直接发送!","提示",MB_OK);

	}
}

BOOL CSCommTestDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->message == WM_CHAR)
	{
		if(hanzi)
		{
			string+=(char)(pMsg->wParam);
			hanzi=FALSE;
			return CDialog::PreTranslateMessage(pMsg);
		}
		else
			string="";
		if(!((pMsg->wParam)&0x80))//不是汉字
		{
			string=(char)(pMsg->wParam);
		}
		else
		{
			hanzi=TRUE;
			string=(char)(pMsg->wParam);//是汉字
		}
	}
	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)//屏蔽Esc键
		return TRUE;

	if(pMsg->message == WM_NCLBUTTONDOWN && (int)pMsg->wParam == HTCAPTION)    ///////窗口不能被移动 
		return   TRUE;

	return CDialog::PreTranslateMessage(pMsg);
}

void CSCommTestDlg::OnLiben(WPARAM wParam,LPARAM lParam)
{
	UINT uMouseMsg;//鼠标动作
	uMouseMsg=(UINT) lParam;
	if(uMouseMsg==WM_LBUTTONDOWN)//如果是单击左键
	{
		if(m_bShow)
		{
			OnHide();
		}
		else
		{
			OnShow();
		}
	}
	if(uMouseMsg==WM_RBUTTONDOWN)//如果是单击右键
	{
		AfxGetMainWnd()->SetForegroundWindow(); //弹出Popup菜单
		CMenu menu;
		menu.LoadMenu(IDR_POPUP);
		CMenu* pPopup=menu.GetSubMenu(0);
		CPoint Point;
		GetCursorPos(&Point);
		pPopup->TrackPopupMenu(TPM_LEFTALIGN,
			Point.x,Point.y,AfxGetMainWnd(),NULL );
		AfxGetMainWnd()->PostMessage(WM_NULL, 0, 0); 
	}
}
void CSCommTestDlg::OnHide()
{
	PostMessage(WM_SYSCOMMAND,SC_MINIMIZE,NULL);
} 

void CSCommTestDlg::OnShow()
{
	PostMessage(WM_SYSCOMMAND,SC_RESTORE,NULL);
}
void CSCommTestDlg::OnExit()
{
	NOTIFYICONDATA tnid;
	tnid.cbSize=sizeof(NOTIFYICONDATA);
	tnid.hWnd=AfxGetMainWnd()->m_hWnd;
	tnid.uID=IDR_MAINFRAME; //保证删除的是我们的图标
	Shell_NotifyIcon(NIM_DELETE,&tnid);
	AfxGetMainWnd()->PostMessage(WM_CLOSE); //退出程序
}

void CSCommTestDlg::Top()
{
	CRect rcMy; 
	::GetWindowRect(m_hWnd, rcMy); //得到当前的窗口位置 
	//设为总在最前 
	SetWindowPos(&wndTopMost,rcMy.left,rcMy.top,rcMy.Size().cx,rcMy.Size().cy,SWP_SHOWWINDOW);
}
void CSCommTestDlg::Down()
{
	CRect rcMy; 
	::GetWindowRect(m_hWnd, rcMy); //得到当前的窗口位置 
	//设为总在最前 
	SetWindowPos(&wndNoTopMost, rcMy.left,  rcMy.top, rcMy.Size().cx, rcMy.Size().cy, SWP_SHOWWINDOW);
}

void CSCommTestDlg::OnChangeCommNum() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	if(m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);//关闭串口
		m_ctrlComm.SetCommPort(m_nComb1.GetCurSel()+1); //选择串口
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
	}
	else
		m_ctrlComm.SetCommPort(m_nComb1.GetCurSel()+1); //选择串口
}

void CSCommTestDlg::OnChangeBaud() 
{
	// TODO: Add your control notification handler code here
	UpdateData(); 
	if(m_ctrlComm.GetPortOpen())
	{
		m_ctrlComm.SetPortOpen(FALSE);//关闭串口
		switch(m_nComb2.GetCurSel())
		{
		case 0:
			m_ctrlComm.SetSettings("4800,n,8,1");
			break;
		case 1:
			m_ctrlComm.SetSettings("9600,n,8,1");
			break;
		case 2:
			m_ctrlComm.SetSettings("19200,n,8,1");
			break;
		case 3:
			m_ctrlComm.SetSettings("38400,n,8,1");
			break;
		default:
			break;
		}
		m_ctrlComm.SetPortOpen(TRUE);//打开串口
	}
	else
		switch(m_nComb2.GetCurSel())
		{
		case 0:
			m_ctrlComm.SetSettings("4800,n,8,1");
			break;
		case 1:
			m_ctrlComm.SetSettings("9600,n,8,1");
			break;
		case 2:
			m_ctrlComm.SetSettings("19200,n,8,1");
			break;
		case 3:
			m_ctrlComm.SetSettings("38400,n,8,1");
			break;
		default:
			break;
		}
}

void CSCommTestDlg::OnSelchangeScreen() 
{
}

HBRUSH CSCommTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(pWnd->GetDlgCtrlID()==IDC_SHOW)
	{
		pDC->SetTextColor(textcolor);
		pDC->SetBkColor(RGB(0,0,0));
		return m_brush;
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;//m_totalbrush;
}

void CSCommTestDlg::OnSelchangeTextColor() 
{
	// TODO: Add your control notification handler code here
	if(m_cTextcolor)
	{
		switch(m_cTextcolor.GetCurSel())
		{
		case 0:
			textcolor=RGB(255,0,0);
			break;
		case 1:
			textcolor=RGB(0,255,0);
			break;
		case 2:
			textcolor=RGB(255,255,0);
			break;
		default:
			break;
		}
		Invalidate();
	}
}

⌨️ 快捷键说明

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