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

📄 comfiledlg.cpp

📁 VC网络程序设计实例导航配套代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ComFileDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ComFile.h"
#include "ComFileDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComFileDlg dialog

CComFileDlg::CComFileDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CComFileDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CComFileDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


}

CComFileDlg::~CComFileDlg()					// 析构函数
{

}

void CComFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CComFileDlg)
	DDX_Control(pDX, IDC_BOUDRATE, m_BoudRate);
	DDX_Control(pDX, IDC_EDITLOG, m_Log);
	DDX_Control(pDX, IDC_BUTTONCLOSE, m_Close);
	DDX_Control(pDX, IDC_BUTTONSEND, m_Send);
	DDX_Control(pDX, IDC_BUTTONOPEN, m_Open);
	DDX_Control(pDX, IDC_STATUS, m_Status);
	DDX_Control(pDX, IDC_COMBOPORT, m_ComboPort);
	DDX_Control(pDX, IDC_EDITFILE, m_EditFile);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CComFileDlg, CDialog)
	//{{AFX_MSG_MAP(CComFileDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTONSEND, OnButtonsend)
	ON_BN_CLICKED(IDC_BUTTONOPEN, OnButtonopen)
	ON_BN_CLICKED(IDC_BUTTONCLOSE, OnButtonclose)
	ON_BN_CLICKED(IDC_BUTTONBROWSER, OnButtonbrowser)
	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CComFileDlg message handlers

void CComFileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CComFileDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in ComFile rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CComFileDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CComFileDlg::OnInitDialog()			// 程序初始化函数
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	// 创建CSCSerial对象,初始化数据
	m_pComFile = new CSCSerial(&m_com);
	m_pData = NULL;
	m_hServerThread = NULL;

	
	// 初始化供用户选择端口的组合框,默认选择端口COM1
	m_ComboPort.AddString("COM1");
	m_ComboPort.AddString("COM2");
	m_ComboPort.AddString("COM3");
	m_ComboPort.SelectString(0, "COM1");

	// 初始化供用户选择波特率的组合框,默认选择38400   注:通讯双方波特率应该相同
	m_BoudRate.InsertString(-1, "110");
	m_BoudRate.InsertString(-1, "300");
	m_BoudRate.InsertString(-1, "600");
	m_BoudRate.InsertString(-1, "1200");
	m_BoudRate.InsertString(-1, "2400");
	m_BoudRate.InsertString(-1, "9600");
	m_BoudRate.InsertString(-1, "14400");
	m_BoudRate.InsertString(-1, "19200");
	m_BoudRate.InsertString(-1, "38400");
	m_BoudRate.InsertString(-1, "56000");
	m_BoudRate.InsertString(-1, "115200");	
	m_BoudRate.SelectString(0, "38400");

	// 根据端口是否打开设置各个按钮的状态
	BOOL bOpen = FALSE;
	m_Open.EnableWindow(!bOpen);
	m_Send.EnableWindow(bOpen);
	m_Close.EnableWindow(bOpen);

	// 显示当前状态信息
	m_Status.SetWindowText(" 端口关闭 ");

	return TRUE;  // return TRUE  unless you set the focus to a control
}


void CComFileDlg::OnCancel()			// 程序退出
{
	// 关闭端口,关闭事件对象,释放资源
	OnButtonclose();	
	delete m_pComFile;
	// 退出程序
	CDialog::OnCancel();
}


void CComFileDlg::OnButtonopen()		// 打开COM端口
{
	// 如果端口已经打开,则返回
	if(m_com.IsOpen())
		return;

	// 获取用户选择的端口号
	int nPort = m_ComboPort.GetCurSel() + 1;

	// 获取用户选择的波特率	
	int nRate;
	CString str;
	m_BoudRate.GetWindowText(str);
	nRate = atoi(str);
	if(nRate == 0)	
		nRate = 9600;

	// 尝试打开端口
	if(!m_com.Open(nPort, nRate))
	{
		m_Status.SetWindowText(" 打开端口出错!");
		return;
	}

	// 端口打开成功,显示当前状态信息
	m_Status.SetWindowText(" 端口已经打开 ");

	// 创建服务线程,监测任何到来的数据
	DWORD dwId;
	m_hServerThread = ::CreateThread(NULL, 0, ServerThreadProc, this, 0, &dwId);

	// 根据端口是否打开设置各个按钮的状态
	BOOL bOpen = TRUE;
	m_Open.EnableWindow(!bOpen);
	m_Send.EnableWindow(bOpen);
	m_Close.EnableWindow(bOpen);
}

void CComFileDlg::OnButtonclose()	// 关闭COM端口
{
	// 如果端口已经关闭,则返回
	if(!m_com.IsOpen())
		return;

	// 命令服务器线程退出
	m_bThreadExit = TRUE;

	// 等待服务器线程退出
	m_bThreadExit = TRUE;
	DWORD dwExitCode;
	int n=0;
	while(!::GetExitCodeThread(m_hServerThread, &dwExitCode) && n++ < 20)
	{
		::Sleep(100);
	}
	::TerminateThread(m_hServerThread, 0);
	::CloseHandle(m_hServerThread);
	m_hServerThread = NULL;

	// 关闭COM端口
	m_com.Close();

	// 显示当前状态信息
	m_Status.SetWindowText(" 端口关闭 ");

	// 根据端口是否打开设置各个按钮的状态
	BOOL bOpen = FALSE;
	m_Open.EnableWindow(!bOpen);
	m_Send.EnableWindow(bOpen);
	m_Close.EnableWindow(bOpen);
}

void CComFileDlg::AddLog(LPCTSTR lpszString)		// 帮助函数,用于添加日志
{
	// 将字符串lpszString添加到日志窗口中
	CString str;
	m_Log.GetWindowText(str);
	str = lpszString + str;
	m_Log.SetWindowText(str);
}

void CComFileDlg::OnClear()						// 用户清空日志
{
	m_Log.SetWindowText("");
}

void CComFileDlg::OnButtonbrowser()				// 用户浏览要埋入的文件
{
	// 打开文件浏览对话框
	CFileDialog dlg(TRUE); 
	if(dlg.DoModal() == IDCANCEL)
	{
		return;
	}
	// 记录用户选择的文件
	m_EditFile.SetWindowText(dlg.GetPathName());	
}

void CComFileDlg::OnButtonsend()					// 用户请求埋入信息
{
	// 如果端口已经关闭,则返回
	if(!m_com.IsOpen())
	{
		return;	
	}

	// 检查当前状态,如果不为空闲(IDLE),则返回
	if(m_pComFile->m_nStatus != STATUS_IDLE)
	{
		MessageBox(" 正在接收文件,不能发送!!\r\n");
		return;
	}

	// 检查用户是否输入了要埋入的文件
	CString strFileName;
	m_EditFile.GetWindowText(strFileName);
	if(strFileName.IsEmpty())
	{
		MessageBox(" 输入要发送的文件!!");
		return;
	}

	// 试图访问要埋入的文件
	if(!m_SendFile.Open(strFileName, CFile::modeRead|CFile::shareDenyWrite))
	{
		MessageBox(" 打开文件出错!!!");
		return;
	}

	m_bNeedSend = TRUE;

	// 无效发送按钮,防止禁止用户多次点击
	m_Send.EnableWindow(FALSE);
}


//----------------------------信息埋入过程-------------------------------//


BOOL CComFileDlg::Connect()					// 帮助函数,用于连接服务器
{
	BYTE command;  // 命令
	do
	{
		// 发送连接命令
		command = SendConnect();
		if(command != 0)		// 连接失败
		{
			switch(command)		// 查看失败原因
			{
			case SERIAL_INIT:			// 需要初始化,则重新连接
				{
					continue;
				}
				break;
			case SERIAL_VERIFYFAILED:	// 用户验证失败
				{
					MessageBox(" 用户验证失败,请检查读卡器!\r\n");
					AddLog(" 用户验证失败,请检查读卡器!\r\n");
				}
				break;
			default:
				{
					MessageBox(" 连接服务器失败,对方没有响应!\r\n ");
					AddLog(" 连接服务器失败,对方没有响应!\r\n ");
				}
				break;
			}
			return FALSE;
		}
		else
		{
			return TRUE;
		}
	}
	while(TRUE);

	// 不会运行到这里
	return FALSE;
}


BOOL CComFileDlg::SendFile(CFile &file, CSCSerial *pSerial)		// 帮助函数,用于发送文件
// file 为一个打开的文件对象
{
	DWORD dwTick = ::GetTickCount();	// 当前运行时间
	int n;								// 帧重发次数
	CString str;						// 临时字符串变量

	//////////////////////////////////////////////////
	// 准备发送文件

⌨️ 快捷键说明

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