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

📄 displaywindow.cpp

📁 USB接口虚拟示波器软件软件工程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DisplayWindow.cpp : implementation file
//

#include "stdafx.h"
#include "DisplayWindow.h"
#include "USBOscillograph.h"
#include "math.h"
#include "Resource.h"
#include <winioctl.h>		//TPM for CTL_CODE
//#include "ezusbsys.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.1415926
#define BULK_SIZE 512
int  xx;
//short int data[5][1520]; 

//#define W 760
#define H 20
#define ST 95
#define S 4
#define DISWIDTH  500
#define DISHEIGHT 400
#define XOFFSIZE  60
#define YOFFSIZE  60
#define Sample_Depth 1032
// DisplayWindow
CBitmap  Back;
PAGEDATA * p;

IMPLEMENT_DYNCREATE(DisplayWindow, CStatic)
static BOOL F_B,F_H,F_S,F_I,F_D,F_E,F_b,F_h,F_s,F_i,F_d,F_e;
int mouse_XB,mouse_XE;
BOOL b1_F,b2_F;

CFont  * m_font;
CFont * m_OldFont;

CUSBOscillographApp *pApp;
CRect LeftScaleRect;
CRect RightScaleRect;
CRect UpScaleRect;
CRect DownScaleRect;
static CBitmap  oldScreen_Bitmap;
static BOOL first_draw=false;
unsigned int time_div[19]={50,100,200,500,1000,2000,5000,10000,20000,
50000,100000,200000,500000,1000000,2000000,5000000/*5ms*/,10000000/*10ms*/,
20000000/*20ms*/,50000000/*50ms*/};
unsigned char addata[Sample_Depth];

DisplayWindow::DisplayWindow()
{  int i;
	EnableAutomation();
    b1_F=1;
	b2_F=1;
	page=0;
	Caiyang=0;
	RecFlag=0;
///	AfxOleLockApp();
	speed=1;
    stp=1;
	mouse_x=0;
	DrawLineFlag=0;
	pagedata=NULL;
	dis_DyRound=0;
    pagedata_start=NULL;
	Lr=0;
	Rr=0;
	tdv=13; // 1ms/div
	sampleT=1000; // ns



	hUsbInDevice = NULL; 
	m_nTriggerType=false;
	sampleFt=0.005;//20.0;  //初始化采样频率 20M
	vlots=10000.0;   //初始化Vlots/Div=10000mV 10V/Div;
	LeftBitmap.LoadBitmap (IDB_LEFTAXIS);	
	
	LeftBitmap.GetObject(sizeof(BITMAP),&leftbm);
	
	TopBitmap.LoadBitmap (IDB_TOPAXIS);
    TopBitmap.GetObject(sizeof(BITMAP),&topbm);
	
	LeftSCaleBitmap.LoadBitmap (IDB_LEFTSCALE);
    LeftSCaleBitmap.GetObject(sizeof(BITMAP),&leftscalebm);
	
	leftSit=DISHEIGHT/2;
	topSit=DISWIDTH/2;
	Select=0;
	disScaleLine=false;

	pApp = (CUSBOscillographApp *)AfxGetApp();
	m_hCursor_H = pApp->LoadStandardCursor(IDC_SIZEWE);
	m_hCursor_V = pApp->LoadStandardCursor(IDC_SIZENS);
		 
   

	
//	for(int i=0;i<1024;i++)
//		ADdata[i]=0x80;
for(i=0;i<Sample_Depth;i++)
       addata[i]=0x80;
float v;
  //  float ft=(float)(rand()%100);
///	for( i=0;i<1024;i++)
//		{v=0.3*sin(2*PI*i/ft);
	     //if(v>=0)
//			addata[i]=128+BYTE(v*128);
		

	int h=DISHEIGHT/2;

   // float v;
    for(i=0;i<128;i++)
    {   v=(float)(i/128.0);
     	ht[i]=h*v-h; 
    
     }
	for(;i<256;i++)
	{   v=(float)(i/128.0);
     	ht[i]=h*v-h; 
    
     }
	Ix=0;
	Iu=0;
}


DisplayWindow::~DisplayWindow()
{
     Kill_Theard=0;
	 Kill_Play=0;

//   if(FenXindata!=NULL)
//	 delete FenXindata;
//   AfxOleUnlockApp();
	if(m_font!=NULL)
	 m_font->DeleteObject ();
	 

}

void DisplayWindow::OnFinalRelease()
{
	
	CStatic::OnFinalRelease();
}


BEGIN_MESSAGE_MAP(DisplayWindow, CStatic)
	//{{AFX_MSG_MAP(DisplayWindow)
	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	ON_WM_NCHITTEST()
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BEGIN_DISPATCH_MAP(DisplayWindow, CStatic)
	//{{AFX_DISPATCH_MAP(DisplayWindow)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()

// Note: we add support for IID_IDisplayWindow to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the 
//  dispinterface in the .ODL file.

// {FC97F5C0-5127-11D6-A757-00055DA07630}
static const IID IID_IDisplayWindow =
{ 0xfc97f5c0, 0x5127, 0x11d6, { 0xa7, 0x57, 0x0, 0x5, 0x5d, 0xa0, 0x76, 0x30 } };

BEGIN_INTERFACE_MAP(DisplayWindow, CStatic)
	INTERFACE_PART(DisplayWindow, IID_IDisplayWindow, Dispatch)
END_INTERFACE_MAP()

// {FC97F5C1-5127-11D6-A757-00055DA07630}
IMPLEMENT_OLECREATE(DisplayWindow, "TestRo.DisplayWindow", 0xfc97f5c1, 0x5127, 0x11d6, 0xa7, 0x57, 0x0, 0x5, 0x5d, 0xa0, 0x76, 0x30)

/////////////////////////////////////////////////////////////////////////////
// DisplayWindow message handlers

BOOL DisplayWindow::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

//在显示窗口内画出表格/////////////


BOOL DisplayWindow::OnEraseBkgnd(CDC* pDC) 
{  
	
	 GetClientRect(rcClip);
	 CBrush newBrush(RGB(1,0,16));
	 pDC->FillRect(rcClip,&newBrush);
    
	return CStatic::OnEraseBkgnd(pDC);
}

void DisplayWindow::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
   	GetClientRect(rcClip);
    int top=rcClip.top;
    int left=rcClip.left; 
    
	if(!firstdiswindow)
	 {
	firstdiswindow=DrawDispBack(&dc,DISWIDTH,DISHEIGHT);
	DisRect.left=left+XOFFSIZE;
	DisRect.top=top+YOFFSIZE;
	DisRect.right=DisRect.left+DISWIDTH;
	DisRect.bottom=DisRect.top+DISHEIGHT;
	}
	if(firstdiswindow)
	{

	//CDC m_DC;
    //m_DC.CreateCompatibleDC (&dc);
	//CBitmap * pOldBitmap =m_DC.SelectObject(&oldScreen_Bitmap);
    
	
	//dc.BitBlt( DisRect.left,DisRect.top,DISWIDTH ,DISHEIGHT,&m_DC,0,0,SRCCOPY);
	//m_DC.SelectObject (pOldBitmap);
	//m_DC.DeleteDC (); 
DrawLine();
	}
    //DisVoltage(&dc,left+XOFFSIZE,top+YOFFSIZE-10,DISWIDTH,DISHEIGHT);
    //DisTimeVlem(&dc,left+XOFFSIZE-15,top+YOFFSIZE,DISWIDTH,DISHEIGHT);
	//DisLeftAxis(&dc, left+XOFFSIZE+DISWIDTH+2, top+YOFFSIZE+leftSit);
	//DisTopAxis(&dc, left+XOFFSIZE+topSit, top+YOFFSIZE);
}



void DisplayWindow::PreSubclassWindow() 
{    
	 
	 //dis_Flag=TRUE;
   
	 firstdiswindow=false;
//	 m_hCursor1 = AfxGetApp()->LoadCursor(IDC_LINE);
//	 m_hCursor2 = AfxGetApp()->LoadCursor(IDC_ZOOM);
//   SetTimer(1,10,NULL);
//   启动采集及绘制曲线线程。
  //  AfxBeginThread(DrawLine_ThreadProc,this,THREAD_PRIORITY_NORMAL);   
  //  AfxBeginThread(PlayDrawLine_ThreadProc,this,THREAD_PRIORITY_NORMAL);   
     m_font=new CFont;
     m_font->CreateFont(-12,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
	 OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
	 DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,
	 "Time Roman");
  	
	 CStatic::PreSubclassWindow();
}

BOOL DisplayWindow::DestroyWindow() 
{ 
//	KillTimer(1);
	while(pagedata_start!=NULL)
	{
     GlobalFree(pagedata_start->hHandle);
     pagedata_start=pagedata_start->next;
	}
	return CStatic::DestroyWindow();
}

void DisplayWindow::ReDraw()
{	 ps=40;
     SelectT=0;
	 DrawLineFlag=0;
    // for(int i=0;i<5;i++)
	// for(int j=0;j<1520;j++)
	//data[i][j]=0;
	 Invalidate();
   
}
//   在显示框中绘制曲线图案             。

void DisplayWindow::line(int xx)
{	
/*	CClientDC * pDC;
	pDC=new CClientDC(this);
	
	static float temp[5];
    static int frist=1;
	CPen  m_Pen_11,m_Pen_Black,m_Pen_13,m_Pen_12;
	CPen *m_OldPen_11,* m_OldPen_Black,*m_OldPen_13,*m_OldPen_12;
	int k,qi_y;
	static int h=81,hhh;
    if(frist)
	{
	for(int i=0;i<5;i++)
	{ if(i==4) 
	  temp[i]= pData->e[i]*xindian_db;
	 else 
	   temp[i]=pData->e[i]*db;
	}
	frist=0;
	} 
    
	m_Pen_Black.CreatePen(PS_SOLID,2,RGB(0,0,0));
	m_OldPen_Black=pDC->SelectObject(&m_Pen_Black);
    //画1条宽8点黑色|线擦掉原屏幕内容。
	pDC->MoveTo(xx+41,20);
	pDC->LineTo(xx+41,hh-20);
	pDC->SelectObject(m_OldPen_Black);
	if(xx==1)return;

	m_Pen_13.CreatePen(PS_SOLID,1,RGB(0,100,100));
	m_OldPen_13=pDC->SelectObject(&m_Pen_13);
   
	// 恢复表格线。      
    for(k=0;k<=20;k++)
	{//绘制方格 ——线  。
      qi_y=30*k+20;
      pDC->MoveTo(40+xx-step,qi_y);
      pDC->LineTo(40+xx,qi_y);
	}
	//  绘制方格| 线 。
    m_OldPen_13=pDC->SelectObject(&m_Pen_13);

	if(((xx+1)%38)==0)
	{
		pDC->MoveTo(xx+40,20);
		pDC->LineTo(xx+40,hh-20);
	}

/*

	if(xx%w_st==0)
	{pDC->MoveTo(Xx[int((xx)/48)],20);            
	 pDC->LineTo(Xx[int((xx)/48)],hh-20);
	}
*/
/*	m_Pen_11.CreatePen(PS_SOLID,1,RGB(0,255,0));
	m_OldPen_11=pDC->SelectObject(&m_Pen_11);
   
	m_Pen_12.CreatePen(PS_SOLID,1,RGB(255,255,64));
	//m_OldPen_12=pDC->SelectObject(&m_Pen_12);
 
	int y0,y1;
	for(int n=0;n<5;n++)
	{ 
	    y0=(int)temp[n];
	    if(n==4)
			y1=(int)(pData->e[n]*xindian_db);
	      else
		    y1=(int)(pData->e[n]*db);
	    
		  if(y0>((2*n+1)*60)) y0=(2*n+1)*60;
			 else
				 if(y0<((10-(2*n+1))*-60))y0=(10-(2*n+1))*-60;
			
			if(y1>((2*n+1)*60)) y1=(2*n+1)*60;
			 else
				 if(y1<((10-(2*n+1))*-60))y1=(10-(2*n+1))*-60;

			if(n==4)
         m_OldPen_12=pDC->SelectObject(&m_Pen_12);
	    pDC->MoveTo(40+xx-step,draw[n].y-y0);
       pDC->LineTo(40+xx,draw[n].y-y1);
		
	}  

	for(int i=0;i<5;i++)
         if(i==4)temp[i]=pData->e[i]*xindian_db;
	        else
		temp[i]=pData->e[i]*db;
	

	pDC->SelectObject(m_OldPen_12);
  	pDC->SelectObject(m_OldPen_11);
	 m_OldFont=pDC->SelectObject(m_font);
    char mes[30];
	if(RecFlag)
	wsprintf(mes,"x=%d 正在记录第%d页   ",xx,page);
	else
     wsprintf(mes,"x=%d 记录停止            ",xx);
	
	pDC->SetBkColor(RGB(0,0,0));
	pDC->SetTextColor(RGB(255,255,0));
    pDC->TextOut(ww/2+150,3,mes);
	delete pDC;
*/	
 
}

UINT DisplayWindow::OnNcHitTest(CPoint point) 
{
	return CStatic::OnNcHitTest(point);
}


void DisplayWindow::DisMes(CString mes)
{	CDC * pDC;
 	pDC=new CClientDC(this);
	//CFont   m_font;
	//CFont  * m_OldFont;
    //m_font=new CFont;
    //m_font.CreateFont(-12,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,
    //OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
    //DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,
    //"Time Roman");

	 m_OldFont=pDC->SelectObject(m_font);

	pDC->SetBkColor(RGB(0,0,0));
	pDC->SetTextColor(RGB(255,255,0));
   // wsprintf(mes,"Width=%d,Height=%d",ww-108,hh-60);
	pDC->TextOut(80,3,mes);
	 //  pDC->SelectObject(m_OldFont);
     // m_font.DeleteObject ();

delete pDC;
}

#define PT_W (( DisplayWindow *)pParam) 

//采集数据线程.

///////////////////////////////////////////////////////////
BOOL DisplayWindow::AddPage(int p)
{ /*PAGEDATA  * item=NULL;
  GLOBALHANDLE hBuffer;
  hBuffer=GlobalAlloc(GHND,sizeof(PAGEDATA));
  item=(PAGEDATA *)GlobalLock(hBuffer);
  if(item==NULL)
  {MessageBox("Memory error!");
  return FALSE;
  }
  item->page=p;
  item->Lr=Lr;
  item->Rr=Rr;
   for(int i=0;i<5;i++)
    for(int k=0;k<1520;k++)
	  item->data[i][k]=(short int)(data[i][k]);
       item->hHandle=hBuffer;
	if(pagedata==NULL)
	{ pagedata=item;
      pagedata_start=item;
	  pg=item;
      item->up=NULL;
	}
	 else 
	 {	 pagedata->next=item;
	     item->up=pagedata;
		 item->next=NULL;
	 }
	pagedata=item;
GlobalUnlock(hBuffer);*/

return TRUE;
}

void DisplayWindow::DisPageData(BOOL up_next)
{ 
 
}
/*
 int i,y0,y1;
  int h=disHight/2;
  int s_y=h;
  for(i=1;i<disWidth-1;i++)
  {  if(ad_data[i]>128)
        y0= s_y-hh[ad_data[i]]+h;
        else
          y0=s_y+s_y-hh[ad_data[i]];

⌨️ 快捷键说明

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