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

📄 serialasdlg.cpp

📁 这是我仿照串口助手(龚建伟)作的一个例子并修正了其中的一些bug
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		CString str ;
		m_sSaveDir	= CString(szPath);
		m_sSaveDir.TrimRight(_T("\\"));
		GetDlgItemText(IDC_SAVEFILENAME,str);
		str = m_sSaveDir +_T("\\") + str;
		SetDlgItemText(IDC_STATICSAVEFILEPATH,str);
	}
}

//把数据写入文件
void CSerialAsDlg::WriteMyFile(CString filename)
{
//	filename.MakeLower();
	CString str;
	GetDlgItemText(IDC_RICHEDITREVDATA,str);

/*  CString strFileName,sPath;
	strFileName = filename;

	CString sFileName;
	GetDlgItemText(IDC_SAVEFILENAME,sFileName);
	sFileName.MakeLower();
	strFileName.TrimRight(sFileName);
	strFileName.TrimRight(_T("\\"));

	int index = strFileName.Find(_T('\\'),0);

	if(index == 0xffffffff)
	{
		strFileName = strFileName + _T("\\")+ sFileName;
	}
	else
	{
		CString sTemp = strFileName;
		CString sSubTemp;
		while(1)
		{
			CFileFind finder;
			int length = sTemp.GetLength();
			BOOL bFlag = finder.FindFile(sTemp);
			if(!bFlag)
			{
				CFilePro::CreateFolder(strFileName);
				break;
			}
			index = 0;
			int tempIndex = 0;
			index = str.Find(_T("\\"),0);
			if(index = 0xffffffff)
				break;
			while(index!=0xffffffff)
			{
				tempIndex = index;
				index = sTemp.Find(_T("\\"));
			}
			sSubTemp = sTemp.Right(length - tempIndex);
			sTemp.TrimRight(sSubTemp);
			sTemp.TrimRight(_T("\\"));

			index = str.Find(_T("\\"),0);
			if(index = 0xffffffff)
				break;
			index = str.Find(_T("\\"),index);
			if(index = 0xffffffff)
				break;
		}
	}*/
//	WIN32_FIND_DATA wfd;
//	HANDLE handle = ::FindFirstFile(strFileName,&wfd);
//	if(INVALID_HANDLE_VALUE==handle||wfd.dwFileAttributes&&FILE_ATTRIBUTE_DIRECTORY!=FILE_ATTRIBUTE_DIRECTORY)
//		AfxMessageBox("aaa");
	if(PathFileExists(filename))
	{
		if(!(MessageBox(_T("已经存在一个同名的文件,要覆盖吗?"),_T("提示"),MB_OKCANCEL)==IDOK))
		{
			return;
		}
	}

	DWORD len = str.GetLength();
	if(len ==0) return; 
	CFile file;
	CFileException fe;
	if(!file.Open(filename,CFile::modeCreate|CFile::modeWrite,&fe))
	{
		fe.ReportError();
		return ;
	}
	TRY
	{
	//	BYTE *pTemp = new BYTE[len];
//	pTemp = (BYTE *)str.GetBuffer(len);
	file.Write(str,len);
//	str.ReleaseBuffer();
	file.Close();
	}
	CATCH(CFileException ,e)
	{
		file.Abort(); // will not throw an exception
		e->ReportError();
		return;
	}
	END_CATCH

	MessageBox(_T("文件保存成功!"),_T("提示"),MB_OK);

}

void CSerialAsDlg::OnOK()
{

}

BOOL CSerialAsDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(pMsg->hwnd==GetDlgItem(IDC_EDITSENDPERIOD)->m_hWnd)
	{
		if(pMsg->wParam==VK_RETURN)
		{
			CString str;
			GetDlgItem(IDC_EDITSENDPERIOD)->GetWindowText(str);
			int iPeriod = atoi(str);
			if(iPeriod==0)
			{
				MessageBox(_T("请选择一个合适的周期!"),_T("提示!"),MB_ICONERROR);
				return TRUE;
			}
			if(m_bAutoSend)
			{
				KillTimer(TIME_ID_SEND);
				SetTimer(TIME_ID_SEND,iPeriod,NULL);
			}
				return TRUE;		//若为FALSE,此段代码要运行两次!!!
		}

	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CSerialAsDlg::OnChangeSavefilename() 
{
	// 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
	CString str;
	GetDlgItemText(IDC_SAVEFILENAME,str);
	if(1)
	{
		m_OldSaveFileName = str;
	}
	else
	{
		SetDlgItemText(IDC_SAVEFILENAME,m_OldSaveFileName);
		return;
	}
	str = m_sSaveDir +_T("\\") + str;
	SetDlgItemText(IDC_STATICSAVEFILEPATH,str);
}

DWORD CSerialAsDlg::GetByteRate()
{
	CString sPort;
	DWORD dwBaudRate;
	BYTE byDataBits;
	BYTE byParity;
	BYTE byStopBits;
	m_ConfigPort.GetParam(sPort,dwBaudRate,byDataBits,byParity,byStopBits);
	
	float fStopBit = 0;
	switch(byStopBits)
	{
		case 0:
			fStopBit = 1;
			break;
		case 1:
			fStopBit = 1.5;
			break;
		case 2:
			fStopBit = 2;;
			break;
		default:
			fStopBit = 1;
			break;
	}
	
	if(byParity!=0)
	{
		byParity = 1;
	}
	return (dwBaudRate/(byDataBits+fStopBit+byParity+1));
}


BOOL CSerialAsDlg::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
/*	CClientDC dc(this);
	CRect rect;
	GetClientRect(&rect);
	dc.FillRect(rect,&m_bkBrush);
	return true;*/
	return CDialog::OnEraseBkgnd(pDC);
}

HBRUSH CSerialAsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(nCtlColor==CTLCOLOR_STATIC||CTLCOLOR_SCROLLBAR  ==nCtlColor||nCtlColor==CTLCOLOR_DLG)
	{
	// TODO: Return a different brush if the default is not desired
		pDC->SetBkMode(TRANSPARENT);
		return (HBRUSH)(m_bkBrush.m_hObject);
	}
	return hbr;
}

void CSerialAsDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	if(cx==0||cy==0)
		return;
	CRect rect;
	if(m_btManualSend.m_hWnd)
	{
		m_btManualSend.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_btManualSend.MoveWindow(&rect);
	}
	if(m_staticNail.m_hWnd)
	{
		m_staticNail.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_staticNail.MoveWindow(&rect);
	}

	if(m_editSendPeriod.m_hWnd)
	{
		m_editSendPeriod.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_editSendPeriod.MoveWindow(&rect);
	}
	if(m_btStartSendFile.m_hWnd)
	{
		m_btStartSendFile.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_btStartSendFile.MoveWindow(&rect);
	}
	if(m_btSelectSendFile.m_hWnd)
	{
		m_btSelectSendFile.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_btSelectSendFile.MoveWindow(&rect);
	}
	if(m_editSendFilePath.m_hWnd)
	{
		m_editSendFilePath.GetWindowRect(&rect);
		rect.top += (cy-m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_editSendFilePath.MoveWindow(&rect);
	}
	if(m_Send.m_hWnd)
	{
		m_Send.GetWindowRect(&rect);
		rect.bottom += (cy - m_OldRect.Height());
		rect.top += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_Send.MoveWindow(&rect);
	}
	if(m_Rev.m_hWnd)
	{
		m_Rev.GetWindowRect(&rect);
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_Rev.MoveWindow(&rect);
	}
	if(m_btClearSendData.m_hWnd)
	{
		m_btClearSendData.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_btClearSendData.MoveWindow(&rect);
	}	
	if(m_btClearSendCount.m_hWnd)
	{
		m_btClearSendCount.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_btClearSendCount.MoveWindow(&rect);
	}

	if(m_editSendCount.m_hWnd)
	{
		m_editSendCount.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_editSendCount.MoveWindow(&rect);
	}	
	if(m_btHelp.m_hWnd)
	{
		m_btHelp.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_btHelp.MoveWindow(&rect);
	}
	if(m_btCancel.m_hWnd)
	{
		m_btCancel.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		rect.right += (cx - m_OldRect.Width());
		rect.left += (cx - m_OldRect.Width());
		ScreenToClient(&rect);
		m_btCancel.MoveWindow(&rect);
	}	
	if(m_checkAutoSend.m_hWnd)
	{
		m_checkAutoSend.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_checkAutoSend.MoveWindow(&rect);
	}	
	if(m_staticStrMS.m_hWnd)
	{
		m_staticStrMS.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_staticStrMS.MoveWindow(&rect);
	}	
	if(m_staticStrPeriod.m_hWnd)
	{
		m_staticStrPeriod.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_staticStrPeriod.MoveWindow(&rect);
	}	
	if(m_checkHEXSend.m_hWnd)
	{
		m_checkHEXSend.GetWindowRect(&rect);
		rect.top += (cy - m_OldRect.Height());
		rect.bottom += (cy - m_OldRect.Height());
		ScreenToClient(&rect);
		m_checkHEXSend.MoveWindow(&rect);
	}


	GetClientRect(&m_OldRect);
	
	CRect rect1;
	GetClientRect(&rect);

	if(m_StatusBar.m_hWnd)
	{
	    m_staticNail.GetWindowRect(&rect1);
		m_StatusBar.SetPaneInfo(0,ID_PORTSTATUS,SBPS_NORMAL,rect.Width()*2/5-5);
		m_StatusBar.SetPaneInfo(1,ID_COMSTATUS,SBPS_STRETCH,rect.Width()*2/5-rect1.Width());
		m_StatusBar.SetPaneInfo(2,ID_TIME,SBPS_NORMAL ,rect.Width()*1/5);		
		m_StatusBar.MoveWindow(rect.left+20,rect.bottom-rect1.Height(),rect.Width()-rect1.Width()-5,rect1.Height(),TRUE);
	}
	Invalidate();
}


void CSerialAsDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	// TODO: Add your message handler code here and/or call default
//	lpMMI->ptMinTrackSize.x = 750;
//	lpMMI->ptMinTrackSize.y = 500;
	CDialog::OnGetMinMaxInfo(lpMMI);
}

void CSerialAsDlg::OnSizing(UINT fwSide, LPRECT pRect) 
{

	CDialog::OnSizing(fwSide, pRect);
	CRect rect1,rect2;
	m_btSelectSendFile.GetWindowRect(&rect1);
	m_btCancel.GetWindowRect(&rect2);
	if((pRect->right-pRect->left)<(rect2.right-rect1.left+50))
	{
		pRect->right = pRect->left+rect2.right-rect1.left+50;
	}
	CRect rect3,rect4;
	m_btConfigPort.GetWindowRect(&rect1);
	m_editSavefileName.GetWindowRect(&rect2);
	m_checkHEXSend.GetWindowRect(&rect3);
	m_StatusBar.GetWindowRect(&rect4);

	if((pRect->bottom-pRect->top)<((rect2.bottom-rect1.top)+(rect4.bottom-rect3.top)+40))
	// TODO: Add your message handler code here
	{
		pRect->bottom = pRect->top+((rect2.bottom-rect1.top)+(rect4.bottom-rect3.top)+40);
	}
}

void CSerialAsDlg::OnStaticNail() 
{
	// TODO: Add your control notification handler code here
	static BOOL bFlag = FALSE;
	if(bFlag)
	{
		SetWindowPos(&wndNoTopMost, 0, 0, 0, 0,
			SWP_NOSIZE | SWP_NOMOVE| WS_EX_TOPMOST);
		bFlag = FALSE;
	}
	else
	{
		SetWindowPos(&wndTopMost, 0, 0, 0, 0,
			SWP_NOSIZE | SWP_NOMOVE);
		bFlag = TRUE;
	}
}

void CSerialAsDlg::OnMyhelp() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg dlgAbout;
	dlgAbout.m_bAbout = FALSE;
	dlgAbout.DoModal();
}

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(nCtlColor==CTLCOLOR_STATIC||nCtlColor==CTLCOLOR_DLG)
	{
	// TODO: Return a different brush if the default is not desired
		pDC->SetBkMode(TRANSPARENT);
		return (HBRUSH)(m_bkBrush.m_hObject);
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	CWnd *pCwnd = GetDlgItem(IDC_STATIC_MAIL);
	m_ToolTipMail.Create(this);
	m_ToolTipMail.Activate(TRUE);
	m_ToolTipMail.AddTool(pCwnd, "Email给我lxg215@hotmail.com");
	m_ToolTipMail.SetDelayTime(200);


	m_staticMail.m_link = _T("mailto:lxg215@hotmail.com");


	CString str = _T("\t\t\t\t写在前面的话");
	 str += _T("\r\n\t接触串口已经一年多了,虽然串口比较简单,可是我还不能说是很熟悉\
更不敢说精通了,为了给新接触串口的朋友一个例子,我一个直想做个关于串口的东西,所以\
就仿照了龚建伟的串口助手2.2作了一个(源代码没有仿照,其实他的源码我没看过:)),希望能对\
大家有所帮助,花了我三天呢!");
	str += _T("\r\n\t此软件修正了龚建伟的串口助手2.2的几个bug,当然也可能引进了新的bug,呵呵");

	str += _T("原来的bug和不如意的地方如下:");

	str += _T("\r\n\r\n1. 当发送端数据发送很快的时候,接收发生丢数据的情况。");
	
	str += _T("\r\n\r\n2.发送时间间隔短的时候,实际发送的数据个数和记录的不符。");
	
	str += _T("\r\n\r\n3.数据量较大的时候占用系统资源太多。");

	str += _T("\r\n\r\n4......");

	

	m_reditHelpText.SetWindowText(str);

	static CHARFORMAT cf;
	memset(&cf, 0, sizeof(CHARFORMAT));
	m_reditHelpText.GetDefaultCharFormat(cf);
	cf.dwMask		= CFM_COLOR;
	cf.dwEffects	= (unsigned long)~( CFE_AUTOCOLOR);
	cf.crTextColor	= RGB(0,128,0);
	m_reditHelpText.SetSel(0,-1);
	m_reditHelpText.SetSelectionCharFormat(cf);	
	m_reditHelpText.SetWordCharFormat(cf);
	m_bkBrush.CreateSolidBrush(DLGBK_COLOR);

	str.LoadString(IDS_TITLE);
	str = str + _T("\r|"     \
        "1.00版\t||"       \
		"最后更新\r|2005年8月\t|||||");
	TCHAR  *pArrCredit = new TCHAR[str.GetLength()];
	memcpy( pArrCredit,str.GetBuffer(str.GetLength()),str.GetLength()*sizeof(TCHAR));
	str.ReleaseBuffer();

	m_DyCredits.SubclassDlgItem(IDD_ABOUTBOX,this);
	m_DyCredits.SetCredits(pArrCredit,'|');
	m_DyCredits.SetSpeed(1);							//滚动速度(0-慢速,1-中速,2-快速)
	m_DyCredits.SetColor(BACKGROUND_COLOR, RGB(0,255,200));
	m_DyCredits.SetTransparent();
	m_DyCredits.SetGradient(GRADIENT_RIGHT_DARK);
	delete pArrCredit;
	OnButtonswitch();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	m_ToolTipMail.RelayEvent(pMsg);
	return CDialog::PreTranslateMessage(pMsg);
}

void CAboutDlg::OnButtonswitch() 
{
	// TODO: Add your control notification handler code here
	if(m_bAbout)
	{
		m_btSwitch.SetWindowText(_T("串口助手帮助"));
		m_reditHelpText.ShowWindow(SW_HIDE);		
		m_DyCredits.ShowWindow(SW_SHOW);
		m_DyCredits.StartScrolling();
		SetWindowText(_T("关于串口助手1.0"));
	}
	else
	{
		m_btSwitch.SetWindowText(_T("关于串口助手1.0"));
		m_DyCredits.EndScrolling();
		m_DyCredits.ShowWindow(SW_HIDE);
		m_reditHelpText.ShowWindow(SW_SHOW);
		SetWindowText(_T("串口助手帮助"));
	}
	m_bAbout = !m_bAbout;
}


BOOL CSerialAsDlg::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	// TODO: Add your message handler code here and/or call default
	OnMyhelp() ;
	return TRUE;
//	return CDialog::OnHelpInfo(pHelpInfo);
}

⌨️ 快捷键说明

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