1. 程式人生 > >MFC單文件程式中搭建OpenGL框架

MFC單文件程式中搭建OpenGL框架

一、簡介

Windows GDI是通過裝置控制代碼(Device Context(裝置描述表)以下簡稱"DC")來繪圖,而OpenGL則需要繪製環境(Rendering Context(著色描述表),以下簡稱"RC")。每一個GDI命令需要傳給它一個DC,但與GDI不同,OpenGL使用當前繪製環境(RC)。但是RC並不能直接完成繪圖,只能與特定的DC聯絡起來,從而完成具體的繪圖工作。一旦在一個執行緒中指定了一個當前RC,在此執行緒中其後所有的OpenGL命令都使用相同的當前RC。雖然在單一視窗中可以使用多個RC,但在單一執行緒中只有一個當前RC。下面我將首先產生一個OpenGL RC並使之成為當前RC。這將分為三個步驟:

1、設定視窗畫素格式;

2、產生RC;

3、設定為當前RC。

用一個圖表示如下所示,圖中介紹了需要在各個函式中設定的資訊:


二、搭建MFC中的OpenGL基本框架

本文以一個單文件程式為例。新建一個單文件名字為VCOpenGL2 其他的預設。

1、新增連結庫。

開啟選單欄下的專案->屬性->配置屬性->連結器->輸入->附加依賴項里加入OpenGL32.lib GLu32.lib GLaux.lib,如圖

如果不用這種方法新增連結庫的話,可以寫上下列程式碼,也能達到同樣的效果:

[cpp]
 view plaincopyprint?
  1. #pragma comment( lib, "opengl32.lib" )    
  2. #pragma comment( lib, "glu32.lib" )      
  3. #pragma comment( lib, "glut32.lib" ) 
  4. #pragma comment( lib, "glaux.lib" )
[cpp] view plain copy  print?
  1. #pragma comment( lib, "opengl32.lib" )   
  2. #pragma comment( lib, "glu32.lib" )     
  3. #pragma comment( lib, "glut32.lib" )
  4. #pragma comment( lib, "glaux.lib" )

2、 包含標頭檔案。

在stdafx裡面新增opengl的標頭檔案(當然也可以在其他檔案中新增,比如繪圖一般都是在檢視中的,可以在xxxView.cpp檔案中包含標頭檔案)。如下程式碼所示:

#include <GL\glaux.h>
#include <GL\glut.h>

有幾點說明:

2.1、包含glut.h的同時就把gl.h和glu.h都包括了。因為開啟glut.h你可以看到如下圖所示的,已經包含了gl.h和glu.h。

2.2、關於這OpenGL中的這幾個庫的介紹,看一看我的另一篇文章,地址如下:

3、設定視窗顯示風格。

視窗建立之前我們必須設定視窗風格包含

WS_CLIPCHILDREN(建立父視窗使用的Windows風格,用於重繪時裁剪子視窗所覆蓋的區域)和WS_CLIPSIBLINGS(建立子視窗使用的Windows風格,用於重繪時剪裁其他子視窗所覆蓋的區域),

從而避免OpenGL繪製到其他視窗中去。這些應該放在PreCreateWindow()中。程式碼如下:

CMyVIew中的PreCreateWindow中新增
cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

4、設定視窗畫素格式

首先向VCOpenGL2View類中新增幾個保護的成員變數和公共的成員函式。如下:

[cpp] view plaincopyprint?
  1. HGLRC m_hRC;    //Rendering Context著色描述表 
  2. CClientDC* m_pDC;        //Device Context裝置描述表 
  3. BOOL InitializeOpenGL();    //初始化 OpenGL 
  4. BOOL SetupPixelFormat();    //設定畫素格式 
  5. void RenderScene();         //繪製場景
[cpp] view plain copy  print?
  1. HGLRC m_hRC;    //Rendering Context著色描述表
  2. CClientDC* m_pDC;        //Device Context裝置描述表
  3. BOOL InitializeOpenGL();    //初始化 OpenGL
  4. BOOL SetupPixelFormat();    //設定畫素格式
  5. void RenderScene();         //繪製場景

 別忘了在VCOpenGL2View的建構函式中設定 m_hRC = NULL; m_pDC = NULL;

產生一個RC的第一步是定義視窗的畫素格式。畫素格式決定視窗著所顯示的圖形在記憶體中是如何表示的。由畫素格式控制的引數包括:顏色深度、緩衝模式和所支援的繪畫介面。在下面將在SetupPixelFormat()函式中對這些引數的設定。程式碼如下:

[cpp] view plaincopyprint?
  1. BOOL CVCOpenGL2View::SetupPixelFormat(void)  
  2. {  
  3. static PIXELFORMATDESCRIPTOR pfd =   
  4.                             {  
  5. sizeof(PIXELFORMATDESCRIPTOR),  // pfd結構的大小  
  6.                                 1,                              // 版本號  
  7.                                 PFD_DRAW_TO_WINDOW |            // 支援在視窗中繪圖  
  8.                                 PFD_SUPPORT_OPENGL |            // 支援 OpenGL  
  9.                                 PFD_DOUBLEBUFFER,               // 雙快取模式  
  10.                                 PFD_TYPE_RGBA,                  // RGBA 顏色模式  
  11.                                 24,                             // 24 位顏色深度  
  12.                                 0, 0, 0, 0, 0, 0,               // 忽略顏色位  
  13.                                 0,                              // 沒有非透明度快取  
  14.                                 0,                              // 忽略移位位  
  15.                                 0,                              // 無累計快取  
  16.                                 0, 0, 0, 0,                     // 忽略累計位  
  17.                                 32,                             // 32 位深度快取      
  18.                                 0,                              // 無模板快取  
  19.                                 0,                              // 無輔助快取  
  20.                                 PFD_MAIN_PLANE,                 // 主層  
  21.                                 0,                              // 保留  
  22.                                 0, 0, 0                         // 忽略層,可見性和損毀掩模 
  23.                             };  
  24. int pixelFormat;  
  25. // 為裝置描述表得到最匹配的畫素格式  
  26. if((pixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0)  
  27.     {  
  28.         MessageBox( _T("ChoosePixelFormat failed") );  
  29. return FALSE;  
  30.     }  
  31. // 設定最匹配的畫素格式為當前的畫素格式  
  32. if(SetPixelFormat(m_pDC->GetSafeHdc(), pixelFormat, &pfd) == FALSE)  
  33.     {  
  34.         MessageBox( _T("SetPixelFormat failed") );  
  35. return FALSE;  
  36.     }  
  37. return TRUE;  
  38. }  
[cpp] view plain copy  print?
  1. BOOL CVCOpenGL2View::SetupPixelFormat(void)  
  2. {  
  3.  static PIXELFORMATDESCRIPTOR pfd =   
  4.                             {  
  5.                                 sizeof(PIXELFORMATDESCRIPTOR),  // pfd結構的大小 
  6.                                 1,                              // 版本號 
  7.                                 PFD_DRAW_TO_WINDOW |            // 支援在視窗中繪圖 
  8.                                 PFD_SUPPORT_OPENGL |            // 支援 OpenGL 
  9.                                 PFD_DOUBLEBUFFER,               // 雙快取模式 
  10.                                 PFD_TYPE_RGBA,                  // RGBA 顏色模式 
  11.                                 24,                             // 24 位顏色深度 
  12.                                 0, 0, 0, 0, 0, 0,               // 忽略顏色位 
  13.                                 0,                              // 沒有非透明度快取 
  14.                                 0,                              // 忽略移位位 
  15.                                 0,                              // 無累計快取 
  16.                                 0, 0, 0, 0,                     // 忽略累計位 
  17.                                 32,                             // 32 位深度快取     
  18.                                 0,                              // 無模板快取 
  19.                                 0,                              // 無輔助快取 
  20.                                 PFD_MAIN_PLANE,                 // 主層 
  21.                                 0,                              // 保留 
  22.                                 0, 0, 0                         // 忽略層,可見性和損毀掩模 
  23.                             };  
  24.     int pixelFormat;  
  25.     // 為裝置描述表得到最匹配的畫素格式 
  26.     if((pixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0)  
  27.     {  
  28. 相關推薦

    MFC程式搭建OpenGL框架

    一、簡介 Windows GDI是通過裝置控制代碼(Device Context(裝置描述表)以下簡稱"DC")來繪圖,而OpenGL則需要繪製環境(Rendering Context(著色描述表),以下簡稱"RC")。每一個GDI命令需要傳給它一個DC,但

    MFC+Opencv在程式顯示出一幅影象

    在MFC中顯示一幅影象程式是十分複雜的,而在Opencv中讀入一幅影象只需要一句話,而且很多的影象處理操作都需要使用Opencv中已有的函式,所以在MFC中呼叫Opencv的函式顯示一幅影象是很必要的操作。現在網上很多相關的描述都很不詳盡,我總結並編寫程式測試後,依次介紹在對話方塊程式和單文件程式中

    MFC程式新增最近開啟檔案.

    預設的MFC單文件程式可以支援最近的檔案列表,但是它卻不一定是我們需要的,因此我在這裡總結出手動控制的方法,以備不時之需。 預設的最近檔案列表是通過MRU file list來實現的,它通過將最近開啟的檔案寫入登錄檔,然後讀取到選單上實現的。這一切預設都是通過開啟和儲存

    去掉MFC程式開啟程式就建立一個新的功能

    當我們建立一個MFC多文件程式後,直接編譯執行會發現程式會自動建立一個空白的文件,如果我們不想要這個功能的話,可以這樣做: 在App類的InitInstance()中加上下面的程式碼: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothi

    VTK與MFC程式聯合程式設計

      興趣需要,想做下VTK與MFC想結合的程式,MFC快要在桌面程式上面失去市場份額了,現在大多使用QT來做,但是本科的時候學的就是MFC,也相對來說比較熟悉,所以就想使用MFC來寫一個簡單的單文件程式。首先我們需要在編譯的時候將USEGUISUPPORT->USEMFC勾

    MFC 自定義exe程式左上角圖示

    我使用的是vs2012。 1、首先新建一個單文件工程 2、開啟MainFrm.cpp,在OnCreat()函式中return 0;之前新增下列語句:   TCHAR path[100];   GetCurrentDirectory(255,pa

    openGL三維網格座標,旋轉,縮放,燈光設定,紋理讀取,模型讀取(MFC

    1.三維網格座標建立 2.基本3維圖形建立 3.滑鼠相應旋轉縮放 4.鍵盤相應旋轉縮放 5.燈光設定 6.紋理載入對映 7.讀取模型 關於MFC配置編寫openGL網上有很多教程 需要的函式建立一般是: OnCreat()

    MFC 新增OnPaint

    單文件中新增OnPaint()方法: 1、在xxxView.h裡新增 // 生成的訊息對映函式 protected:  DECLARE_MESSAGE_MAP() public: afx_msg void OnPaint(); 2、實現OnPaint 3、在xx

    mfc如何將view的基類由CView轉為CScrollview

     軟體環境visual Studio 2005 CScrollView這個類用於需要滾動條的場合。 如果我們的程式原來用的是CView類,此時想改成CScrollView類,需要做如下修改 第一

    MFC影象的顯示與操作

    一、建立MFC單文件工程:DIPAX 二、在DIPAX工程新增CDib類的定義及其實現。 三、在DIPAX工程MFC單文件中建立兩個檢視類,左右分開 1、首先建立類: class CDynSplitterWnd :public CSplitterWnd

    VS2010檢視增加對話方塊

    1,建立一個對話方塊類CMyFormDlg,基類為CFormView;建立類時會自動關聯生成一個對話方塊資源,IDD_MYFORMDLG 注意:基類應為CFormView 2,在MainFrm.h中的CMainFrame類中定義一個視窗拆分類: CSplit

    MFC生成多個CMFCToolbar時需要解決的問題

    1. 單文件預設生成的工具欄只有一個,但很多時候我們需要新增多個工具欄,比如: m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndFileToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndCalibrateT

    VS2010-MFC:左側可停靠對話方塊(包含樹控制元件)的實現

    在程式開發中我們經常看見有一些軟體左側有目錄樹或者是圖層樹,點選之後就可以右側View視窗顯示相關的內容,其實實現這種機制有兩種方法,第一種就是對MFC的View視窗進行視窗分割,左側的視窗view類派生於CTreeView,其中CTreeView自帶一個變數用於View中的樹控制元件的控制。第二

    OpenCV下MFC顯示影象

    1、vs2008中新建SDI,最後view類選擇ScorllView以形成帶滾動條的檢視視窗 2、新增OpenCV的連結庫 3、新增相應標頭檔案"cv.h" "highgui.h"到doc.h和view.h(要新增在.h檔案中,不要新增在.cpp中,否則容易出錯) 4、doc類中新增變數

    VC++程式固定選單欄和工具欄

    MainFrm.cpp框架類下,找到OnCreate方法 m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); m_wndToolBar.EnableDocking(

    MFC--各個類之間的獲取

    View 中獲取Doc //獲取文件類指標物件 XXXDoc *pDoc = (XXXDoc*)GetDocument(); 在Doc中 獲得 View //獲取檢視類指標物件 CUserTreeView *pTreeView; //文件其

    MFC--拆分視窗

    自定義兩個類CUserTreeView(繼承於CTreeView,顯示使用者資訊)、CMedicListView(繼承於CListView,顯示藥品資訊): 類檢視中,選中頂層資料夾 -> 右擊 -> 新增類 -> MFC -> ……

    MFC框架分析及執行流程(轉)

    原文轉自 https://blog.csdn.net/u011619422/article/details/40402705   首先來分析一下MFC單文件類的結構: 它包括如下幾個類: CAboutDlg :  對話方塊框類,對應應用程式的“幫助”->“關於”選單,彈出“關

    如何得到MFC程式中子選項卡(Tab型別)的序號

    MFC多文件程式開啟多個子文件時,每個試圖都是一個選項卡,當我們點選一個選項卡啟用它時,如何知道我們啟用的是哪一個子選項卡? 方法:在主框架視窗CMainFrame類中新增訊息處理AFX_WM_CHANGING_ACTIVE_TAB mainfrm.h中: afx_msg LRESULT

    MFC 新增按鈕

    VS 單文件 新增按鈕 今天做專案需要在單文件中建立按鈕來響應函式,即點選按鈕,呼叫某函式,特此記錄。 1. 在XXXView中新增CButton變數,例如 CButton start; 2. 下來就是 建立按鈕 了 ① 在資源 Rescource.h 中註冊一下 按鈕  #define