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

📄 gprreadview.cpp

📁 探地雷达文件显示程序
💻 CPP
字号:
// GprReadView.cpp : implementation of the CGprReadView class
//

#include "stdafx.h"
#include "GprRead.h"

#include "GprReadDoc.h"
#include "GprReadView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGprReadView

IMPLEMENT_DYNCREATE(CGprReadView, CView)

BEGIN_MESSAGE_MAP(CGprReadView, CView)
	//{{AFX_MSG_MAP(CGprReadView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_COLOR_DIALOG, OnColorDialog)
	ON_COMMAND(ID_VIEW_COLORBIT, OnViewColorbit)
	//}}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)
    ON_MESSAGE(WM_DOREALIZE, OnDoRealize)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGprReadView construction/destruction

CGprReadView::CGprReadView()
{
	// TODO: add construction code here
	  LPLOGPALETTE pLogPal;

pLogPal=(LPLOGPALETTE)malloc(sizeof(LOGPALETTE)+

sizeof(PALETTEENTRY)*64);

pLogPal->palVersion=0x300;

pLogPal->palNumEntries=64;

int i=0,j=0,k=0,cl=0;
int clr[4];
for(i=0;i<4;i++)
  clr[i]=i*64;


     for(i=0;i<4;i++)
		for(j=0;j<4;j++)
			for(k=0;k<4;k++)
		{
               pLogPal->palPalEntry[cl].peRed=clr[k];//-8*j-64*k); //初始化为红色

               pLogPal->palPalEntry[cl].peGreen=clr[j];

               pLogPal->palPalEntry[cl].peBlue=clr[i];

               pLogPal->palPalEntry[cl].peFlags=0;
			   cl++;
        }
	 

if(!m_Palette.CreatePalette(pLogPal))

AfxMessageBox("Can't create palette!");

   
  }

CGprReadView::~CGprReadView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGprReadView drawing

void CGprReadView::OnDraw(CDC* pDC)
{
	CGprReadDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
    
	//pDC->SetMapMode(MM_LOENGLISH);
/*	CPen m_mypen,*poldPen;
	m_mypen.CreatePen(PS_DASH,8,RGB(255,0,0));
    poldPen=pDC->SelectObject(&m_mypen);
	pDC->MoveTo(200,100);
	pDC->LineTo(200,600);
	pDC->SelectObject(poldPen);
*/


	CBrush brush,*pOldBrush;

    int x,y,i;

    pDC->SelectPalette(&m_Palette,FALSE);

     pDC->RealizePalette();

     pDC->SelectStockObject(BLACK_PEN);

     for(i=0;i<64;i++)

	 {

      x=(i%8)*16;

       y=(i/8)*16;

         brush.CreateSolidBrush(PALETTEINDEX(i)); //调色板索引引用

          pOldBrush=pDC->SelectObject(&brush);

          pDC->Rectangle(x,y,x+16,y+16);

          pDC->SelectObject(pOldBrush);

          brush.DeleteObject();

	 }


	  //	CGprReadView::DrawDisplay();


	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CGprReadView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGprReadView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGprReadView message handlers

void CGprReadView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	CGprReadDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CString FilePathname;
	CString FileName;
	CDC*pDC=GetDC();
	CFile f1;
	CFileDialog dlg( TRUE,_T("dzt"),_T("*.dzt"),
	                 OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
	                 _T("文本文件 (*.dzt)|*.dzt|"));	
 
if(IDOK==dlg.DoModal())
{   int i,j,n1;
	unsigned char c1,c2;
	FilePathname.Format("%s %s","filepath:",dlg.GetPathName());
	FileName.Format("%s %s","Old file name:",dlg.GetFileName());
	f1.Open(dlg.GetFileName(),CFile::modeRead);
// f1.Open("f:\\test5\\file2.dzt",CFile::modeRead);
	f1.Read(&rh_tag,sizeof(short));
	f1.Read(&rh_data,sizeof(short));
	f1.Read(&rh_nsamp,sizeof(short));
	f1.Read(&rh_bits,sizeof(short));
	f1.Read(&rh_zero,sizeof(short));
	f1.Read(&rh_sps,sizeof(float));
	f1.Read(&rh_spm,sizeof(float));
	f1.Read(&rh_mpm,sizeof(float));
	f1.Read(&rh_position,sizeof(float));
	f1.Read(&rh_range,sizeof(float));
	f1.Read(&rh_spp,sizeof(short));
	f1.Read(&rh_creat,sizeof(CGprReadView::SIR_rfdate));
	f1.Read(&rh_modif,sizeof(CGprReadView::SIR_rfdate));
	f1.Read(&rh_rgain,sizeof(short));
	f1.Read(&rh_nrgain,sizeof(short));
	f1.Read(&rh_text,sizeof(short));
	f1.Read(&rh_ntext,sizeof(short));
	f1.Read(&rh_proc,sizeof(short));
	f1.Read(&rh_nproc,sizeof(short));
	f1.Read(&rh_nchan,sizeof(short));
	f1.Read(&rh_epsr,sizeof(float));
	f1.Read(&rh_top,sizeof(float));
	f1.Read(&rh_depth,sizeof(float));
	f1.Read(&rh_npass,sizeof(short));
	f1.Read(&reserved,sizeof(reserved));
    f1.Read(&rh_chanmask,sizeof(short));
	f1.Read(&rh_fname,sizeof(rh_fname));
	f1.Read(&rh_chksum,sizeof(short));
	f1.Read(&variable,sizeof(variable));

	n1=(int)(rh_nchan);
//	f1.Seek(1024,CFile::begin);
	int pointnumber;
   //  pointnumber=f1.GetLength()-1024;
  pointnumber=f1.GetLength()-2048;
	f1.Seek(2048,CFile::begin);

	 if(rh_bits>10)
	 {rh_nchan=pointnumber/rh_nsamp/2;
      for (i=0;i<rh_nchan;i++)
	  {
	  for(j=0;j<rh_nsamp;j++)
		{f1.Read(&c1,1);   ///读取一个数据的前8位
        f1.Read(&c2,1);    ////////读取一个数据的后8位 
		dataa[i][j]=(double)(c2)*256.0+(double)(c1);  ///后8位为高位
		dataa[i][j]=dataa[i][j]-32896.0;}
	  }
	 }
	 
	 else 
	 {   rh_nchan=pointnumber/rh_nsamp;
     for (i=0;i<rh_nchan;i++)
	  {
	  for(j=0;j<rh_nsamp;j++)
		{f1.Read(&c1,1);   ///读取一个数据
 		dataa[i][j]=(double)(c1);  ///
		dataa[i][j]=dataa[i][j]-128.0;}
} } }

int i;
for (i=0;i<rh_nchan;i++)  ///头上两个数做归零,以便以后数据处理
{dataa[i][0]=0.0;
dataa[i][1]=0.0;}

    pDC->SetTextColor(RGB(255,0,0));
	pDC->TextOut(0,0,FileName);
	pDC->TextOut(0,20,FilePathname);
	pDC->TextOut(0,40,"文件以被打开");

	CGprReadView::GetMaxMindata();
		CString strText;
		strText.Format("The MaxData is %f,The MinData is %f,The ColorRange is %f ",MaxData,MinData,ColorRange);
        AfxMessageBox(strText);
 
 }

bool CGprReadView::DrawDisplay()
{
	CGprReadDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CDC*pDC=GetDC();
    ///文件名
pDC->TextOut(0,0,"文件名:");
pDC->TextOut(60,0,rh_fname);
    int  i,j,p1,s1,b1;
	double t1,d1,df1;
    p1=30;////纵向起点坐标////position 延时

t1=0.25;     //调用对话框中的数值,纵坐标比例尺
d1=4;  ///横坐标比例尺
df1=3; ///振幅比例
s1=0;  ///每隔多少道显示
b1=1; //从多少道开始显示

///////////坐标轴的绘制////////////
///////画时间坐标
	 pDC->MoveTo (64,p1);	
     pDC->LineTo (64,(rh_nsamp)*t1+p1);
  CString str1,str2;
   str1="时间(ns)";
  pDC->TextOut (15,(rh_nsamp*t1+p1)+10,str1);

int y_mark,y_number;
int m_step,m_p_step,m_step_mark;

y_mark=10;
y_number=10;

m_step=rh_range/y_number;
m_p_step=rh_nsamp/y_number;
m_step_mark=m_p_step/y_mark;

 char buffer[20];

 for (i=0;i<y_number;i++)
 { pDC->MoveTo (64,m_p_step*i*t1+p1);	
        pDC->LineTo (50,m_p_step*i*t1+p1);
  _itoa(i*m_step,buffer,10);
  str2=buffer;
 pDC->TextOut (35,m_p_step*i*t1+p1-7,str2); 
     for (j=1;j<y_mark;j++)
	 {
        pDC->MoveTo (64,m_p_step*i*t1+p1+m_step_mark*j*t1);	
        pDC->LineTo (58,m_p_step*i*t1+p1+m_step_mark*j*t1);
	 }
 }
 /////////////////////////////////
//////////横坐标的绘制
/* for (i=0;i<rh_nchan;i++)
 { _itoa(i,buffer,10);
    str2=buffer;
    pDC->TextOut (i*8*d1+94,p1-16,str2); 
 }
 */
/////////////////////////////////
//    画线条组成图形
/////////////////////////////////////	
   for(i=b1;i<rh_nchan;i++)
	   for(j=1;j<rh_nsamp;j++)
	   {
		  CPen m_mypen;
		  if(dataa[i][j]>MaxData)
             iColorIndex=63;
		   else if(dataa[i][j]<MinData)
             iColorIndex=63;
		  else 
		  {
			  iColorIndex=(dataa[i][j]-MinData)/ColorRange;
		  }
		   //if(iColorIndex>63)
			//   iColorIndex=iColorIndex-63;
           //iColorIndex=31-iColorIndex;
           m_mypen.CreatePen(PS_DASH,1,PALETTEINDEX(iColorIndex));
	       CPen *pOldPen;
		   pOldPen=pDC->SelectObject(&m_mypen);
           pDC->MoveTo(i,j);
           pDC->LineTo(i,j+1);
		   pDC->SelectObject(pOldPen);
	   }
 
     return 0;
}

double CGprReadView::GetMaxMindata()
{
	MinData=MaxData=dataa[0][0];
	for (int i=0;i<rh_nchan;i++)
    	for(int j=0;j<rh_nsamp;j++)

		{
			if( dataa[i][j]>MaxData) MaxData=dataa[i][j];
            if( dataa[i][j]<MinData) MinData=dataa[i][j];
		}
		MaxData=8000;
		MinData=-8000;
     ColorRange=(MaxData-MinData)/64;

	return 0;
}

LRESULT CGprReadView::OnDoRealize(WPARAM wParam, LPARAM)

{

CClientDC dc(this);

dc.SelectPalette(&m_Palette,FALSE);

if(dc.RealizePalette()) //若调色板映射被改变则刷新视图

 GetDocument()->UpdateAllViews(NULL);

return 0L;

}


void CGprReadView::OnColorDialog() 
{
	// TODO: Add your command handler code here
	CColorDialog ColorDialog;
	if(ColorDialog.DoModal()==IDOK)
	{
		COLORREF Color=ColorDialog.GetColor();

		CString strText;
		strText.Format("The Selected color was RGB(%d,%d,%d)",GetRValue(Color),GetGValue(Color),GetBValue(Color));
        AfxMessageBox(strText);
	}
	
}

void CGprReadView::OnViewColorbit() 
{
	// TODO: Add your command handler code here
		CGprReadView::DrawDisplay();
}

⌨️ 快捷键说明

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