📄 displaywindow.cpp
字号:
// 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 + -