計算機圖形學-在VS2013下利用MFC實現OpenGL


一直想系統的學習MFC,感覺網上的關於這方面的好雜好亂,好多都看不懂(可能由於太菜233.)

看了幾位大神的博客,終於明白了點,記錄一下自己的學習過程吧

一、新建項目

 

二、選擇多文檔,MFC標准,點擊完成

 

 

 三、運行結果

四、導入必要的文件

1. 在<stdafx.h >里面加入一些常用的頭文件

#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <stdio.h>
#include <math.h>

2.在項目中加入OpenGL的lib庫

選中項目,鼠標右鍵點擊

 

 選中屬性,找到配置屬性/鏈接器/輸入/附加依賴項

寫入需要使用的lib文件

四、在程序里面添加函數和變量

<1>在---View.h里面添加變量

private:
    HGLRC m_hRC;
    CClientDC* m_pDC;

<2>在--View.cpp里面添加自定義函數bSetDCPixelFormat(),用於設置像素格式

bool CStudy01View::bSetDCPixelFormat()
{
    static PIXELFORMATDESCRIPTOR pfd =
    {
        sizeof(PIXELFORMATDESCRIPTOR), // 結構的大小  
        1, // 結構的版本  
        PFD_DRAW_TO_WINDOW | // 在窗口(而不是位圖)中繪圖  
        PFD_SUPPORT_OPENGL | // 支持在窗口中進行OpenGL調用  
        PFD_DOUBLEBUFFER, // 雙緩沖模式  
        PFD_TYPE_RGBA, // RGBA顏色模式  
        32, // 需要32位顏色  
        0, 0, 0, 0, 0, 0, // 不用於選擇模式  
        0, 0, // 不用於選擇模式  
        0, 0, 0, 0, 0, // 不用於選擇模式  
        16, // 深度緩沖區的大小  
        0, // 在此不使用  
        0, // 在此不使用  
        0, // 在此不使用  
        0, // 在此不使用  
        0, 0, 0 // 在此不使用  
    };
    // 選擇一種與pfd所描述的最匹配的像素格式  
    // 為設備環境設置像素格式  
    int pixelformat;
    pixelformat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
    if (0 == pixelformat) return false;
    // 為設備環境設置像素格式  
    return SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd);
    
        return FALSE;
//    }
    
    
}

 

3)在View.cpp里面添加OnCreate()函數,創建窗口時調用


int CStudy01View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  在此添加您專用的創建代碼
    // 創建DC  

    m_pDC = new CClientDC(this);
    ASSERT(m_pDC != NULL);
    // 選擇像素格式  
    if (!bSetDCPixelFormat()) return -1;
    // 創建渲染環境, 並使它成為當前渲染環境  
    m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
    wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
    return 0;
}

 

 

(4)添加OnDestroy() 函數,同OnCreate函數的添加過程

void CStudy01View::OnDestroy()
{
    CView::OnDestroy();

    // TODO:  在此處添加消息處理程序代碼
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(m_hRC);
    delete m_pDC;
}
 

(5)修改OnDraw()函數,畫圖時調用該函數

void CStudyView::OnDraw(CDC* /*pDC*/)
{
    CStudyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO:  在此處為本機數據添加繪制代碼
    // 清除顏色  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // 繪制場景  
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    DrawPicture(); //為了更加明了,DrawPicture函數就是繪圖的核心代碼
    glPopMatrix();
    // 交換緩沖區  
    SwapBuffers(wglGetCurrentDC());
}

 

 

(6)添加繪圖自定義函數DrawPicture(),就是OpenGL里面的Display()函數

(7)添加函數OnInitialUpdate(),類似於OpenGL里面的OnInit()函數

void CStudy01View::OnInitialUpdate()
{
    CView::OnInitialUpdate();

    // TODO:  在此添加專用代碼和/或調用基類
    glClearColor(1, 1, 1, 1);
}

 


(8)添加OnSize()函數,類似於OpenGL里面的Reshape()函數

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

    // TODO:  在此處添加消息處理程序代碼
    glViewport(0, 0, cx, cy);
    // 設置投影矩陣(透視投影)  
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60.0, (GLfloat)cx / (GLfloat)cy, 1.0, 1000.0);
    // 設置模型視圖矩陣  
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    // 顯示三維圖形的程序
    /*glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();*/
}

把定義的類和方法寫入---View.h頭文件里面,方便調用

到此,基本工作就OK了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM