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

📄 mainfrm.cpp

📁 VC6 多线程的串口操作
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Terminal.h"
//#include "c:\program files\microsoft visual studio\vc98\mfc\src\afximpl.h"
//#include "direct.h"
#include "MainFrm.h"
#include "TerminalDoc.h"
#include "TerminalView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_HELP_REGEDIT, OnHelpRegedit)
	ON_COMMAND(ID_HELP_SENDDATA, OnHelpSenddata)
	ON_UPDATE_COMMAND_UI(ID_HELP_SENDDATA, OnUpdateHelpSenddata)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_PROGRESS,  //SEPARATOR, 
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
	//ID_SEPARATOR,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	if((m_hPostMsgEvent=CreateEvent(NULL,FALSE,TRUE,NULL))==NULL)
		return ;

}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
/*
	CImageList img;
	if(!img.Create(IDR_MAINFRAME,16,0,RGB(128,128,128))){
		TRACE0("Failed to load hot images\n");
		return -1;
	}
	m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
	img.Detach();
*/
	if(!m_wndStatusBarMy.Create(this) ||
		!m_wndStatusBarMy.SetIndicators(indicators,
		sizeof(indicators)/sizeof(UINT))){
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable

	//文本标签 Start
	//m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()| CBRS_GRIPPER | 
	//	CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

	for(int i = 0; i < m_wndToolBar.GetCount(); i++){ 
		UINT id = m_wndToolBar.GetItemID(i);
		CString s;
		if(!s.LoadString(id)) continue;
		int j = s.Find(_T('\n'));
		if(j < 0) continue;
		s = s.Right(s.GetLength() - j - 1);
		m_wndToolBar.SetButtonText(i,s); 
	} 
	CRect rect;
	m_wndToolBar.GetItemRect(0,&rect);
	m_wndToolBar.SetSizes(rect.Size(),CSize(16,15));
	//文本标签 End
/*
	NOTIFYICONDATA tnd;
	tnd.cbSize=sizeof(NOTIFYICONDATA);
	tnd.hWnd=this->m_hWnd;
	tnd.uID=IDR_MAINFRAME;
	tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	//tnd.uCallbackMessage=WM_LIBEN;
	tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(tnd.szTip,"提示信息");
	Shell_NotifyIcon(NIM_ADD,&tnd);
*/
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	m_wndStatusBarMy.CreateProgressCtrl(1);
	m_wndStatusBarMy.m_Progress.SetRange(0,200);
	m_wndStatusBarMy.m_Progress.SetPos(0);
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	//cs.style =WS_POPUP;//使主窗口不可见
	//cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers




void CMainFrame::OnHelpRegedit() 
{
	// TODO: Add your command handler code here
/*	
	CView* ptv=GetActiveView();
	CTerminalApp *pW=(CTerminalApp*)AfxGetApp();
	CString str,str1;
	ptv->GetWindowText(str);
	
	str+="CurrentDrive=";
	str+=pW->GetCurrentDrive();
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(10);
	
	str+="m_pszAppName=";
	str+=pW->m_pszAppName;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(20);
	str+="m_lpCmdLine=";
	str+=pW->m_lpCmdLine;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(50);
	str+="m_pszExeName=";
	str+=pW->m_pszExeName;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(80);
	str+="m_pszProfileName=";
	str+=pW->m_pszProfileName;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(110);
	str+="m_pszRegistryKey=";
	str+=pW->m_pszRegistryKey;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(140);
	str+="m_pszHelpFilePath=";
	str+=pW->m_pszHelpFilePath;
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(170);
	str+="m_strCommDataFileName=";
	str+=::GetCommDataFileName();
	str+="\r\n";
	m_wndStatusBarMy.m_Progress.SetPos(200);
	ptv->SetWindowText(str);
	m_wndStatusBarMy.m_Progress.SetPos(0);
*/
}
//IMPLEMENT_DYNCREATE(CMyStatusBar,CStatusBar)
BEGIN_MESSAGE_MAP(CMyStatusBar,CStatusBar)
ON_WM_SIZE()
END_MESSAGE_MAP()
BOOL CMyStatusBar::CreateProgressCtrl(int nPane)
{
	if(m_Progress.GetSafeHwnd())
		return FALSE;
	SetPaneInfo(nPane,GetItemID(nPane),SBPS_NORMAL,200);
	CRect rect(0,0,1,1);
	if(!m_Progress.Create(WS_VISIBLE |WS_CHILD ,rect,this,
		ID_INDICATOR_PROGRESS)) // _SEPARATOR
		return FALSE;
	m_nProgressPane=nPane;
	SetPaneStyle(1,GetPaneStyle(0));
	return TRUE;
}
void CMyStatusBar::OnSize(UINT nType,int cx,int cy)
{
	CStatusBar::OnSize(nType,cx,cy);
	if(m_Progress.GetSafeHwnd()==NULL)
		return;
	CRect rect;
	GetItemRect(m_nProgressPane,&rect);
	m_Progress.MoveWindow(rect);
}

void CMainFrame::OnHelpSenddata() 
{
	CWinThread *m_pThread;
	m_pThread=AfxBeginThread(SendData,this,THREAD_PRIORITY_NORMAL,
			0,CREATE_SUSPENDED,NULL);
	if(m_pThread==NULL){
		return ;
	}
	else{
		m_pThread->ResumeThread();
	}
/*
	// TODO: Add your command handler code here
	//CMainFrame* pFrame=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	CTerminalView* pView=(CTerminalView*)GetActiveView();
	CTerminalDoc* pDoc=(CTerminalDoc*)pView->GetDocument();//pFrame->GetActiveDocument();
	if(!pDoc->m_bConnected)
		return;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,
		"Text files(*.txt)|*.txt|All files(*.*)|*.*|Word documents(*.doc)|*.doc||",
		NULL);
	//m_wndStatusBarMy.SetPaneStyle(1,WS_VISIBLE);
	if(fdlg.DoModal()==IDOK){
		CString str=_T("");
		CFile cf;
		cf.Open(fdlg.GetPathName(),CFile::modeRead);
		CArchive ar(&cf,CArchive::load,4096,NULL);
		TCHAR buf[2048];//CArchive::store
		int nCount=0;
		DWORD dwFileSize=::GetFileSize((HANDLE)ar.GetFile()->m_hFile,NULL);
		int nn=0;
		while((nCount=ar.Read(buf,128))){
			if((nCount=pDoc->WriteComm(buf,nCount))==0){
				AfxMessageBox("serial port error!");
				break;
				//continue;
			}
			nn+=nCount;
			m_wndStatusBarMy.SetPaneText(0,"Sending Data");
			m_wndStatusBarMy.m_Progress.SetPos(nn*200/dwFileSize);
			if(pDoc->m_bEcho){
				pView->GetWindowText(str);
				//if(nCount<2048)
					for(int i=0;i<nCount;i++)
						str+=buf[i];
				//else
					//str+=buf;
				pView->SetWindowText(str);
				//edit.ReplaceSel(str);
			}
			//str=_T("");
		}
		ar.Close();
		cf.Close();
	}
	m_wndStatusBarMy.SetPaneText(0,"Ready");
	m_wndStatusBarMy.m_Progress.SetPos(0);
	//m_wndStatusBarMy.SetPaneStyle(1,m_wndStatusBarMy.GetPaneStyle(0));
*/
}

void CMainFrame::OnUpdateHelpSenddata(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CTerminalDoc* pDoc=(CTerminalDoc*)GetActiveDocument();
	pCmdUI->Enable(pDoc->m_bConnected);
}

UINT SendData(LPVOID pParam)
{
	CMainFrame* pFrame=(CMainFrame*)pParam;
	CTerminalView* pView=(CTerminalView*)pFrame->GetActiveView();
	CTerminalDoc* pDoc=(CTerminalDoc*)pView->GetDocument();//pFrame->GetActiveDocument();
	if(!pDoc->m_bConnected)
		return 1;
	CFileDialog fdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,
		"Text files(*.txt)|*.txt|All files(*.*)|*.*|Word documents(*.doc)|*.doc||",
		NULL);
			//WaitForSingleObject(pFrame->m_hPostMsgEvent,INFINITE);
			//ResetEvent(pFrame->m_hPostMsgEvent);
	//m_wndStatusBarMy.SetPaneStyle(1,WS_VISIBLE);
	if(fdlg.DoModal()==IDOK){
		CString str=_T("");
		CFile cf;
		cf.Open(fdlg.GetPathName(),CFile::modeRead);
		CArchive ar(&cf,CArchive::load,4096,NULL);
		TCHAR buf[2048];//CArchive::store
		int nCount=0;
		DWORD dwFileSize=::GetFileSize((HANDLE)ar.GetFile()->m_hFile,NULL);
		int nn=0;
		WaitForSingleObject(pFrame->m_hPostMsgEvent,INFINITE);
		while((nCount=ar.Read(buf,128))){
			if((nCount=pDoc->WriteComm(buf,nCount))==0){
				AfxMessageBox("serial port error!");
				break;
				//continue;
			}
			nn+=nCount;
			//pFrame->m_wndStatusBarMy.SetPaneText(0,"Sending Data");
			pFrame->m_wndStatusBarMy.m_Progress.SetPos(nn*200/dwFileSize);
			if(pDoc->m_bEcho){
				pView->GetWindowText(str);
				//if(nCount<2048)
					for(int i=0;i<nCount;i++)
						str+=buf[i];
				//else
					//str+=buf;
				pView->SetWindowText(str);
				//edit.ReplaceSel(str);
			}
			//str=_T("");
		}
		ar.Close();
		cf.Close();
	}
	SetEvent(pFrame->m_hPostMsgEvent);
	//pFrame->m_wndStatusBarMy.SetPaneText(0,"Ready");
	pFrame->m_wndStatusBarMy.m_Progress.SetPos(0);
	//m_wndStatusBarMy.SetPaneStyle(1,m_wndStatusBarMy.GetPaneStyle(0));
	return 0;
}

⌨️ 快捷键说明

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