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

📄 usbtestview.cpp

📁 使用单片机通过USB发送数据
💻 CPP
字号:
// USBTESTView.cpp : implementation of the CUSBTESTView class
//

#include "stdafx.h"
#include "USBTEST.h"

#include "USBTESTDoc.h"
#include "USBTESTView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "FTD2XX.h"
/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView

IMPLEMENT_DYNCREATE(CUSBTESTView, CView)

BEGIN_MESSAGE_MAP(CUSBTESTView, CView)
	//{{AFX_MSG_MAP(CUSBTESTView)
	ON_COMMAND(IDM_TESTUSB, OnTestusb)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView construction/destruction

CUSBTESTView::CUSBTESTView()
{
	// TODO: add construction code here
	m_lX=20;
	m_lY=60;
	m_NumFrame=0;
}

CUSBTESTView::~CUSBTESTView()
{
}

BOOL CUSBTESTView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView drawing

void CUSBTESTView::OnDraw(CDC* pDC)
{
	CUSBTESTDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	
//	CClientDC dc(this);
//	this->Invalidate();
//	this->UpdateWindow();
	CClientDC dc(this);
	CPen* pPenRed=new CPen;
	pPenRed->CreatePen(PS_SOLID,46,RGB(0,0,0));
/*	CPen* pOldPen=dc.SelectObject(pPenRed);
	dc.MoveTo(10,10);
	dc.LineTo(10,280);
	dc.LineTo(320,280);
	dc.SelectObject(pOldPen);
*/
	CPen* pOldPen=pDC->SelectObject(pPenRed);
	pDC->MoveTo(1000,-1000);
	pDC->LineTo(1000,-17000);
	pDC->LineTo(26000,-17000);

	pDC->SelectObject(pOldPen);
	delete pPenRed;
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView printing

BOOL CUSBTESTView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CUSBTESTView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CUSBTESTView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView diagnostics

#ifdef _DEBUG
void CUSBTESTView::AssertValid() const
{
	CView::AssertValid();
}

void CUSBTESTView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CUSBTESTDoc* CUSBTESTView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CUSBTESTDoc)));
	return (CUSBTESTDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CUSBTESTView message handlers

void CUSBTESTView::OnTestusb() 
{
	// TODO: Add your command handler code here
	FT_STATUS mStatus;
	TEXTMETRIC tm;
	int tHeight,tWidth;
	char str[6];
	char tmp[100],tmp1[100];
	CRect rc;
	GetClientRect(&rc);//range
	DWORD i;
	CClientDC dc(this);
	dc.GetTextMetrics(&tm);
	tHeight=tm.tmHeight;//字符高度
	tWidth=tm.tmAveCharWidth;//字符宽度
	MSG msg;
	int test=0;
	CUSBTESTDoc *mDoc=(CUSBTESTDoc*)GetDocument();
	CMainFrame* m_pMainFrm=(CMainFrame*)AfxGetMainWnd();
	DWORD dwAmountInRx,dwAmountInRet;
	CBrush br;
	br.CreateSolidBrush(dc.GetBkColor());
	CBrush *pbrOld;
	pbrOld=dc.SelectObject(&br);
	CString strSaveFileType="文本文件(*.txt)|*.txt||";
//	CFileDialog FileDlg(FALSE ,"*.txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strSaveFileType);
	CFileDialog FileDlg(FALSE ,"*.txt",NULL,OFN_HIDEREADONLY,strSaveFileType);
	CFile fileOpen;
	if(FileDlg.DoModal()==IDOK)
	{
		if(!fileOpen.Open(FileDlg.GetPathName(),CFile::modeCreate|CFile::modeWrite))
		{
			AfxMessageBox("cannot create the file to save");
			return;
		}
	}
while(1)//循环接受,等待键击退出
{	
	mStatus=FT_GetQueueStatus(mDoc->m_ftHandle,&dwAmountInRx);//查询队列中字符数
	if(dwAmountInRx==0)
	{	AfxMessageBox("no data",IDOK,0);//队列无数据,退出
		break;}
	//申请内存空间
	mDoc->m_lpData=new char[dwAmountInRx];
	mStatus=FT_Read(mDoc->m_ftHandle,(LPVOID)mDoc->m_lpData,dwAmountInRx,&dwAmountInRet);//读取队列数据
	if(mStatus!=FT_OK)
		return;
	sprintf(tmp,"当前接收队列中的字符数= %7d",dwAmountInRx);//状态栏中显示接受字符数
	m_pMainFrm->m_wndStatusBar.SetPaneText(0,tmp,TRUE);
	m_NumFrame=m_NumFrame+1;//number of loop

	//存盘文件
	sprintf(tmp1,"\n\nFrame=%d\t",m_NumFrame);
	fileOpen.Write(tmp1,strlen(tmp1));
	sprintf(tmp,"当前接收队列中的字符数= %7d\n\n",dwAmountInRx);
	fileOpen.Write(tmp,strlen(tmp));
	for(i=0;i<dwAmountInRx;i++)
	{
		itoa((int)((unsigned char)( *(mDoc->m_lpData+i))),str,10);//convert to string
		if((i%32)==0)
			sprintf(tmp,"\n%6s",str);
		else
			sprintf(tmp,"%6s",str);
		fileOpen.Write(tmp,strlen(tmp));
	}
//	fileOpen.Flush();

//	if(m_NumFrame==5)break;//exit from loop
	dc.FillRect(&rc,&br);//清屏幕
	//display
//	dc.TextOut(m_lX,m_lY,mDoc->m_lpData);//just display the character
	sprintf(tmp1,"Frame=%d",m_NumFrame);
	dc.TextOut(20,20,tmp1);

	m_lX=20;//每一轮坐标的开始
	m_lY=60;
	if(dwAmountInRx>600)
		dwAmountInRx=600;
	for(i=0;i<dwAmountInRx;i++)
	{
		
		itoa((int)((unsigned char)( *(mDoc->m_lpData+i))),str,10);//convert to string
		//	AfxMessageBox(str,IDOK,0);
		if(m_lX+(strlen(str)+4)*tWidth+10>rc.right-rc.left)
		{
			m_lY=m_lY+tHeight;
			if(m_lY+tHeight+10>rc.bottom-rc.top)
			{m_lY=60;
			//dc.FillRect(&rc,&br);
			//dc.TextOut(20,20,tmp1);
			}
			m_lX=20;
		}
		dc.TextOut(m_lX,m_lY-20,str);
		m_lX=m_lX+(4+strlen(str))*tWidth;
		

	}

	//test=test+10;
	//GetMessage(&msg,this->m_hWnd,0,0);
	PeekMessage(&msg,this->m_hWnd,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE);
	if(msg.message==WM_KEYDOWN){
		//fileOpen.Flush();
		break;}
	delete []mDoc->m_lpData;
	Sleep(400);
	//响应其他消息
	
}
	if(mDoc->m_lpData!=NULL)
		delete []mDoc->m_lpData;
	m_lX=20;
	m_lY=60;
	m_NumFrame=0;
	dc.SelectObject(pbrOld);
	fileOpen.Flush();
	fileOpen.Close();	
	FT_ResetDevice(mDoc->m_ftHandle);
	return;
}

void CUSBTESTView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
//	CView::OnPrepareDC(pDC, pInfo);
	
	int m_zoomScale=1;	
	CSize SizXY;
	char tmp[100];
	CRect rc;
	GetClientRect(&rc);
	CClientDC dc(this);
//	CUSBTESTView::OnPrepareDC(pDC, pInfo);
	pDC->SetMapMode(MM_HIMETRIC);//两个方向上放大倍数同
	
	int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
	int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
	//sprintf(tmp,"%d	%d",xLogPixPerInch,yLogPixPerInch);
	SizXY=pDC->GetWindowExt();
	sprintf(tmp,"%d	%d",rc.bottom-rc.top,rc.right-rc.left);
//	AfxMessageBox(tmp,IDOK,0);
//	pDC->LPtoDP(&rc);
//	pDC->SetWindowExt(512,512);
//	pDC->SetViewportExt( 512,512);
	//pDC->SetViewportExt(abs(rc.right-rc.left),abs(rc.bottom-rc.top));
	//pDC->SetViewportExt(10000,10000);
	//pDC->SetViewportOrg(0,0);

	GetClientRect(&rc);
	SizXY=pDC->GetWindowExt();
	//pDC->LPtoDP(&rc);
//	sprintf(tmp,"%d	%d",rc.bottom-rc.top,rc.right-rc.left);
	sprintf(tmp,"%d	%d",SizXY.cx,SizXY.cy);
//	AfxMessageBox(tmp,IDOK,0);

//	pDC->SetWindowOrg(0,SizXY.cy);
//	pDC->SetViewportOrg(0,SizXY.cy);
}

void CUSBTESTView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	CUSBTESTDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_nCurrentWidth=cx;
	pDoc->m_nCurrentHeight=cy;
	pDoc->m_nCurrentDisWidth=cx-100;
	pDoc->m_nCurrentDisHeight=cy;
}

⌨️ 快捷键说明

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