Test1View.cpp
上传用户:wangdan
上传日期:2022-06-30
资源大小:739k
文件大小:24k
- // Test1View.cpp : implementation of the CTest1View class
- //
- #include "stdafx.h"
- #include "Test1.h"
- #include "Test1Doc.h"
- #include "Test1View.h"
- #include "MainFrm.h"
- #include "ControlWnd.h"
- #include "ProjectView.h"
- #include "math.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- GLfloat Databuf[ArrayOne][ArrayTwo];
- GLfloat xrof,yrof,zrof;//各坐标轴倾角
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View
- extern bool gbIsGetData;
- extern bool gbDataIsEmpty;
- IMPLEMENT_DYNCREATE(CTest1View, CView)
- BEGIN_MESSAGE_MAP(CTest1View, CView)
- //{{AFX_MSG_MAP(CTest1View)
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_SIZE()
- ON_COMMAND(IDC_TURNX, OnTurnx)
- ON_COMMAND(IDC_TURNY, OnTurny)
- ON_COMMAND(IDC_TURNZ, OnTurnz)
- ON_WM_ERASEBKGND()
- ON_COMMAND(IDC_RESUME, OnResume)
- ON_WM_MOUSEWHEEL()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_CONTEXTMENU()
- ON_WM_KILLFOCUS()
- //}}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()
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View construction/destruction
- CTest1View::CTest1View()
- {
- m_pDC = NULL;
- nWithy = 0;
- m_Prox = 60;
- m_Proy = 5;
- m_Proz = 10;
- m_First = 1;
- m_Second = 2;
- m_Third = 3;
- m_bDown = false;
- m_bIsMove = true;
- m_bGetFileSuccess = true;
- m_pFr = NULL;
- m_FileName = "data/t56a.3DSF";
- m_nMinDepth = 520.00f;
- m_nMaxDepth = 3299.875 ;
- m_bMoveSel = false;
- m_SelType = 0;
- m_Zoom = 0;
- m_xMove = m_yMove = m_zMove = 0;
- m_bLighting = false;
- }
- CTest1View::~CTest1View()
- {
- if (m_pDC)
- {
- delete m_pDC;
- m_pDC = NULL;
- }
- }
- BOOL CTest1View::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
-
- return CView::PreCreateWindow(cs);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View drawing
- void CTest1View::OnDraw(CDC* pDC)
- {
- CTest1Doc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- //清除颜色缓冲和深度缓冲
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- //用单位矩阵替换当前矩阵
- glLoadIdentity();
- //旋转角度
- glRotatef(xrof,1.0f,0.0f,0.0f);//x轴
- glRotatef(yrof,0.0f,1.0f,0.0f);//y轴
- glRotatef(zrof,0.0f,0.0f,1.0f);//z轴
-
- //选择框
- if( this->m_pFr->m_pCtrlWnd->m_bShowConsult)
- this->Draw3DRect();
- //画点
- this->PutPoint();
- //坐标系和文字
- if (this->m_pFr->m_pCtrlWnd->m_bShowCoordinate)
- {
- this->DrawLines();
- this->DrawText();
- }
- //强制绘图完成
- glFinish();
- //交换缓冲区数据
- SwapBuffers(wglGetCurrentDC());
-
- //画选中区域
- this->DrawSelArea(pDC);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View printing
- BOOL CTest1View::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // default preparation
- return DoPreparePrinting(pInfo);
- }
- void CTest1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add extra initialization before printing
- }
- void CTest1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add cleanup after printing
- }
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View diagnostics
- #ifdef _DEBUG
- void CTest1View::AssertValid() const
- {
- CView::AssertValid();
- }
- void CTest1View::Dump(CDumpContext& dc) const
- {
- CView::Dump(dc);
- }
- CTest1Doc* CTest1View::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTest1Doc)));
- return (CTest1Doc*)m_pDocument;
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CTest1View message handlers
- int CTest1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- return 0;
- }
- //在此释放OpenGL使用的设备环境
- void CTest1View::OnDestroy()
- {
- CView::OnDestroy();
- HGLRC hrc;
-
- hrc = ::wglGetCurrentContext();
-
- ::wglMakeCurrent(NULL, NULL);
-
- if (hrc)
- ::wglDeleteContext(hrc);
- }
- //设置视口
- void CTest1View::OnSize(UINT nType, int cx, int cy)
- {
- CView::OnSize(nType, cx, cy);
- SetViewPort(cx,cy);
- }
- void CTest1View::SetViewPort(int cx, int cy)
- {
- this->m_xRect = cx;
- this->m_yRect = cy;
- //避免除数为0
- if(m_yRect==0)
- m_yRect=1;
- glViewport(0,0,m_xRect,m_yRect);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if(m_xRect>=m_yRect)
- {
- glOrtho(-20.0,20.0,-20.0*(GLfloat)m_yRect/(GLfloat)m_xRect, 20.0*(GLfloat)m_yRect/(GLfloat)m_xRect,-50.0,50.0);
- }
- else
- {
- glOrtho(-20.0*(GLfloat)m_xRect/(GLfloat)m_yRect,20.0*(GLfloat)m_xRect/(GLfloat)m_yRect,-20.0,20.0,-50.0,50.0);
- }
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- //从文件中读取数据
- bool CTest1View::GetFileData(CString filename)
- {
- ::gbIsGetData = true;
- ::gbDataIsEmpty = true;
- ::SendMessage(this->m_pFr->m_pCtrlWnd->m_hWnd,MESSAGE_DISABLEBTN,0,0);
- this->ZeroArray();
- this->m_pFr->InvalidateAllWnd();//Invalidate();
- FILE *stream;
- GLfloat Num;
- if( (stream = fopen( filename, "r+t" )) != NULL )
- {
- int n = 0,m = 0;
- for (int i=0; i<ArrayOne; i++)
- {
- if (n == 0 || n == 200)
- {
- m ++;
- ::SendMessage(this->m_pFr->m_hWnd,MESSAGE_STEPPRO,m,0);
- n = 0;
- }
- n++;
- for(int j=0; j<ArrayTwo; j++)
- {
- fscanf(stream,"%f",&Num);
- Databuf[i][j]=Num;
- }
- }
- fclose( stream );
- ::gbIsGetData = false;
- m_bGetFileSuccess = true;
- ::gbDataIsEmpty = false;
- ::SendMessage(this->m_pFr->m_pCtrlWnd->m_hWnd,MESSAGE_ENABLEBTN,0,0);
- ::SendMessage(this->m_pFr->m_pCtrlWnd->m_hWnd,MESSAGE_GETDATAFINISHED,0,0);
- }
- else
- m_bGetFileSuccess = false;
- return m_bGetFileSuccess;
- }
- //设置适于OpenGL使用的像素格式
- bool CTest1View::bSetPixelFormat()
- {
- //定义一种像素格式
- static PIXELFORMATDESCRIPTOR pfd =
- {
- sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
- 1, // version number
- PFD_DRAW_TO_WINDOW |// support window
- PFD_SUPPORT_OPENGL | // support OpenGL 支持OpenGL
- PFD_DOUBLEBUFFER, // double buffered 支持又缓冲
- PFD_TYPE_RGBA, // RGBA type使用RGBA模式,不用调色板
- 24, // 24-bit color depth 使用24位真彩色
- 0, 0, 0, 0, 0, 0, // color bits ignored
- 0, // no alpha buffer
- 0, // shift bit ignored
- 0, // no accumulation buffer
- 0, 0, 0, 0, // accum bits ignored
- 32, // 32-bit z-buffer 32位Z轴缓冲
- 0, // no stencil buffer
- 0, // no auxiliary buffer
- PFD_MAIN_PLANE, // main layer
- 0, // reserved
- 0, 0, 0 // layer masks ignored
- };
- int pixelformat;
-
- //如果可以得到指定的
- if ( (pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == FALSE )
- {
- AfxMessageBox("ChoosePixelFormat failed");
- return false;
- }
-
- //用上面取到的格式设置设备环境
- if (SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd) == FALSE)
- {
- AfxMessageBox("SetPixelFormat failed");
- return false;
- }
- return true;
- }
- //初始化OpenGL环境
- void CTest1View::IniOpenGL()
- {
- m_pDC = new CClientDC(this);
- PIXELFORMATDESCRIPTOR pfd;
- int n;
- //定义一个绘制上下文的句柄
- HGLRC hrc;
-
- //初始化过程中主要就是初始化了一个客户区的设备环境指针
- ASSERT(m_pDC != NULL);
-
- //建立应用所需的像素格式,并与当前设备上下文相关连
- if (!bSetPixelFormat())
- return;
-
- //得到指定设备环境的象素模式索引
- n = ::GetPixelFormat(m_pDC->GetSafeHdc());
-
- //根据上面得到的索引值来声明一个象素模式
- ::DescribePixelFormat(m_pDC->GetSafeHdc(), n, sizeof(pfd), &pfd);
-
- //创建一个上下文设备环境
- hrc = wglCreateContext(m_pDC->GetSafeHdc());
-
- //将刚生成的设备上下文指针设为当前环境
- wglMakeCurrent(m_pDC->GetSafeHdc(), hrc);
-
- //置黑背景
- glClearColor(0.0,0.0,0.0,0.0);
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glShadeModel(GL_SMOOTH);
-
- // 设置混色函数取得半透明效果
- glBlendFunc(GL_SRC_ALPHA,GL_ONE);
- glEnable(GL_BLEND);
-
- //平滑线条
- glEnable (GL_LINE_SMOOTH);
- glEnable (GL_BLEND);
-
- //初始化反走样为 RGBA 模式,同时包括 alpha 混合、提示的设置
- // glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- // glEnable (GL_BLEND);
-
- // 真正精细的透视修正
- // glHint (GL_POLYGON_SMOOTH_HINT|GL_LINE_SMOOTH_HINT, GL_NICEST);
-
- //充许深度测试
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
- }
- //设为绕X轴旋转
- void CTest1View::OnTurnx()
- {
- nWithy = 0;
- CButton *btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNX);
- btn->SetCheck(1);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNY);
- btn->SetCheck(0);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNZ);
- btn->SetCheck(0);
- }
- //设为绕Y轴旋转
- void CTest1View::OnTurny()
- {
- nWithy = 1;
- CButton *btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNX);
- btn->SetCheck(0);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNY);
- btn->SetCheck(1);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNZ);
- btn->SetCheck(0);
- }
- //设为绕Z轴旋转
- void CTest1View::OnTurnz()
- {
- nWithy = 2;
- CButton *btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNX);
- btn->SetCheck(0);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNY);
- btn->SetCheck(0);
- btn = (CButton*)this->m_pFr->m_pCtrlWnd->GetDlgItem(IDC_RADIOTURNZ);
- btn->SetCheck(1);
- }
- //不重画背景
- BOOL CTest1View::OnEraseBkgnd(CDC* pDC)
- {
- return TRUE;
- }
- void CTest1View::OnResume()
- {
- xrof = 0;
- yrof = 0;
- zrof = 0;
- m_Prox = 60;
- m_Proy = 5;
- m_Proz = 10;
- this->m_pFr->InvalidateAllWnd();
- }
- //处理鼠标滚轴消息
- BOOL CTest1View::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
- {
- if (this->m_bIsMove)
- {
- switch (nWithy)
- {
- case 0:
- {
- xrof -= zDelta/20;
- if (xrof > -360 || xrof < 360)
- xrof = ::xrof;
- else
- xrof = (int)xrof%360;
- }
- break;
- case 1:
- {
- yrof -= zDelta/20;
- if (yrof >= -360 || yrof < 360)
- yrof = ::yrof;
- else
- yrof = (int)yrof%360;
- }
- break;
- case 2:
- {
- zrof -= zDelta/20;
- if (zrof >=-360 || zrof< 360)
- zrof = ::zrof;
- else
- zrof = (int)zrof%360;
- }
- break;
- default:
- break;
- }
- ::SendMessage(this->m_pFr->m_pProView->m_hWnd, MESSAGE_ANGLECHANGING, 0, 0);
- this->Invalidate();
- }
- return CView::OnMouseWheel(nFlags, zDelta, pt);
- }
- //画坐标系
- void CTest1View::DrawLines()
- {
- //Draw Lines
- glBegin(GL_LINES);
- //X
- glColor3f(0.0f,1.0f,0.0f);
- glVertex3f(-10.0f-m_Zoom,0.0f,0.0f);
- glVertex3f(10.0f+m_Zoom,0.0f,0.0f);
-
- //Arrow
- glVertex3f(9.60f+m_Zoom,0.3f,0.0f);
- glVertex3f(10.0f+m_Zoom,0.0f,0.0f);
- glVertex3f(9.60f+m_Zoom,-0.3f,0.0f);
- glVertex3f(10.0f+m_Zoom,0.0f,0.0f);
-
- glVertex3f(9.60f+m_Zoom,0.0f,0.3f);
- glVertex3f(10.0f+m_Zoom,0.0f,0.0f);
- glVertex3f(9.60f+m_Zoom,0.0f,-0.3f);
- glVertex3f(10.0f+m_Zoom,0.0f,0.0f);
- //Y
- glColor3f(1.0f,0.0f,0.0f);
- glVertex3f(0.0f,-10.0f-m_Zoom,0.0f);
- glVertex3f(0.0f,10.0f+m_Zoom,0.0f);
- //Arrow
- glVertex3f(-0.3f,9.6f+m_Zoom,0.0f);
- glVertex3f(0.0f,10.0f+m_Zoom,0.0f);
- glVertex3f(0.3f,9.6F+m_Zoom,0.0f);
- glVertex3f(0.0f,10.0f+m_Zoom,0.0f);
-
- glVertex3f(0.0f,9.6f+m_Zoom,-0.3f);
- glVertex3f(0.0f,10.0f+m_Zoom,0.0f);
- glVertex3f(0.0f,9.6F+m_Zoom,0.3f);
- glVertex3f(0.0f,10.0f+m_Zoom,0.0f);
-
- //Z
- glColor3f(0.0f,0.0f,1.0f);
- glVertex3f(0.0f,0.0f,-10.0f-m_Zoom);
- glVertex3f(0.0f,0.0f,10.0f+m_Zoom);
- //Arrow
- glVertex3f(0.3f,0.0f,9.60f+m_Zoom);
- glVertex3f(0.0f,0.0f,10.0f+m_Zoom);
- glVertex3f(-0.3f,0.0f,9.60f+m_Zoom);
- glVertex3f(0.0f,0.0f,10.0f+m_Zoom);
-
- glVertex3f(0.0f,0.3f,9.60f+m_Zoom);
- glVertex3f(0.0f,0.0f,10.0f+m_Zoom);
- glVertex3f(0.0f,-0.3f,9.60f+m_Zoom);
- glVertex3f(0.0f,0.0f,10.0f+m_Zoom);
- glEnd();
-
- glBegin(GL_POINTS);
- glColor3f(1.0f, 1.0f, 1.0f);
- glVertex3f(6.5f,0.0f,0.0f);
- glVertex3f(-6.5f,0.0f,0.0f);
- glVertex3f(0.0f,6.5f,0.0f);
- glVertex3f(0.0f,-6.5f,0.0f);
- glVertex3f(0.0f,0.0f,6.5f);
- glVertex3f(0.0f,0.0f,-6.5f);
- glEnd();
- }
- //画点
- void CTest1View::PutPoint()
- {
- if (::gbIsGetData)
- return;
-
- if (::gbDataIsEmpty)
- return;
- //为了将点移到坐标中间向各个方向平移坐标系
- glTranslatef(-5.0f/*-m_Zoom*/,0.0f,0.0f);
- glTranslatef(0.0f,-5.0f-2*m_Zoom,0.0f);
- glTranslatef(0.0f,0.0f,-22.0f-2*m_Zoom);
-
- //Put Points
- glBegin(GL_POINTS);
- for (int i=0; i<ArrayOne; i++)
- {
- glColor3f((GLfloat)Databuf[i][m_First]/(GLfloat)625.0,
- (GLfloat)Databuf[i][m_Second]/(GLfloat)48.0,
- 0.0);
- if ((GLfloat)Databuf[i][0] >= this->m_nMinDepth && (GLfloat)Databuf[i][0] <= this->m_nMaxDepth )
- glVertex3f((GLfloat)(Databuf[i][m_First]/(m_Prox-m_Zoom)),
- (GLfloat)(Databuf[i][m_Second]/(m_Proy-m_Zoom)),
- (GLfloat)(Databuf[i][m_Third]*(m_Proz+m_Zoom)));
- }
- glEnd();
-
- //将坐标系移回原点
- glTranslatef(5.0f/*+m_Zoom*/,0.0f,0.0f);
- glTranslatef(0.0f,5.0f+2*m_Zoom,0.0f);
- glTranslatef(0.0f,0.0f,22.0f+2*m_Zoom);
- }
- //将取到的数据进行重新排序,当前系统中没有调用该函数
- void CTest1View::ResortData()
- {
- //重排声波
- GLfloat t;
- for(int j=0;j<ArrayOne; j++)
- {
- for (int i=0; i<ArrayOne;i++)
- {
- if (Databuf[i][1]>Databuf[i+1][1])
- {
- t = Databuf[i][1];
- Databuf[i][1] = Databuf[i+1][1];
- Databuf[i+1][1] = t;
- }
- }
- }
- //重排中子
- for( j=0;j<ArrayOne; j++)
- {
- for (int i=0; i<ArrayOne;i++)
- {
- if (Databuf[i][2]>Databuf[i+1][2])
- {
- t = Databuf[i][2];
- Databuf[i][2] = Databuf[i+1][2];
- Databuf[i+1][2] = t;
- }
- }
- }
- //重排密度
- for( j=0;j<ArrayOne; j++)
- {
- for (int i=0; i<ArrayOne;i++)
- {
- if (Databuf[i][3]>Databuf[i+1][3])
- {
- t = Databuf[i][3];
- Databuf[i][3] = Databuf[i+1][3];
- Databuf[i+1][3] = t;
- }
- }
- }
- }
- void CTest1View::OnLButtonDown(UINT nFlags, CPoint point)
- {
- this->m_bDown = true;
-
- this->m_xM = point.x;
- this->m_yM = point.y;
- m_MouseDown = point;
- CView::OnLButtonDown(nFlags, point);
- }
- void CTest1View::OnLButtonUp(UINT nFlags, CPoint point)
- {
- this->m_bDown = false;
- CRect rect = m_SelRect;
-
- rect.left = rect.left+5;
- rect.top = rect.top+64;
- rect.bottom = rect.bottom+62;
- //将选中的区域做成位图
- m_hBmp = CopySelArearToBitmap(rect);
- ::SendMessage(this->m_pFr->m_pProView->m_hWnd,MESSAGE_BMPHASBECOPIED,0,0);
- CView::OnLButtonUp(nFlags, point);
- }
- void CTest1View::OnMouseMove(UINT nFlags, CPoint point)
- {
-
- if (!m_bDown)
- return;
- m_MouseMove = point;
-
- if (!this->IsMouseInWndRect(point))
- this->m_bDown = false;
-
- if (this->m_bIsMove )
- {
- m_bMoveSel = false;
-
- //设置一个范围,保证能正常的上下或左右转动坐标系5个像素
- if (this->m_yM - point.y > 5 || this->m_yM - point.y < -5)
- ::xrof = xrof - (this->m_yM - point.y)/20;
- if (::xrof >=-360 || ::xrof< 360)
- ::xrof = ::xrof;
- else
- ::xrof = (int)::xrof%360;
- if ( this->m_xM - point.x > 5 || this->m_xM - point.x < -5 )
- ::yrof = yrof - (this->m_xM - point.x)/20;
- if (::yrof > -360 || ::yrof< 360)
- ::yrof = ::yrof;
- else
- ::yrof = (int)::yrof%360;
-
- ::SendMessage(this->m_pFr->m_pProView->m_hWnd, MESSAGE_ANGLECHANGING, 0, 0);
- this->Invalidate();
- }
- else
- {
- m_bMoveSel = true;
- m_SelRect = CRect(m_MouseDown, m_MouseMove);
- this->Invalidate();
- }
- CView::OnMouseMove(nFlags, point);
- }
- void CTest1View::ZeroArray()
- {
- for (int i=0; i<ArrayTwo; i++)
- for (int j=0; j<ArrayOne; j++)
- Databuf[i][j] = 0;
- }
- UINT CTest1View::ReadFile(LPVOID lp)
- {
- CTest1View *pThis = (CTest1View*)lp;
- pThis->GetFileData(pThis->m_FileName);
- return 0L;
- }
- void CTest1View::OnInitialUpdate()
- {
- CView::OnInitialUpdate();
- m_pFr = (CMainFrame*)AfxGetApp()->m_pMainWnd;
- this->IniOpenGL();
- //启动加载数据的线程
- // AfxBeginThread(CTest1View::ReadFile,this);
- }
- //判断当前鼠标是否在客户区中
- bool CTest1View::IsMouseInWndRect(CPoint point)
- {
- bool bInWnd = true;
- if ( point.x <= 10 || point.x >= this->m_xRect-10 || point.y <= 10 || point.y >= this->m_yRect-10 )
- bInWnd = false;
- return bInWnd;
- }
- GLfloat CTest1View::GetMaxDepth()
- {
- GLfloat glfMaxDepth = 0.0f;
- glfMaxDepth = Databuf[0][0];
- for(int i=0; i<ArrayOne; i++)
- {
- if (Databuf[i][0] >= glfMaxDepth)
- {
- glfMaxDepth = Databuf[i][0];
- }
- else
- NULL;
- }
- return glfMaxDepth;
- }
- GLfloat CTest1View::GetMinDepth()
- {
- GLfloat glfMinDepth = 0.0f;
- glfMinDepth = Databuf[0][0];
-
- for(int i=0; i<ArrayOne; i++)
- {
- if (Databuf[i][0] <= glfMinDepth)
- {
- glfMinDepth = Databuf[i][0];
- }
- else
- NULL;
- }
- return glfMinDepth;
- }
- void CTest1View::DrawSelArea(CDC *pDC)
- {
- if (this->m_bMoveSel)
- {
- if (this->m_SelType == 0)
- {
- pDC->Draw3dRect(this->m_SelRect,BLUE,BLUE);
- //pDC->InvertRect(this->m_SelRect);
- }
- if (this->m_SelType == 1)
- pDC->Ellipse(this->m_SelRect);
- }
- }
- void CTest1View::DrawText()
- {
- glPushMatrix();
-
- glColor3f(1.0f,1.0f,1.0f);
-
- wglUseFontBitmaps(wglGetCurrentDC(),0,255,100);
-
- glListBase(100);
- glRasterPos3f(10.20f+m_Zoom,-0.5f,0.0f);
- glCallLists(2,GL_UNSIGNED_BYTE,_T("+x"));
-
- glRasterPos3f(-0.5,10.2f+m_Zoom,0.0f);
- glCallLists(2,GL_UNSIGNED_BYTE,_T("+y"));
-
- glRasterPos3f(-0.5,0.0f,10.2f+m_Zoom);
- glCallLists(2,GL_UNSIGNED_BYTE,_T("+z"));
-
- glRasterPos3f(0.0,0.0f,0.0f);
- glCallLists(6,GL_UNSIGNED_BYTE,_T("Center"));
-
- glPopMatrix();
- }
- //画参照立方体
- void CTest1View::Draw3DRect()
- {
- //特别注意该函数
- glColor3f(1.0f,1.0f,1.0f);
- //加入光照
- glEnable (GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glPushMatrix ();
- //设置立方体大小
- auxWireCube(13.0+m_Zoom);
- //取消光照
- if (!m_bLighting)
- {
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT0);
- }
- //将当前矩阵出栈
- glPopMatrix ();
- }
- void CTest1View::OnContextMenu(CWnd* pWnd, CPoint point)
- {
-
- CMenu m_XpMenu;
- //电话本
- m_XpMenu.LoadMenu(IDR_MYMENU);
- CMenu *psub = (CMenu *)m_XpMenu.GetSubMenu(0);
- psub->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
- m_XpMenu.DestroyMenu();
- }
- //lpRect 代表选定区域
- HBITMAP CTest1View::CopySelArearToBitmap(LPRECT lpRect)
- {
- HDC hScrDC, hMemDC;
- // 屏幕和内存设备描述表
- HBITMAP hBitmap, hOldBitmap;
- // 位图句柄
- int nX, nY, nX2, nY2;
- // 选定区域坐标
- int nWidth, nHeight;
- // 位图宽度和高度
- int xScrn, yScrn;
- // 屏幕分辨率
- // 确保选定区域不为空矩形
- if (IsRectEmpty(lpRect))
- return NULL;
- //为屏幕创建设备描述表
- hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
- //为屏幕设备描述表创建兼容的内存设备描述表
- hMemDC = CreateCompatibleDC(hScrDC);
- // 获得选定区域坐标
- nX = lpRect->left;
- nY = lpRect->top;
- nX2 = lpRect->right;
- nY2 = lpRect->bottom;
- // 获得屏幕分辨率
- xScrn = GetDeviceCaps(hScrDC, HORZRES);
- yScrn = GetDeviceCaps(hScrDC, VERTRES);
- //确保选定区域是可见的
- if (nX < 0)
- nX = 0;
- if (nY < 0)
- nY = 0;
- if (nX2 > xScrn)
- nX2 = xScrn;
- if (nY2 > yScrn)
- nY2 = yScrn;
- nWidth = (nX2 - nX);
- nHeight = (nY2 - nY);
- //创建一个与屏幕设备描述表兼容的位图
- hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
- //把新位图选到内存设备描述表中
- hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
- // 把屏幕设备描述表拷贝到内存设备描述表中
- BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);
- //得到屏幕位图的句柄
- hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
- //清除
- DeleteDC(hScrDC);
- DeleteDC(hMemDC);
- // 返回位图句柄
- return hBitmap;
- }
- //将选中区域保存成位图
- BOOL CTest1View::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
- {
- //lpFileName 为位图文件名
- HDC hDC;
- //设备描述表
- int iBits;
- //当前显示分辨率下每个像素所占字节数
- WORD wBitCount;
- //位图中每个像素所占字节数
- //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
- DWORD dwPaletteSize=0, dwBmBitsSize, dwDIBSize, dwWritten;
- BITMAP Bitmap;
- //位图属性结构
- BITMAPFILEHEADER bmfHdr;
- //位图文件头结构
- BITMAPINFOHEADER bi;
- //位图信息头结构
- LPBITMAPINFOHEADER lpbi;
- //指向位图信息头结构
- HANDLE fh, hDib, hPal,hOldPal=NULL;
- //定义文件,分配内存句柄,调色板句柄
- //计算位图文件每个像素所占字节数
- hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
- iBits = GetDeviceCaps(hDC, BITSPIXEL) *
- GetDeviceCaps(hDC, PLANES);
- DeleteDC(hDC);
- if (iBits <= 1)
- wBitCount = 1;
- else if (iBits <= 4)
- wBitCount = 4;
- else if (iBits <= 8)
- wBitCount = 8;
- else if (iBits <= 24)
- wBitCount = 24;
- //计算调色板大小
- if (wBitCount <= 8)
- dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
- //设置位图信息头结构
- GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
- bi.biSize = sizeof(BITMAPINFOHEADER);
- bi.biWidth = Bitmap.bmWidth;
- bi.biHeight = Bitmap.bmHeight;
- bi.biPlanes = 1;
- bi.biBitCount = wBitCount;
- bi.biCompression = BI_RGB;
- bi.biSizeImage = 0;
- bi.biXPelsPerMeter = 0;
- bi.biYPelsPerMeter = 0;
- bi.biClrUsed = 0;
- bi.biClrImportant = 0;
-
- dwBmBitsSize = ((Bitmap.bmWidth *
- wBitCount+31)/32)* 4
- *Bitmap.bmHeight ;
- //为位图内容分配内存
- hDib = GlobalAlloc(GHND,dwBmBitsSize+
- dwPaletteSize+sizeof(BITMAPINFOHEADER));
- lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
- *lpbi = bi;
- // 处理调色板
- hPal = GetStockObject(DEFAULT_PALETTE);
- if (hPal)
- {
- hDC = ::GetDC(NULL);
- hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
- RealizePalette(hDC);
- }
- // 获取该调色板下新的像素值
- GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
- (LPSTR)lpbi + sizeof(BITMAPINFOHEADER) +dwPaletteSize,
- (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
- //恢复调色板
- if (hOldPal)
- {
- SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
- RealizePalette(hDC);
- ::ReleaseDC(NULL, hDC);
- }
- //创建位图文件
- fh = CreateFile(lpFileName, GENERIC_WRITE,
- 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
- if (fh == INVALID_HANDLE_VALUE)
- return FALSE;
- // 设置位图文件头
- bmfHdr.bfType = 0x4D42; // "BM"
- dwDIBSize = sizeof(BITMAPFILEHEADER)
- + sizeof(BITMAPINFOHEADER)
- + dwPaletteSize + dwBmBitsSize;
- bmfHdr.bfSize = dwDIBSize;
- bmfHdr.bfReserved1 = 0;
- bmfHdr.bfReserved2 = 0;
- bmfHdr.bfOffBits = (DWORD)sizeof
- (BITMAPFILEHEADER)
- + (DWORD)sizeof(BITMAPINFOHEADER)
- + dwPaletteSize;
- // 写入位图文件头
- WriteFile(fh, (LPSTR)&bmfHdr, sizeof
- (BITMAPFILEHEADER), &dwWritten, NULL);
- // 写入位图文件其余内容
- WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
- &dwWritten, NULL);
- //清除
- GlobalUnlock(hDib);
- GlobalFree(hDib);
- CloseHandle(fh);
- return TRUE;
- }
- void CTest1View::OnKillFocus(CWnd* pNewWnd)
- {
- CView::OnKillFocus(pNewWnd);
- this->m_bDown = false;
- }
- GLfloat CTest1View::GetMidXPoint()
- {
- GLfloat glMid,glMin,glMax;
- glMax = glMin = glMid =Databuf[0][1];
-
- for(int i=0; i<ArrayOne; i++)
- {
- if (Databuf[i][1] > glMax)
- glMax = Databuf[i][1];
- if (Databuf[i][1] < glMin)
- glMin = Databuf[i][1];
- }
- if (glMax < 0.0f)
- glMax = -glMax;
- if (glMin > 0.0f)
- glMin = -glMin;
- return (glMax + glMin)/2;
- }
- GLfloat CTest1View::GetMidYPoint()
- {
- GLfloat glMid,glMin,glMax;
- glMax = glMin = glMid =Databuf[0][2];
-
- for(int i=0; i<ArrayOne; i++)
- {
- if (Databuf[i][2] > glMax)
- glMax = Databuf[i][2];
- if (Databuf[i][2] < glMin)
- glMin = Databuf[i][2];
- }
- if (glMax < 0.0f)
- glMax = -glMax;
- if (glMin > 0.0f)
- glMin = -glMin;
- return (glMax + glMin)/2;
- }
- GLfloat CTest1View::GetMidZPoint()
- {
- GLfloat glMid,glMin,glMax;
- glMax = glMin = glMid =Databuf[0][3];
-
- for(int i=0; i<ArrayOne; i++)
- {
- if (Databuf[i][3] > glMax)
- glMax = Databuf[i][3];
- if (Databuf[i][3] < glMin)
- glMin = Databuf[i][3];
- }
- if (glMax < 0.0f)
- glMax = -glMax;
- if (glMin > 0.0f)
- glMin = -glMin;
- return (glMax + glMin)/2;
- }
- bool CTest1View::IsMouseinSelRect(CRect rect,CPoint point)
- {
- bool bIn = false;
- int cx = point.x;
- int cy = point.y;
- if (cx >= rect.left && cx <= rect.right && cy >= rect.top && cy <= rect.bottom)
- bIn = true;
- return bIn;
- }