MFC+OpenGL

//
#include "stdafx.h"
#include "Seer.h"
#include "MainFrm.h"
#include "SeerDoc.h"
#include "SeerView.h"

#include "CoordinateAxis.h"

#include <math.h>

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

#pragma warning(disable:4244)

GLfloat ambientLight[] = { 0.3f, 0.3f,0.3f, 1.0f };
GLfloat diffuseLight[] = { 0.7f, 0.7f,0.7f, 1.0f };
GLfloat lightPos[] = {-50.0f, 50.0f,100.0f, 1.0f };


/
// CSeerView

IMPLEMENT_DYNCREATE(CSeerView, CView)

BEGIN_MESSAGE_MAP(CSeerView, CView)
	// System Message
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_SIZE()
	ON_WM_TIMER()
	ON_WM_ERASEBKGND()
	ON_WM_PAINT()
	// Hardware Operation
	ON_WM_MOUSEMOVE()
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	// Menu Command
	ON_COMMAND(ID_SELECT, OnSelect)
	ON_UPDATE_COMMAND_UI(ID_SELECT, OnUpdateSelect)
	ON_COMMAND(ID_PAN, OnPan)
	ON_COMMAND(ID_ROTATE, OnRotate)
	ON_UPDATE_COMMAND_UI(ID_PAN, OnUpdatePan)
	ON_UPDATE_COMMAND_UI(ID_ROTATE, OnUpdateRotate)
	ON_COMMAND(ID_X_VIEW, OnXView)
	ON_COMMAND(ID_Y_VIEW, OnYView)
	ON_COMMAND(ID_Z_VIEW, OnZView)
	ON_COMMAND(ID_FREE_VIEW, OnFreeView)
	ON_UPDATE_COMMAND_UI(ID_X_VIEW, OnUpdateXView)
	ON_UPDATE_COMMAND_UI(ID_Y_VIEW, OnUpdateYView)
	ON_UPDATE_COMMAND_UI(ID_Z_VIEW, OnUpdateZView)
	ON_UPDATE_COMMAND_UI(ID_FREE_VIEW, OnUpdateFreeView)
	//
	ON_COMMAND(ID_ORTHO, OnOrtho)
	ON_UPDATE_COMMAND_UI(ID_ORTHO, OnUpdateOrtho)
	ON_COMMAND(ID_PERSPECTIVE, OnPerspective)
	ON_UPDATE_COMMAND_UI(ID_PERSPECTIVE, OnUpdatePerspective)

	ON_COMMAND(ID_SHOW_COORDINATE_AXIS, OnShowCoordinateAxis)
	ON_UPDATE_COMMAND_UI(ID_SHOW_COORDINATE_AXIS, OnUpdateShowCoordinateAxis)
	ON_WM_SETCURSOR()


	// 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_WM_MOUSEWHEEL()
	ON_COMMAND(ID_SETTING_MESH, &CSeerView::OnMesh)
END_MESSAGE_MAP()

/
// CSeerView construction/destruction

CSeerView::CSeerView()
{
	m_hGLContext	= NULL;
	m_GLPixelIndex	= 0;
    m_OperaMode		= SELECT;
	m_ViewMode		= FREE_VIEW;
	m_bShowAxis		= TRUE;
	m_RotateAxis	= AXIS_Z;
	m_ObserveMode	= PERSPECTIVE;
	m_xEyeCoord = 10.0;
	m_yEyeCoord = 10.0;
	m_zEyeCoord = 10.0;
	m_OrthoDis = 10.0;//
	m_PerspectiveiDis = 10.0;//
	m_LineWidth	= 0.05;
	m_XYPlane = FALSE;
	m_YZPlane = FALSE;
	m_XZPlane = FALSE;
}

CSeerView::~CSeerView()
{
}

BOOL CSeerView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
	return CView::PreCreateWindow(cs);
}

/
// CSeerView drawing

void CSeerView::OnDraw(CDC* pDC)
{
	CSeerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
}

/
// CSeerView printing

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

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

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

/
// CSeerView diagnostics

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

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

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

/
// CSeerView message handlers

BOOL CSeerView::SetWindowPixelFormat(HDC hDC)
{
	PIXELFORMATDESCRIPTOR pixelDesc;

	pixelDesc.nSize		= sizeof(PIXELFORMATDESCRIPTOR);
	pixelDesc.nVersion	= 1;

	pixelDesc.dwFlags	=PFD_DRAW_TO_WINDOW | 
						 PFD_SUPPORT_OPENGL |
	     				 PFD_STEREO_DONTCARE|
		    			 PFD_DOUBLEBUFFER;

	pixelDesc.iPixelType		= PFD_TYPE_RGBA;
	pixelDesc.cColorBits		= 32;
	pixelDesc.cRedBits		= 8;
	pixelDesc.cRedShift		= 16;
	pixelDesc.cGreenBits		=8;
	pixelDesc.cGreenShift		=8;
	pixelDesc.cBlueBits		= 8;
	pixelDesc.cBlueShift		= 0;
	pixelDesc.cAlphaBits		= 0;
	pixelDesc.cAlphaShift		= 0;
	pixelDesc.cAccumBits		= 64;	
	pixelDesc.cAccumRedBits		= 16;
	pixelDesc.cAccumGreenBits	= 16;
	pixelDesc.cAccumBlueBits	= 16;
	pixelDesc.cAccumAlphaBits	= 0;
	pixelDesc.cDepthBits		= 32;
	pixelDesc.cStencilBits		= 8;
	pixelDesc.cAuxBuffers		= 0;
	pixelDesc.iLayerType		= PFD_MAIN_PLANE;
	pixelDesc.bReserved		= 0;
	pixelDesc.dwLayerMask		= 0;
	pixelDesc.dwVisibleMask		= 0;
	pixelDesc.dwDamageMask		= 0;

	m_GLPixelIndex = ChoosePixelFormat( hDC, &pixelDesc);
	if ( m_GLPixelIndex == 0 )
	{
		m_GLPixelIndex = 1;	
		if ( DescribePixelFormat(hDC, m_GLPixelIndex, sizeof(PIXELFORMATDESCRIPTOR), &pixelDesc) == 0 )
		{
			return FALSE;
		}
	}

	if ( SetPixelFormat( hDC, m_GLPixelIndex, &pixelDesc) == FALSE )
	{
		return FALSE;
	}

	return TRUE;
}


int CSeerView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	HWND hWnd = GetSafeHwnd();
	HDC hDC = ::GetDC(hWnd);

	if (SetWindowPixelFormat(hDC)==FALSE)
		return 0;
	
	if (CreateViewGLContext(hDC)==FALSE)
		return 0;
	
	SetTimer(0,100,NULL);
	return 0;
}

BOOL CSeerView::CreateViewGLContext(HDC hDC)
{
	m_hGLContext = wglCreateContext(hDC);
	if (m_hGLContext == NULL)
		return FALSE;

	if ( wglMakeCurrent(hDC, m_hGLContext) == FALSE )
		return FALSE;

	return TRUE;
}

void CSeerView::OnDestroy() 
{
	if( wglGetCurrentContext() != NULL )  wglMakeCurrent(NULL, NULL) ;
	
	if ( m_hGLContext !=NULL )
	{
		wglDeleteContext(m_hGLContext);
		m_hGLContext = NULL;
	}

	CView::OnDestroy(); 
}

void CSeerView::OnSize(UINT nType, int cx, int cy) 
{
//	CView::OnSize(nType, cx, cy);

	/*
	this->ShowWindow(SW_MAXIMIZE);
	CWnd *psheet = this->GetWindow(GW_CHILD);//m_messageSheet是resultview的唯一顶层子窗口
	if(psheet != NULL){
	CRect rect;
	this->GetWindowRect(&rect);
	psheet->ScreenToClient(&rect);
	psheet->SetWindowPos(NULL, 0, 0, rect.Width() , rect.Height() ,
	SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
	CWnd *ptab = this->m_sheet.GetTabControl();
	if(ptab != NULL){
	ptab->ScreenToClient(&rect);
	ptab->SetWindowPos(NULL, 0, 0, rect.Width(), rect.Height(),
	SWP_NOZORDER | SWP_NOACTIVATE);

	//让PropertySheet自动调整page的大小
	this->m_sheet.SetActivePage(this->m_sheet.GetActiveIndex());
	}
	}
*/

	GLdouble aspect;
	m_ClientWidth = cx;
	m_ClientHeight = cy;
	
	if( cy == 0 )
		aspect = (GLdouble)m_ClientWidth;
	else
		aspect = (GLdouble)m_ClientWidth / (GLdouble)m_ClientHeight;
    
	m_WHRatio = aspect;

	glViewport(0, 0, m_ClientWidth, m_ClientHeight);
    InitOpenGL();
}

void CSeerView::OnTimer(UINT nIDEvent) 
{
	CView::OnTimer(nIDEvent);
}

BOOL CSeerView::OnEraseBkgnd(CDC* pDC) 
{
	return FALSE;
}

- Operation Mode -/
void CSeerView::OnPan() 
{
	m_OperaMode = PAN;
}

void CSeerView::OnUpdatePan(CCmdUI* pCmdUI) 
{
	// Pan在Perspective和Ortho,以及所有Perspective下所有视角模式下都开启
	pCmdUI->SetCheck( m_OperaMode == PAN );      
}

void CSeerView::OnRotate() 
{  
	m_OperaMode = ROTATE;
}

void CSeerView::OnUpdateRotate(CCmdUI* pCmdUI) 
{
	// Rotate只在Perspective:Free-View视角模式下开启
	pCmdUI->Enable( m_ObserveMode==PERSPECTIVE && m_ViewMode==FREE_VIEW );
	pCmdUI->SetCheck( m_OperaMode==ROTATE && m_ViewMode==FREE_VIEW &&  m_ObserveMode==PERSPECTIVE );
}

void CSeerView::OnSelect() 
{
	m_OperaMode = SELECT;
}

void CSeerView::OnUpdateSelect(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck( m_OperaMode == SELECT );
	//pCmdUI->Enable(m_ViewMode==FREE_VIEW);
}
//

void CSeerView::OnMouseMove(UINT nFlags, CPoint point) 
{
	DisplayWorldCoord(point);
	if( nFlags == MK_LBUTTON )
	{
		float dx;
		float dy;

		if( m_ObserveMode == ORTHO )
		{
			dx = (point.x - m_OldPoint.x) * 2 * m_OrthoDis * m_WHRatio/ m_ClientWidth;
			dy = (point.y - m_OldPoint.y) * 2 * m_OrthoDis / m_ClientHeight;
		}
		else // if( m_ObserveMode == PERSPECTIVE )
		{
			dx = (point.x - m_OldPoint.x) * m_PerspectiveiDis * m_WHRatio/ m_ClientWidth;
			dy = (point.y - m_OldPoint.y) * m_PerspectiveiDis / m_ClientHeight;
		}
		//dx = (point.x - m_OldPoint.x) / 100.0;
		//dy = (point.y - m_OldPoint.y) / 100.0;
		
		switch(m_OperaMode)
		{
		case PAN:
			// Pan
			//m_Camera.Move( dx/100.0, -dy/100.0, 0);
			m_Camera.Move( dx, -dy, 0);
			break;        
		  
		case ROTATE:
			// Rotate
			// 非自由模式禁用转动
			if( m_ViewMode == FREE_VIEW ) m_Scene.RotateRoundAxis( dx, m_RotateAxis);
			break;
		}

		m_OldPoint = point;
		Invalidate();
	}

	CView::OnMouseMove(nFlags, point);
}

BOOL CSeerView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
	float extent = 0.0;
	BOOL mark = zDelta>0? 1:-1;

	if( nFlags == MK_CONTROL ) extent = 0.1f * mark;
	else  extent = 1.0f * mark;

	// 四种视图都会做相同的事情
	if( m_OperaMode == PAN &&  m_ObserveMode == PERSPECTIVE ) m_Camera.Move(0, 0, extent);

	// Ortho模式改变距离大小,目前只开放Z-View视图
	if(  m_ObserveMode == ORTHO )
	{
		m_OrthoDis += extent;
		if( m_OrthoDis <= 1.0 ) m_OrthoDis = 1.0;
	}

	Invalidate();
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}

void CSeerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	//if( nChar == VK_TAB && m_OperaMode == ROTATE ) 
	//	m_RotateAxis = (m_RotateAxis+1) % 3;
	//if( m_OperaMode == PAN )
	//{
	//	if( nChar == VK_DOWN ) m_Camera.Move( 0.0,-0.1, 0);
	//	if( nChar == VK_UP ) m_Camera.Move( 0.0, 0.1, 0);
	//	Invalidate();
	//}

	switch(nChar)
	{
	case VK_UP:
		if( m_OperaMode == PAN ) m_Camera.Move( 0.0, 0.1, 0);
		Invalidate();
		break;

	case VK_DOWN:
		if( m_OperaMode == PAN ) m_Camera.Move( 0.0,-0.1, 0);
		Invalidate();
		break;

	case VK_LEFT:
		if( m_OperaMode == PAN ) m_Camera.Move(-0.1, 0.0, 0);
		Invalidate();
		break;

	case VK_RIGHT:
		if( m_OperaMode == PAN ) m_Camera.Move( 0.1, 0.0, 0);
		Invalidate();
		break;

	case VK_TAB:
		if( nChar == VK_TAB && m_OperaMode == ROTATE ) m_RotateAxis = (m_RotateAxis+1) % 3;
		break;

	default:
		break;
	}

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CSeerView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	m_OldPoint = point;
	
	UINT xPos = point.x;// horizontal position of cursor 
	WORD yPos = point.y;// vertical position of cursor 

	// Render in selection mode and display results
	/*if(m_bSelection == TRUE)
	{
		ProcessSelection(xPos, yPos);
	}*/

	CView::OnLButtonDown(nFlags, point);
}

void CSeerView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	m_OldPoint = point;
	
	HCURSOR hCursor = NULL;
    CWinApp *cWinApp = AfxGetApp ();
	
    if(m_OperaMode == PAN)
	{
		hCursor = cWinApp->LoadCursor (IDC_CUR_ZOOM);
		::SetCursor(hCursor);
	}

	CView::OnRButtonDown(nFlags, point);
}



void CSeerView::OnPaint() 
{
	CPaintDC dc(this);
	
	glLoadIdentity();
    
	glClearColor(0.0,0.0,0.0,1);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	SetObserveMode();
	SetViewMode();
	SetMesh();

	// drawing the coodinate axis.
    if(m_bShowAxis)
	{
		glDisable(GL_DEPTH_TEST);       
		CCoordinateAxis(2,2,2).Display();
    	glEnable(GL_DEPTH_TEST);
	}
   
	RenderScene();

	SwapBuffers(dc.m_ps.hdc);
}

void CSeerView::OnOrtho()   
{
	m_ObserveMode = ORTHO;
	m_Scene.m_TransferMatrix.EMatrix();
	m_Camera.m_TransferMatrix.EMatrix();
	// 缺省设置,目前只开放此项
	m_ViewMode = Z_VIEW;
	m_OperaMode = PAN;
	Invalidate();
}

void CSeerView::OnPerspective() 
{
	m_ObserveMode = PERSPECTIVE;
	Invalidate();
}

void CSeerView::OnUpdateOrtho(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck( m_ObserveMode == ORTHO );
}

void CSeerView::OnUpdatePerspective(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck( m_ObserveMode == PERSPECTIVE );
}

void CSeerView::InitOpenGL()
{
	// initialization of OpenGL
	glLineWidth(m_LineWidth);
	glEnable(GL_LINE_SMOOTH);

	glFrontFace(GL_CW);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_FRONT);

	glEnable(GL_LIGHTING);
	glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
	glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
	glEnable(GL_LIGHT0);

	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);

	glDepthFunc(GL_LESS);
	glEnable(GL_DEPTH_TEST);
    
	glEnable(GL_NORMALIZE);
}

void CSeerView::OnXView() 
{    
	m_ViewMode = X_VIEW;
	if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
	m_Scene.m_TransferMatrix.EMatrix();
	m_Camera.m_TransferMatrix.EMatrix();
	Invalidate();
}

void CSeerView::OnYView() 
{
	m_ViewMode = Y_VIEW;
	if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
	m_Scene.m_TransferMatrix.EMatrix();
	m_Camera.m_TransferMatrix.EMatrix();
	Invalidate();
}

void CSeerView::OnZView() 
{
	m_ViewMode = Z_VIEW;
	if( m_OperaMode == ROTATE ) m_OperaMode = SELECT;
	m_Scene.m_TransferMatrix.EMatrix();
	m_Camera.m_TransferMatrix.EMatrix();
    Invalidate();	
}

void CSeerView::OnFreeView() 
{
	m_ViewMode = FREE_VIEW;
	m_Scene.m_TransferMatrix.EMatrix();
	m_Camera.m_TransferMatrix.EMatrix();
    Invalidate();
}

void CSeerView::OnShowCoordinateAxis() 
{
	m_bShowAxis = !m_bShowAxis;
	Invalidate();
}


void CSeerView::OnUpdateXView(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
	pCmdUI->SetCheck( m_ViewMode == X_VIEW && m_ObserveMode == PERSPECTIVE );
}

void CSeerView::OnUpdateYView(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
	pCmdUI->SetCheck( m_ViewMode == Y_VIEW && m_ObserveMode == PERSPECTIVE );
}

void CSeerView::OnUpdateZView(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
	pCmdUI->SetCheck( m_ViewMode == Z_VIEW && m_ObserveMode == PERSPECTIVE );
}

void CSeerView::OnUpdateFreeView(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( m_ObserveMode == PERSPECTIVE );
	pCmdUI->SetCheck( m_ViewMode == FREE_VIEW && m_ObserveMode == PERSPECTIVE );
}

void CSeerView::SetViewMode()
{
	glMatrixMode(GL_MODELVIEW);	
	
	m_Camera.Apply();
	switch(m_ViewMode)
	{
	case X_VIEW:
		gluLookAt(10,0,0,0,0,0,0,0,1);
		break;

	case Y_VIEW:
		gluLookAt(0,10,0,0,0,0,0,0,1);
		break;
	
	case Z_VIEW:
		gluLookAt(0,0,10,0,0,0,0,1,0);
		break;
	
	case FREE_VIEW:
		// 初始化视角angle
		gluLookAt(m_xEyeCoord,m_yEyeCoord,m_zEyeCoord, 0,0,0, 0,0,1);
		break;
	}
	m_Scene.Apply();
	
}

void CSeerView::SetObserveMode()
{
	if( m_ObserveMode == PERSPECTIVE )
	{
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		gluPerspective(45, m_WHRatio, 1, 1000);
		glMatrixMode(GL_MODELVIEW);
	}
	else if( m_ObserveMode == ORTHO )
	{
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho( -m_WHRatio*m_OrthoDis, m_WHRatio*m_OrthoDis, -m_OrthoDis, m_OrthoDis, -100, 100);
		glMatrixMode(GL_MODELVIEW);
	}
	else
	{
		// TODO:观察模式发生错误
	}
}

void CSeerView::OnUpdateShowCoordinateAxis(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowAxis);
}

void CSeerView::ProcessPlanet(GLuint *pSelectBuff)
{
	int id,count;
	char cMessage[64];

	// How many names on the name stack
	count = pSelectBuff[0];

	// Bottom of the name stack
	id = pSelectBuff[3];
}


// Process the selection, which is triggered by a right mouse
// click at (xPos, yPos).
#define BUFFER_LENGTH 64
void CSeerView::ProcessSelection(int xPos, int yPos)
{
	// Space for selection buffer
	GLuint selectBuff[BUFFER_LENGTH];

	// Hit counter and viewport storeage
	GLint hits, viewport[4];

	// Setup selection buffer
	glSelectBuffer(BUFFER_LENGTH, selectBuff);
	
	// Get the viewport
	glGetIntegerv(GL_VIEWPORT, viewport);

	// Switch to projection and save the matrix
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();

	// Change render mode
	glRenderMode(GL_SELECT);

	// Establish new clipping volume to be unit cube around
	// mouse cursor point (xPos, yPos) and extending two pixels
	// in the vertical and horzontal direction
	glLoadIdentity();

	// Since OpenGL measures
	// window coordinates starting at the bottom of the window, and Windows
	// measures starting at the top, we need to account for this by
	// subtracting the y coordinate from the height of the window. This has
	// the effect of reversing the coordinate system (y starts at top)
	
	gluPickMatrix(xPos, viewport[3] - yPos, 2,2, viewport);

	// Apply perspective matrix 
	gluPerspective(45.0f, m_WHRatio, 1.0, 425.0);

	// Draw the scene
	RenderScene();

	// Collect the hits
	hits = glRenderMode(GL_RENDER);

	// If a single hit occured, display the info.
	if(hits == 1)
		ProcessPlanet(selectBuff);

	// Restore the projection matrix
	glMatrixMode(GL_PROJECTION);
	glPopMatrix();

	// Go back to modelview for normal rendering
	glMatrixMode(GL_MODELVIEW);

}

BOOL CSeerView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if(nHitTest != HTCLIENT) 
	{
		return CView::OnSetCursor(pWnd, nHitTest, message);
	}

	HCURSOR hCursor = NULL;
	CWinApp *cWinApp = AfxGetApp();

	switch(m_OperaMode) 
	{
	case ROTATE:
		hCursor = LoadCursor(NULL, IDC_SIZEWE);
		break;

	case PAN:
		hCursor = LoadCursor(NULL, IDC_SIZEALL);
		break;	

	case SELECT:
		hCursor = LoadCursor(NULL, IDC_HAND);
		break;

	default:
		hCursor = LoadCursor(NULL, IDC_HAND);
		break;
	}
	//DWORD error = GetLastError();
	if( hCursor ) SetCursor(hCursor);

	return TRUE;
}

void CSeerView::DisplayWorldCoord(CPoint point)
{
	// Display the world coordinates on the status bar

	char buf[80];
	float x = point.x;
	float y = point.y; 
		
	CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
	ASSERT(pFrame);
	CStatusBar* pStatus = &pFrame->m_wndStatusBar;
	ASSERT(pStatus);
	
	sprintf(buf, "(X=%5.2f,Y=%5.2f) / OrthoDist=%5.2f", x, y, m_OrthoDis);
	pStatus->SetPaneText(1, buf, TRUE);

//	memset(buf, 0, 80);
//	sprintf(buf, "Width/Height=%5.2f\n", m_WHRatio);
//	pStatus->SetPaneText(2, buf, TRUE);
	
	pStatus->Invalidate();
}

void CSeerView::RenderScene()
{
	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();

	glInitNames();
	glPushName(0);

	glColor3ub(255, 255, 255);


	//
	// Archievement: Draw the Bridge
	// Author: HanXiong
	// Time: 2013.9.8
	//
	//
	
	glPushMatrix();

	glBegin(GL_QUAD_STRIP);
	glColor3f(1.0f, 0.0f, 0.0f);
	glVertex3f(-0.5f, 0.5f, 0.5f);
	glVertex3f(-0.5f, -0.5f, 0.5f);
	glVertex3f(0.5f, 0.5f, 0.5f);
	glVertex3f(0.5f, -0.5f, 0.5f);

	glColor3f(0.0f, 1.0f, 0.0f);
	glVertex3f(0.5f, 0.5f, -0.5f);
	glVertex3f(0.5f, -0.5f, -0.5f);
	glVertex3f(-0.5f, 0.5f, -0.5f);
	glVertex3f(-0.5f, -0.5f,  -0.5f);

	glColor3f(0.0f, 0.0f, 1.0f);
	glVertex3f(-0.5f, 0.5f, 0.5f);
	glVertex3f(-0.5f, -0.5f, 0.5f);

	glEnd();

	glBegin(GL_QUADS);
	glColor3f(1.0f, 0.0f, 1.0f);
	glVertex3f(-0.5f, 0.5f, 0.5f);
	glVertex3f(0.5f, 0.5f, 0.5f);
	glVertex3f(0.5f, 0.5f, -0.5f);
	glVertex3f(-0.5f, 0.5f, -0.5f);
	glEnd();

	glBegin(GL_QUADS);
	glColor3f(0.0f, 1.0f, 1.0f);
	glVertex3f(-0.5f, -0.5f, 0.5f);
	glVertex3f(0.5f, -0.5f, 0.5f);
	glVertex3f(0.5f, -0.5f, -0.5f);
	glVertex3f(-0.5f, -0.5f,  -0.5f);
	glEnd();

	glBegin(GL_LINES);
	glVertex3f(-1.0, 0.0, 0.0);
	glVertex3f(-1.0,-1.0, 0.0);
	glVertex3f(-1.0,-0.5, 0.0);
	glVertex3f(-1.0,-1.5, 0.0);
	glEnd();

	glPopMatrix();
	
	//we should use this to avoid the flash on the screen.

	glFlush();

}

void CSeerView::DisplayCtrlPoint()
{
	glPointSize(5.0);
	glColor3f(1.0,0.0,0.0);
	glBegin(GL_POINTS);
	for (int i=0; i<4; i++ )
	{
		for (int j=0; j<4; j++)
		{
			//glVertex3d(points2[i][j][0], points2[i][j][1], points2[i][j][2]);
		}
	}
	glEnd();
}

void CSeerView::DrawCurve(GLfloat *pArray)
{
	glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, pArray);
	glEnable(GL_MAP2_VERTEX_3);
	glEnable(GL_DEPTH_TEST);
	glShadeModel(GL_FLAT);

	glColor3f(1.0,1.0,1.0);
	glMapGrid2f(8, 0.0, 1.0, 8, 0.0, 1.0);
	glEvalMesh2(GL_FILL, 0, 8, 0, 8);
	DisplayCtrlPoint();
}

void CSeerView::OnMesh()
{
	m_MeshSet.DoModal();
	m_XYPlane = m_MeshSet.m_XYPlane;
	Invalidate();
}

void CSeerView::SetMesh()
{
	int i;
	int count = 10;
	float density = 1.0;
	if( m_XYPlane )
	{
		glColor3f(1.0, 1.0, 1.0);
		glBegin(GL_LINES);
		for (i=-count; i<=count; i++ )
		{
			glVertex3f( density*i,-count*density, 0.0);
			glVertex3f( density*i, count*density, 0.0);
		}
		for (i=-count; i<=count; i++)
		{
			glVertex3f(-count*density, density*i, 0.0);
			glVertex3f( count*density, density*i, 0.0);
		}
		glEnd();
	}

	//if( m_YZPlane )
	//{
	//	glColor3f(1.0, 1.0, 1.0);
	//	glBegin(GL_LINES);
	//	for (i=-count; i<=count; i++ )
	//	{
	//		glVertex3f( 0.0, density*i,-count*density);
	//		glVertex3f( 0.0, density*i, count*density);
	//	}
	//	for (i=-count; i<=count; i++)
	//	{
	//		glVertex3f( 0.0, -count*density, density*i);
	//		glVertex3f( 0.0, count*density, density*i);
	//	}
	//	glEnd();
	//}

	//if( m_XZPlane )
	//{
	//	glColor3f(1.0, 1.0, 1.0);
	//	glBegin(GL_LINES);
	//	for (i=-count; i<=count; i++ )
	//	{
	//		glVertex3f( density*i, 0.0,-count*density);
	//		glVertex3f( density*i, 0.0, count*density);
	//	}
	//	for (i=-count; i<=count; i++)
	//	{
	//		glVertex3f(-count*density, 0.0, density*i);
	//		glVertex3f( count*density, 0.0, density*i);
	//	}
	//	glEnd();
	//}
}

//

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/
#undef APSTUDIO_READONLY_SYMBOLS

/
// 中文(中华人民共和国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

/
//
// Dialog
//

IDD_DIALOG_MESH DIALOGEX 0, 0, 229, 133
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Mesh Set"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "确定",IDOK,163,15,50,14
    PUSHBUTTON      "取消",IDCANCEL,163,35,50,14
    GROUPBOX        "Others",IDC_STATIC,7,88,213,36
    CONTROL         "XY-Plane",IDC_CHECK_XY_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,45,10
    CONTROL         "YZ-Plane",IDC_CHECK_YZ_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,39,45,10
    CONTROL         "XZ-Plane",IDC_CHECK_XZ_PLANE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,58,45,10
    GROUPBOX        "Planes",IDC_STATIC,7,7,147,74
    EDITTEXT        IDC_EDIT_LINEWIDTH,113,100,42,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_COLOR,35,101,42,14,ES_AUTOHSCROLL
    LTEXT           "Color",IDC_STATIC,15,104,18,8
    LTEXT           "Width",IDC_STATIC,87,104,20,8
    CONTROL         "Dotted",IDC_CHECK_DOTTED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,168,102,37,10
    EDITTEXT        IDC_EDIT_XYDENSITY,97,18,40,14,ES_AUTOHSCROLL
    LTEXT           "Density",IDC_STATIC,67,21,24,8
    EDITTEXT        IDC_EDIT_YZDENSITY,97,37,40,14,ES_AUTOHSCROLL
    LTEXT           "Density",IDC_STATIC,67,40,24,8
    EDITTEXT        IDC_EDIT_XZDENSITY,97,57,40,14,ES_AUTOHSCROLL
    LTEXT           "Density",IDC_STATIC,67,59,24,8
END


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DIALOG_MESH, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 222
        TOPMARGIN, 7
        BOTTOMMARGIN, 126
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // 中文(中华人民共和国) resources
/


/
// 英语(美国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

/
//
// Dialog
//

IDD_ABOUTBOX DIALOGEX 0, 0, 235, 63
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About"
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
    LTEXT           "MFC OpenGL Demo Version 1.0",IDC_STATIC,46,24,119,8,SS_NOPREFIX
    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP
END


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 228
        TOPMARGIN, 7
        BOTTOMMARGIN, 56
    END
END
#endif    // APSTUDIO_INVOKED


#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "#ifdef _WIN32\r\n"
    "LANGUAGE 9, 1\r\n"
    "#pragma code_page(1252)\r\n"
    "#endif //_WIN32\r\n"
    "#include ""res\\Seer.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
    "#include ""afxres.rc""         // Standard components\r\n"
    "#include ""afxprint.rc""       // printing/print preview resources\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME           ICON                    "res\\Seer.ico"
IDR_MFCGLTYPE           ICON                    "res\\SeerDoc.ico"

/
//
// Bitmap
//

IDR_MAINFRAME           BITMAP                  "res\\Toolbar.bmp"
IDR_COMMANDBAR          BITMAP                  "res\\CommandBar.bmp"

/
//
// Toolbar
//

IDR_MAINFRAME TOOLBAR  16, 15
BEGIN
    BUTTON      ID_FILE_NEW
    BUTTON      ID_FILE_OPEN
    BUTTON      ID_FILE_SAVE
    SEPARATOR
    BUTTON      ID_EDIT_CUT
    BUTTON      ID_EDIT_COPY
    BUTTON      ID_EDIT_PASTE
    SEPARATOR
    BUTTON      ID_FILE_PRINT
    SEPARATOR
    BUTTON      ID_APP_ABOUT
END

IDR_COMMANDBAR TOOLBAR  16, 16
BEGIN
    BUTTON      ID_SELECT
    BUTTON      ID_ROTATE
    BUTTON      ID_PAN
    SEPARATOR
    BUTTON      ID_FREE_VIEW
    BUTTON      ID_X_VIEW
    BUTTON      ID_Y_VIEW
    BUTTON      ID_Z_VIEW
END


/
//
// Menu
//

IDR_MAINFRAME MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW
        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN
        MENUITEM SEPARATOR
        MENUITEM "P&rint Setup...",             ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "E&xit",                       ID_APP_EXIT
    END
    POPUP "&View"
    BEGIN
        MENUITEM "&Toolbar",                    ID_VIEW_TOOLBAR
        MENUITEM "&Status Bar",                 ID_VIEW_STATUS_BAR
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About",                      ID_APP_ABOUT
    END
END

IDR_COMMANDMENU MENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New\tCtrl+N",                ID_FILE_NEW
        MENUITEM "&Open...\tCtrl+O",            ID_FILE_OPEN
        MENUITEM "&Close",                      ID_FILE_CLOSE
        MENUITEM "&Save\tCtrl+S",               ID_FILE_SAVE
        MENUITEM "Save &As...",                 ID_FILE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Print...\tCtrl+P",           ID_FILE_PRINT
        MENUITEM "Print Pre&view",              ID_FILE_PRINT_PREVIEW
        MENUITEM "P&rint Setup...",             ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "Recent File",                 ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "E&xit",                       ID_APP_EXIT
    END
    POPUP "&Edit"
    BEGIN
        MENUITEM "&Undo\tCtrl+Z",               ID_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "Cu&t\tCtrl+X",                ID_EDIT_CUT
        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
        MENUITEM "&Paste\tCtrl+V",              ID_EDIT_PASTE
    END
    POPUP "&View"
    BEGIN
        MENUITEM "&Toolbar",                    ID_VIEW_TOOLBAR
        MENUITEM "&Status Bar",                 ID_VIEW_STATUS_BAR
    END
    POPUP "&Setting"
    BEGIN
        POPUP "Angle"
        BEGIN
            MENUITEM "&X-View",                     ID_X_VIEW
            MENUITEM "&Y-View",                     ID_Y_VIEW
            MENUITEM "&Z-View",                     ID_Z_VIEW
            MENUITEM "&Free View",                  ID_FREE_VIEW
            MENUITEM SEPARATOR
            MENUITEM "Input Value",                 ID_ANGLE_INPUTVALUE
        END
        POPUP "Action Mode"
        BEGIN
            MENUITEM "&Select",                     ID_SELECT
            MENUITEM "&Pan",                        ID_PAN
            MENUITEM "&Rotate",                     ID_ROTATE
        END
        MENUITEM "&Show/Hide Axis",             ID_SHOW_COORDINATE_AXIS
        MENUITEM "Mesh",                        ID_SETTING_MESH
        MENUITEM SEPARATOR
        MENUITEM "&Ortho",                      ID_ORTHO
        MENUITEM "&Perspective",                ID_PERSPECTIVE
    END
    POPUP "&Window"
    BEGIN
        MENUITEM "&New Window",                 ID_WINDOW_NEW
        MENUITEM "&Cascade",                    ID_WINDOW_CASCADE
        MENUITEM "&Tile",                       ID_WINDOW_TILE_HORZ
        MENUITEM "&Arrange Icons",              ID_WINDOW_ARRANGE
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About",                      ID_APP_ABOUT
    END
END


/
//
// Accelerator
//

IDR_MAINFRAME ACCELERATORS
BEGIN
    "N",            ID_FILE_NEW,            VIRTKEY, CONTROL
    "O",            ID_FILE_OPEN,           VIRTKEY, CONTROL
    "S",            ID_FILE_SAVE,           VIRTKEY, CONTROL
    "P",            ID_FILE_PRINT,          VIRTKEY, CONTROL
    "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL
    "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL
    "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL
    "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL
    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT
    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT
    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL
    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT
    VK_F6,          ID_NEXT_PANE,           VIRTKEY
    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT
END


/
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904B0"
        BEGIN
            VALUE "FileDescription", "Seer MFC Application"
            VALUE "FileVersion", "1, 0, 0, 1"
            VALUE "InternalName", "Seer"
            VALUE "LegalCopyright", "Copyright (C) 2000"
            VALUE "OriginalFilename", "Seer.EXE"
            VALUE "ProductName", "Seer Application"
            VALUE "ProductVersion", "1, 0, 0, 1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END


/
//
// Cursor
//

IDC_CUR_ZOOM            CURSOR                  "res\\cur_zoom.cur"
IDC_CUR_MOVE            CURSOR                  "res\\cur_move.cur"
IDC_CUR_ROTATE          CURSOR                  "res\\cur_rotate.cur"
IDC_CUR_SELECT          CURSOR                  "res\\cur_select.cur"

/
//
// String Table
//

STRINGTABLE
BEGIN
    IDR_MAINFRAME           "Seer"
    IDR_MFCGLTYPE           "\nSeer\nSeer\n\n\nSeer.Document\nSeer Document"
END

STRINGTABLE
BEGIN
    AFX_IDS_APP_TITLE       "Seer"
    AFX_IDS_IDLEMESSAGE     "Ready"
END

STRINGTABLE
BEGIN
    ID_INDICATOR_EXT        "EXT"
    ID_INDICATOR_CAPS       "CAP"
    ID_INDICATOR_NUM        "NUM"
    ID_INDICATOR_SCRL       "SCRL"
    ID_INDICATOR_OVR        "OVR"
    ID_INDICATOR_REC        "REC"
END

STRINGTABLE
BEGIN
    ID_FILE_NEW             "Create a new document\nNew"
    ID_FILE_OPEN            "Open an existing document\nOpen"
    ID_FILE_CLOSE           "Close the active document\nClose"
    ID_FILE_SAVE            "Save the active document\nSave"
    ID_FILE_SAVE_AS         "Save the active document with a new name\nSave As"
    ID_FILE_PAGE_SETUP      "Change the printing options\nPage Setup"
    ID_FILE_PRINT_SETUP     "Change the printer and printing options\nPrint Setup"
    ID_FILE_PRINT           "Print the active document\nPrint"
    ID_FILE_PRINT_PREVIEW   "Display full pages\nPrint Preview"
END

STRINGTABLE
BEGIN
    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"
    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"
END

STRINGTABLE
BEGIN
    ID_FILE_MRU_FILE1       "Open this document"
    ID_FILE_MRU_FILE2       "Open this document"
    ID_FILE_MRU_FILE3       "Open this document"
    ID_FILE_MRU_FILE4       "Open this document"
    ID_FILE_MRU_FILE5       "Open this document"
    ID_FILE_MRU_FILE6       "Open this document"
    ID_FILE_MRU_FILE7       "Open this document"
    ID_FILE_MRU_FILE8       "Open this document"
    ID_FILE_MRU_FILE9       "Open this document"
    ID_FILE_MRU_FILE10      "Open this document"
    ID_FILE_MRU_FILE11      "Open this document"
    ID_FILE_MRU_FILE12      "Open this document"
    ID_FILE_MRU_FILE13      "Open this document"
    ID_FILE_MRU_FILE14      "Open this document"
    ID_FILE_MRU_FILE15      "Open this document"
    ID_FILE_MRU_FILE16      "Open this document"
END

STRINGTABLE
BEGIN
    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"
    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"
END

STRINGTABLE
BEGIN
    ID_WINDOW_NEW           "Open another window for the active document\nNew Window"
    ID_WINDOW_ARRANGE       "Arrange icons at the bottom of the window\nArrange Icons"
    ID_WINDOW_CASCADE       "Arrange windows so they overlap\nCascade Windows"
    ID_WINDOW_TILE_HORZ     "Arrange windows as non-overlapping tiles\nTile Windows"
    ID_WINDOW_TILE_VERT     "Arrange windows as non-overlapping tiles\nTile Windows"
    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"
END

STRINGTABLE
BEGIN
    ID_EDIT_CLEAR           "Erase the selection\nErase"
    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"
    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"
    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"
    ID_EDIT_FIND            "Find the specified text\nFind"
    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"
    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"
    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"
    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"
    ID_EDIT_UNDO            "Undo the last action\nUndo"
    ID_EDIT_REDO            "Redo the previously undone action\nRedo"
END

STRINGTABLE
BEGIN
    ID_VIEW_TOOLBAR         "Show or hide the toolbar\nToggle ToolBar"
    ID_VIEW_STATUS_BAR      "Show or hide the status bar\nToggle StatusBar"
END

STRINGTABLE
BEGIN
    AFX_IDS_SCSIZE          "Change the window size"
    AFX_IDS_SCMOVE          "Change the window position"
    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"
    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"
    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"
    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"
    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"
END

STRINGTABLE
BEGIN
    AFX_IDS_SCRESTORE       "Restore the window to normal size"
    AFX_IDS_SCTASKLIST      "Activate Task List"
    AFX_IDS_MDICHILD        "Activate this window"
END

STRINGTABLE
BEGIN
    AFX_IDS_PREVIEW_CLOSE   "Close print preview mode\nCancel Preview"
END

STRINGTABLE
BEGIN
    ID_PAN                  "Pan"
    ID_SELECT               "Select"
    ID_ROTATE               "Rotate"
    ID_ORTHO                "Ortho Mode\nOrtho"
    ID_PERSPECTIVE          "Perspective Mode\nPerspective"
    ID_X_VIEW               "X-View"
    ID_Y_VIEW               "Y-View"
    ID_Z_VIEW               "Z-View"
    ID_FREE_VIEW            "Free view"
END

STRINGTABLE
BEGIN
    ID_SHOW_COORDINATE_AXIS "Show/Close Coordinate"
END

#endif    // 英语(美国) resources
/



#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif //_WIN32
#include "res\Seer.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"         // Standard components
#include "afxprint.rc"       // printing/print preview resources
#endif

/
#endif    // not APSTUDIO_INVOKED



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值