zoukankan      html  css  js  c++  java
  • 在对话框picture control中利用opengl进行绘图

    照着写的一个Demo,,地址如下,Demo

    立一个基于对话框的工程(名称:OpenGL)

    并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib

    为对话框添加picture control 控件,ID:IDC_RENDER

    主要程序:
    
    // OpenGLDlg.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "OpenGL.h"
    #include "OpenGLDlg.h"
    
    
    #include <gl/gl.h>
    #include <gl/glu.h>
    #include <gl/glaux.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)
      // No message handlers
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // COpenGLDlg dialog
    
    COpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/)
     : CDialog(COpenGLDlg::IDD, pParent)
    {
     //{{AFX_DATA_INIT(COpenGLDlg)
      // NOTE: the ClassWizard will add member initialization here
     //}}AFX_DATA_INIT
     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    
      PixelFormat=0;
         m_yRotate = 0;
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void COpenGLDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
     //{{AFX_DATA_MAP(COpenGLDlg)
      // NOTE: the ClassWizard will add DDX and DDV calls here
     //}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog)
     //{{AFX_MSG_MAP(COpenGLDlg)
     ON_WM_SYSCOMMAND()
     ON_WM_PAINT()
     ON_WM_QUERYDRAGICON()
     ON_WM_TIMER()
     //}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // COpenGLDlg message handlers
    
    BOOL COpenGLDlg::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
     
    ///////////////////////OPENGL INIT/////////////////////////
      CWnd *wnd=GetDlgItem(IDC_RENDER);
        hrenderDC=::GetDC(wnd->m_hWnd);
     if(SetWindowPixelFormat(hrenderDC)==FALSE)
      return 0;
     
     if(CreateViewGLContext(hrenderDC)==FALSE)
      return 0;
     glPolygonMode(GL_FRONT,GL_FILL);
     glPolygonMode(GL_BACK,GL_FILL);
    ///////////////////////////////////////////
    
     
    
     glEnable(GL_TEXTURE_2D);
     glShadeModel(GL_SMOOTH);
     glViewport(0,0,259,231);
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluPerspective(45,1,0.1,100.0);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();
     glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
     glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
     glClearDepth(1.0f);         // Depth Buffer Setup
     glEnable(GL_DEPTH_TEST);       // Enables Depth Testing
     glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
     /////////////////////////////////////////////////////////////////////////
     glEnableClientState(GL_VERTEX_ARRAY);
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
     SetTimer(1,10,0);
    
    ////////////////////////////////////////////////////////////////
    
     // TODO: Add extra initialization here
     
     return TRUE;  // return TRUE  unless you set the focus to a control
    }
    
    void COpenGLDlg::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 COpenGLDlg::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
     {
      CDialog::OnPaint();
     }
    }
    
    // The system calls this to obtain the cursor to display while the user drags
    //  the minimized window.
    HCURSOR COpenGLDlg::OnQueryDragIcon()
    {
     return (HCURSOR) m_hIcon;
    }
    
     
    
    BOOL COpenGLDlg::SetWindowPixelFormat(HDC hDC)
    {
    PIXELFORMATDESCRIPTOR pixelDesc;
    
    pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
    pixelDesc.nVersion = 1;
    
    pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | 
         PFD_SUPPORT_OPENGL |
         PFD_DOUBLEBUFFER |
         PFD_TYPE_RGBA;
    
    pixelDesc.iPixelType = PFD_TYPE_RGBA;
    pixelDesc.cColorBits = 32;
    pixelDesc.cRedBits = 0;
    pixelDesc.cRedShift = 0;
    pixelDesc.cGreenBits = 0;
    pixelDesc.cGreenShift = 0;
    pixelDesc.cBlueBits = 0;
    pixelDesc.cBlueShift = 0;
    pixelDesc.cAlphaBits = 0;
    pixelDesc.cAlphaShift = 0;
    pixelDesc.cAccumBits = 0;
    pixelDesc.cAccumRedBits = 0;
    pixelDesc.cAccumGreenBits = 0;
    pixelDesc.cAccumBlueBits = 0;
    pixelDesc.cAccumAlphaBits = 0;
    pixelDesc.cDepthBits = 0;
    pixelDesc.cStencilBits = 1;
    pixelDesc.cAuxBuffers = 0;
    pixelDesc.iLayerType = PFD_MAIN_PLANE;
    pixelDesc.bReserved = 0;
    pixelDesc.dwLayerMask = 0;
    pixelDesc.dwVisibleMask = 0;
    pixelDesc.dwDamageMask = 0;
    
    PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
    if(PixelFormat==0) // Choose default
    {
     PixelFormat = 1;
     if(DescribePixelFormat(hDC,PixelFormat,
      sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
     {
      return FALSE;
     }
    }
    
    if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)
    
    { 
     return FALSE;
    }
    
    return TRUE;
    }
    
    
    BOOL COpenGLDlg::CreateViewGLContext(HDC hDC)
    {
    hrenderRC = wglCreateContext(hDC);
    
    if(hrenderRC==NULL)
     return FALSE;
    
    if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
     return FALSE;
    
     
    
    return TRUE;
    }
    
    void COpenGLDlg::RenderScene()   
    {
    
    
     /////////////////////////////////////////////////
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
     
     glLoadIdentity();
     glTranslatef(0.0f,0.0f,-6.0f);      // Move Left 1.5 Units And Into The Screen 6.0
     glRotated(m_yRotate, 0.0, 1.0, 0.0);
     glBegin(GL_TRIANGLES); // Drawing Using Triangles
     
      glVertex3f( 0.0f, 1.0f, 0.0f);     // Top
      glVertex3f(-1.0f,-1.0f, 0.0f);     // Bottom Left
      glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right
     glEnd();           // Finished Drawing The Triangle
     SwapBuffers(hrenderDC);
    }
    
    void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景
    {
     // TODO: Add your message handler code here and/or call default
     RenderScene();
     m_yRotate +=3;
     CDialog::OnTimer(nIDEvent);
    }
    
    
     
    
    // OpenGLDlg.h : header file
    //
    
    #if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)
    #define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    /////////////////////////////////////////////////////////////////////////////
    // COpenGLDlg dialog
    
    class COpenGLDlg : public CDialog
    {
    // Construction
    public:
     COpenGLDlg(CWnd* pParent = NULL); // standard constructor
    
    
      BOOL SetWindowPixelFormat(HDC hDC);   //设定象素格式
     BOOL CreateViewGLContext(HDC hDC);     //View GL Context
        void RenderScene();                                //绘制场景
    
     HDC hrenderDC;      //DC
     HGLRC hrenderRC;  //RC
     float m_yRotate;       //转速
    
     int PixelFormat;
    
     
    
    // Dialog Data
     //{{AFX_DATA(COpenGLDlg)
     enum { IDD = IDD_OPENGL_DIALOG };
      // NOTE: the ClassWizard will add data members here
     //}}AFX_DATA
    
     // ClassWizard generated virtual function overrides
     //{{AFX_VIRTUAL(COpenGLDlg)
     protected:
     virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
     //}}AFX_VIRTUAL
    
    // Implementation
    protected:
     HICON m_hIcon;
    
     // Generated message map functions
     //{{AFX_MSG(COpenGLDlg)
     virtual BOOL OnInitDialog();
     afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
     afx_msg void OnPaint();
     afx_msg HCURSOR OnQueryDragIcon();
     afx_msg void OnTimer(UINT nIDEvent);
     //}}AFX_MSG
     DECLARE_MESSAGE_MAP()
    };
    
    //{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
    
    #endif // !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)
    


     

  • 相关阅读:
    【bzoj2242】[SDOI2011]计算器
    1109解题报告
    【bzoj3239】Discrete Logging
    【bzoj2480】Spoj3105 Mod
    【POJ1811】Prime Test
    【bzoj3667】Rabin-Miller算法
    【HDU2138】How many prime numbers
    卢卡斯定理
    线段树2
    畅快的甩卖
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3100741.html
Copyright © 2011-2022 走看看