DialogGLDlg.cpp
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:12k
- // DialogGLDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "DialogGL.h"
- #include "DialogGLDlg.h"
- #include "math.h"
- #include "mmsystem.h"
- #include "resource.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAboutDlg dialog used for App About
- class CAboutDlg : public CDialog
- {
- public:
- CAboutDlg();
- // Dialog Data
- //{{AFX_DATA(CAboutDlg)
- enum { IDD = IDD_ABOUTBOX };
- //}}AFX_DATA
- // ClassWizard generated virtual function overrides
- //{{AFX_VIRTUAL(CAboutDlg)
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- //}}AFX_VIRTUAL
- // Implementation
- protected:
- //{{AFX_MSG(CAboutDlg)
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
- };
- CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
- {
- //{{AFX_DATA_INIT(CAboutDlg)
- //}}AFX_DATA_INIT
- }
- void CAboutDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAboutDlg)
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
- //{{AFX_MSG_MAP(CAboutDlg)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDialogGLDlg dialog
- CDialogGLDlg::CDialogGLDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CDialogGLDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CDialogGLDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- m_hGLContext = NULL;
- m_GLPixelIndex = 0;
- m_xRotate = 0;
- m_yRotate = 0;
- m_Rotate = FALSE;
- m_ScaleX = 1.0f;
- m_ScaleY = 1.0f;
- m_ScaleZ = 1.0f;
- m_size = 1.5;
- m_exp = 9;
- m_RightButtonDown = FALSE;
- m_LeftButtonDown = FALSE;
- m_Antialias = TRUE;
- }
- void CDialogGLDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CDialogGLDlg)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CDialogGLDlg, CDialog)
- ON_WM_CONTEXTMENU()
- //{{AFX_MSG_MAP(CDialogGLDlg)
- ON_WM_SYSCOMMAND()
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_SIZE()
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_TIMER()
- ON_COMMAND(ID_POPUP_ROTATE, OnPopupRotate)
- ON_COMMAND(ID_POPUP_SIZE_DECREASE, OnPopupSizeDecrease)
- ON_COMMAND(ID_POPUP_SIZE_INCREASE, OnPopupSizeIncrease)
- ON_WM_KEYDOWN()
- ON_COMMAND(ID_POPUP_ANTIALIASING, OnPopupAntialiasing)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDialogGLDlg message handlers
- BOOL CDialogGLDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // Add "About..." menu item to system menu.
- // IDM_ABOUTBOX must be in the system command range.
- ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
- ASSERT(IDM_ABOUTBOX < 0xF000);
- CMenu* pSysMenu = GetSystemMenu(FALSE);
- if (pSysMenu != NULL)
- {
- CString strAboutMenu;
- strAboutMenu.LoadString(IDS_ABOUTBOX);
- if (!strAboutMenu.IsEmpty())
- {
- pSysMenu->AppendMenu(MF_SEPARATOR);
- pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
- }
- }
- // Set the icon for this dialog. The framework does this automatically
- // when the application's main window is not a dialog
- SetIcon(m_hIcon, TRUE); // Set big icon
- SetIcon(m_hIcon, FALSE); // Set small icon
-
- // TODO: Add extra initialization here
-
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CDialogGLDlg::OnSysCommand(UINT nID, LPARAM lParam)
- {
- if ((nID & 0xFFF0) == IDM_ABOUTBOX)
- {
- CAboutDlg dlgAbout;
- dlgAbout.DoModal();
- }
- else
- {
- CDialog::OnSysCommand(nID, lParam);
- }
- }
- // If you add a minimize button to your dialog, you will need the code below
- // to draw the icon. For MFC applications using the document/view model,
- // this is automatically done for you by the framework.
- void CDialogGLDlg::OnPaint()
- {
- if (IsIconic())
- {
- CPaintDC dc(this); // device context for painting
- SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
- // Center icon in client rectangle
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // Draw the icon
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CPaintDC dc(this); // device context for painting
- RenderScene();
- SwapBuffers(dc.m_ps.hdc);
- CDialog::OnPaint();
- }
- }
- // The system calls this to obtain the cursor to display while the user drags
- // the minimized window.
- HCURSOR CDialogGLDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- BOOL CDialogGLDlg::SetWindowPixelFormat(HDC hDC)
- {
- PIXELFORMATDESCRIPTOR pixelDesc = {
- sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
- 1, // 版本号
- PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
- PFD_SUPPORT_OPENGL | // 支持 OpenGL
- PFD_DOUBLEBUFFER, // 双缓存模式
- PFD_TYPE_RGBA, // RGBA 颜色模式
- 24, // 24 位颜色深度
- 0, 0, 0, 0, 0, 0, // 忽略颜色位
- 0, // 没有非透明度缓存
- 0, // 忽略移位位
- 0, // 无累加缓存
- 0, 0, 0, 0, // 忽略累加位
- 32, // 32 位深度缓存
- 0, // 无模板缓存
- 0, // 无辅助缓存
- PFD_MAIN_PLANE, // 主层
- 0, // 保留
- 0, 0, 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;
- }
- BOOL CDialogGLDlg::CreateViewGLContext(HDC hDC)
- {
- m_hGLContext = wglCreateContext(hDC);
- if(m_hGLContext==NULL)
- return FALSE;
- if(wglMakeCurrent(hDC,m_hGLContext)==FALSE)
- return FALSE;
- return TRUE;
- }
- int CDialogGLDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CDialog::OnCreate(lpCreateStruct) == -1)
- return -1;
-
- HWND hWnd = GetSafeHwnd();
- HDC hDC = ::GetDC(hWnd);
- if(SetWindowPixelFormat(hDC)==FALSE)
- return 0;
-
- if(CreateViewGLContext(hDC)==FALSE)
- return 0;
- glClearColor(0.0,0.0,0.0,1.0);
- glPolygonMode(GL_FRONT,GL_LINE);
- glPolygonMode(GL_BACK,GL_LINE);
- // 反走样操作
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
- glLineWidth(1.5);
- BuildList();
- SetTimer(0,10,NULL);
- return 0;
- }
-
- void CDialogGLDlg::OnDestroy()
- {
-
- CDialog::OnDestroy();
- if(wglGetCurrentContext() != NULL)
- wglMakeCurrent(NULL,NULL);
- if(m_hGLContext != NULL)
- {
- wglDeleteContext(m_hGLContext);
- m_hGLContext = NULL;
- }
-
- }
- void CDialogGLDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
-
- GLsizei width,height;
- GLdouble aspect;
- width = cx;
- height = cy;
- if(cy==0)
- aspect = (GLdouble)width;
- else
- aspect = (GLdouble)width/(GLdouble)height;
- glViewport(0,0,width,height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(45,aspect,1,100.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glDrawBuffer(GL_BACK);
- glEnable(GL_DEPTH_TEST);
-
- }
- void CDialogGLDlg::RenderScene()
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glPushMatrix();
- glTranslated(0.0,0.0,-8.0);
- glRotated(m_xRotate, 1.0, 0.0, 0.0);
- glRotated(m_yRotate, 0.0, 1.0, 0.0);
- glScalef(m_ScaleX,m_ScaleY,m_ScaleZ);
-
- ::glCallList(1);
- glPopMatrix();
- }
- void CDialogGLDlg::OnLButtonDown(UINT nFlags, CPoint point)
- {
- m_LeftButtonDown = TRUE;
- m_LeftDownPos = point;
- KillTimer(0);
- CDialog::OnLButtonDown(nFlags, point);
- }
- void CDialogGLDlg::OnLButtonUp(UINT nFlags, CPoint point)
- {
- m_LeftButtonDown = FALSE;
-
- CDialog::OnLButtonUp(nFlags, point);
- }
- void CDialogGLDlg::OnMouseMove(UINT nFlags, CPoint point)
- {
- if(m_LeftButtonDown)
- {
- CSize rotate = m_LeftDownPos - point;
- m_LeftDownPos = point;
- m_yRotate -= rotate.cx;
- m_xRotate -= rotate.cy;
- InvalidateRect(NULL,FALSE);
- }
-
- CDialog::OnMouseMove(nFlags, point);
- }
- void CDialogGLDlg::OnContextMenu(CWnd*, CPoint point)
- {
- if (point.x == -1 && point.y == -1)
- {
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);
point = rect.TopLeft();
point.Offset(5, 5);
}
CMenu menu;
VERIFY(menu.LoadMenu(CG_IDR_POPUP_DIALOG_GLDLG));
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;
while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}
- void CDialogGLDlg::Rotate()
- {
- m_yRotate -= 2;
- InvalidateRect(NULL,FALSE);
- }
- void CDialogGLDlg::OnTimer(UINT nIDEvent)
- {
- m_yRotate -= 3;
- m_xRotate -= 2;
- InvalidateRect(NULL,FALSE);
- CDialog::OnTimer(nIDEvent);
- }
- void CDialogGLDlg::OnPopupRotate()
- {
- SetTimer(0,10,NULL);
- }
- void CDialogGLDlg::OnPopupSizeDecrease()
- {
- m_ScaleX /= 1.1f;
- m_ScaleY /= 1.1f;
- m_ScaleZ /= 1.1f;
- InvalidateRect(NULL,FALSE);
- }
- void CDialogGLDlg::OnPopupSizeIncrease()
- {
- m_ScaleX *= 1.1f;
- m_ScaleY *= 1.1f;
- m_ScaleZ *= 1.1f;
- InvalidateRect(NULL,FALSE);
- }
- // 创建显示列表
- void CDialogGLDlg::BuildList()
- {
- ::glNewList(1,GL_COMPILE_AND_EXECUTE);
- glShadeModel(GL_SMOOTH);
- glColor3ub(255,255,255);
- float x = m_size;
- float xt = 5.0f;
- glBegin(GL_POLYGON);
- glVertex3d( x, x, x);
- glVertex3d( x, -x, x);
- glVertex3d(-x, -x, x);
- glVertex3d(-x, x, x);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3d(-x, x, -x);
- glVertex3d(-x, -x, -x);
- glVertex3d( x, -x, -x);
- glVertex3d( x, x, -x);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3d( x, x, x);
- glVertex3d( x, x, -x);
- glVertex3d( x, -x, -x);
- glVertex3d( x, -x, x);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3d(-x, x, x);
- glVertex3d(-x, x, -x);
- glVertex3d(-x, -x, -x);
- glVertex3d(-x, -x, x);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3d(-x, -x, x);
- glVertex3d( x, -x, x);
- glVertex3d( x, -x, -x);
- glVertex3d(-x, -x, -x);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex3d(-x, x, x);
- glVertex3d( x, x, x);
- glVertex3d( x, x, -x);
- glVertex3d(-x, x, -x);
- glEnd();
- ::glEndList();
- }
- void CDialogGLDlg::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags)
- {
- switch(nChar)
- {
- case VK_ADD:
- m_ScaleX *= 1.1f;
- m_ScaleY *= 1.1f;
- m_ScaleZ *= 1.1f;
- InvalidateRect(NULL,FALSE);
- break;
- case VK_SUBTRACT:
- m_ScaleX /= 1.1f;
- m_ScaleY /= 1.1f;
- m_ScaleZ /= 1.1f;
- InvalidateRect(NULL,FALSE);
- break;
- default :
- {}
- }
- CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
- }
- void CDialogGLDlg::OnPopupAntialiasing()
- {
- m_Antialias = !m_Antialias;
- if(m_Antialias)
- {
- glEnable(GL_LINE_SMOOTH);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
- glLineWidth(10);
- }
- else
- {
- glDisable(GL_LINE_SMOOTH);
- glDisable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
- glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
- glLineWidth(10);
- }
- InvalidateRect(NULL,FALSE);
- }