1. 程式人生 > >MFC的對話方塊中使用OpenGL繪圖

MFC的對話方塊中使用OpenGL繪圖

接寫來我將分享一點我的實現:

1、首先當然要設定好OpenGL的程式設計環境;

2、新建一個基於對話方塊的工程,我選擇VS studio平臺;

3、選著Project->add->class,新增一個新類,取名為MyOpenGL,選著基類為CWnd

4利用VS的類嚮導給MyOpenGL新增OnCreate()和OnPaint()函式;

5、在MyOpenGL.h中新增成員變數

  1. class MyOpenGL :  
  2.     public CWnd  
  3. {  
  4. public:  
  5.     MyOpenGL(void);  
  6.     ~MyOpenGL(void);  
  7.     //////////////////////////////////////////////////////////////////////////
  8.     //成員變數
  9.     int MySetPixelFormat(HDC hDC);  
  10.     void Rendercene();  
  11.     HDC hdc;  
  12.     HGLRC hglrc;  
  13.     //////////////////////////////////////////////////////////////////////////
  14.     GLfloat step,s;  
  15.     DECLARE_MESSAGE_MAP()  
  16. public:  
  17.     afx_msg void OnPaint();  
  18.     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
  19. };  

6、MyOpenGL.cpp中假如以下程式碼:

6.1

  1. MyOpenGL::~MyOpenGL(
    void)  
  2. {  
  3.     wglMakeCurrent(NULL,NULL);  
  4.     wglDeleteContext(hglrc);//刪除渲染描述表
  5.     ::ReleaseDC(m_hWnd,hdc);//釋放裝置描述表
  6. }  
6.2在OnCreate中加入
  1. int MyOpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2. {  
  3.     if (CWnd::OnCreate(lpCreateStruct) == -1)  
  4.         return -1;  
  5.     // TODO:  Add your specialized creation code here
  6.     if(MySetPixelFormat(::GetDC(m_hWnd))==FALSE)  
  7.         return 0;  
  8.     // 獲得繪圖描述表
  9.     hdc = ::GetDC(m_hWnd);  
  10.     // 建立渲染描述表
  11.     hglrc = wglCreateContext(hdc);  
  12.     // 使繪圖描述表為當前呼叫現程的當前繪圖描述表 
  13.     wglMakeCurrent(hdc, hglrc);   
  14.     return 0;  
  15. }  


6.3  在OnPaint()加入
  1. void MyOpenGL::OnPaint()  
  2. {  
  3.     //CPaintDC dc(this); // device context for painting
  4.     // TODO: Add your message handler code here
  5.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除顏色快取和深度快取
  6.     Rendercene();  
  7.     glPopMatrix();  
  8.     glFlush();  
  9.     SwapBuffers(hdc);  
  10.     // Do not call CWnd::OnPaint() for painting messages
  11. }  

6.4 成員函式實現程式碼
  1. int MyOpenGL::MySetPixelFormat(HDC hDC)  
  2. {  
  3.     PIXELFORMATDESCRIPTOR pixelDesc;  
  4.     pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);  
  5.     pixelDesc.nVersion = 1;  
  6.     pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |   
  7.         PFD_SUPPORT_OPENGL |  
  8.         PFD_DOUBLEBUFFER |  
  9.         PFD_TYPE_RGBA;  
  10.     pixelDesc.iPixelType = PFD_TYPE_RGBA;  
  11.     pixelDesc.cColorBits = 32;  
  12.     pixelDesc.cRedBits = 0;  
  13.     pixelDesc.cRedShift = 0;  
  14.     pixelDesc.cGreenBits = 0;  
  15.     pixelDesc.cGreenShift = 0;  
  16.     pixelDesc.cBlueBits = 0;  
  17.     pixelDesc.cBlueShift = 0;  
  18.     pixelDesc.cAlphaBits = 0;  
  19.     pixelDesc.cAlphaShift = 0;  
  20.     pixelDesc.cAccumBits = 0;  
  21.     pixelDesc.cAccumRedBits = 0;  
  22.     pixelDesc.cAccumGreenBits = 0;  
  23.     pixelDesc.cAccumBlueBits = 0;  
  24.     pixelDesc.cAccumAlphaBits = 0;  
  25.     pixelDesc.cDepthBits = 0;  
  26.     pixelDesc.cStencilBits = 1;  
  27.     pixelDesc.cAuxBuffers = 0;  
  28.     pixelDesc.iLayerType = PFD_MAIN_PLANE;  
  29.     pixelDesc.bReserved = 0;  
  30.     pixelDesc.dwLayerMask = 0;    
  31.     pixelDesc.dwVisibleMask = 0;  
  32.     pixelDesc.dwDamageMask = 0;  
  33.     int iPixelFormat;   
  34.     // 為裝置描述表得到最匹配的畫素格式 
  35.     if((iPixelFormat = ChoosePixelFormat(hDC, &pixelDesc)) == 0)  
  36.     {  
  37.         MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);  
  38.         return FALSE;  
  39.     }  
  40.     // 設定最匹配的畫素格式為當前的畫素格式 
  41.     if(SetPixelFormat(hDC, iPixelFormat, &pixelDesc) == FALSE)  
  42.     {  
  43.         MessageBox("SetPixelFormat Failed", NULL, MB_OK);  
  44.         return FALSE;  
  45.     }  
  46.     return TRUE;  
  47. }  


  1. void MyOpenGL::Rendercene()  
  2. {  
  3.     glBegin(GL_LINES);  
  4.     glVertex2f(-0.5f,-0.3f);  
  5.     glVertex2f(0.4f,0.6f);  
  6.     glEnd();  
  7. }  


7.在對話方塊的標頭檔案里加入:#include MyOpenGL.h

新增成員變數 MyOpenGL*  m_GL;

然後在其OnCreate()函式中初始化:

  1. int CMFC_GL_TestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)  
  2. {  
  3.     if (CDialog::OnCreate(lpCreateStruct) == -1)  
  4.         return -1;  
  5.     // TODO:  Add your specialized creation code here
  6.     // 定義OpenGL繪圖視窗的矩形大小
  7.     //此段語句放在OnInitDialog(),或者OnCreate中
  8.     CRect rect(0,0,300,300);  
  9.     m_GL=new MyOpenGL;//用New的方式建立
  10.     m_GL->Create( NULL,   //預設的視窗
  11.         NULL,   //無視窗名稱
  12.         WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE,  
  13.         // 定義視窗風格
  14.         rect,   // 視窗的大小
  15.         this,   // 指定當前對話方塊為其父視窗指標
  16.         0);     
  17.     return 0;  
  18. }  


接下來就可以運行了。

效果圖:

相關推薦

MFC對話方塊顯示網頁

用到ActiveX 控制元件,向對話方塊裡面插入一個 WebBrowser控制元件,之後使用就可以了! 利用WebBrowser控制元件建立自己的瀏覽器 ①新建一個基於對話方塊的工程,命名為test,然後在對話方塊上單擊右鍵,選擇 Insert ActiveX Contr

如何在mfc對話方塊新增一個顯示網頁的視窗

這個要用到 ActiveX 控制元件了,向對話方塊裡面插入一個 WebBrowser控制元件,之後使用就可以了!=============================利用WebBrowser控制元件建立自己的瀏覽器①新建一個基於對話方塊的工程,命名為test,然後在對話方塊上單擊右鍵,選擇Insert A

MFC 對話方塊顯示系統當前時間

轉載來自:http://blog.csdn.net/bbsview/article/details/7886149 對話方塊中編輯框ID為IDC_TIME,關聯變數為CString的m_time 在OnInitDialog()中新增程式碼:       CString st

MFC對話方塊改變對話方塊,Group Box, Static Text, Check Box, Edit Ctrl(disabled), Combo Box(disabled), Radio Button等控制元件背景色

VC 設定 Dialog, Group Box, Static Text, Check Box, Edit Ctrl(disabled), Combo Box(disabled), Radio Button等背景色 編寫WM_CTLCOLOR訊息的對映函式OnCtlColor

MFC&Qt混合程式設計》 part1 MFC對話方塊嵌入Qt視窗控制元件

《MFC&Qt混合程式設計》 part1 MFC對話方塊中嵌入Qt視窗控制元件 1、環境配置:VS2010,Qt4.8.4_win64,Qt_VS_Addin_1.1.11 2、建立的MFC對話方塊程式 3、輸出為x64的debug&r

MFC對話方塊使用OpenGL繪圖

接寫來我將分享一點我的實現: 1、首先當然要設定好OpenGL的程式設計環境; 2、新建一個基於對話方塊的工程,我選擇VS studio平臺; 3、選著Project->add->class,新增一個新類,取名為MyOpenGL,選著基類為CWnd 4利用VS的類嚮導給MyOpenGL新增OnC

MFC對話方塊程式使用OpenGL

        在MFC的對話方塊程式中需要使用OpenGL在某個對話方塊中作圖,綜合了網上的兩篇文章的內容(文章一,文章二),也有自己的心得體會。         首先需要配置好opengl的環境,程式中會使用到glaux中的庫和函式,這裡將它的lib,h,dll檔案的下

BCGControlBar教程:如何將MFC控制元件的BCGControlBarBCGSuite新增到對話方塊

BCGControlBar Pro for MFC最新試用版下載請猛戳>>> 如果您正在使用我們的Windows窗體產品,那麼將我們的控制元件新增到窗體是沒有問題的:只需從Visual Studio工具箱中拖動所需的專案並將其放入窗體即可。在對話方塊中新增非標準控制元件需要一些

BCGControlBar教程:將MFC控制元件的BCGControlBar / BCGSuite新增到對話方塊

BCGControlBar Pro for MFC最新試用版下載請猛戳>>> 如果正在使用我們的Windows Forms產品,那麼將我們的控制元件新增到窗體是沒有問題的:只需從Visual Studio工具箱中拖動所需的專案並將其拖放到窗體中即可。 但是,MFC開發人員的生活

VC/MFC對話方塊建立檢視並在檢視區新增ListCtrl控制元件

自定義的view類用於顯示在對話方塊上 class CGroupMenuView : public CScrollView { protected:  CGroupMenuView(); ……………… ………… };   class CWorkView :

MFC 對話方塊Picture Control(圖片控制元件)靜態和動態顯示Bmp圖片

        最近有同學問我如何實現MFC基於對話方塊在圖片控制元件中載入圖片?其實使用MFC顯示圖片的方法各種各樣,但是還是有些同學不知道怎樣顯示.以前在《數字影象處理》課程中完成的軟體都是基於單

MFC對話方塊怎樣加入背景音樂

第一步:新增標頭檔案與庫檔案 #include "vfw.h"#pragma comment (lib,"vfw32.lib")第二步:在對話方塊類加上變數HWND hMCI;第三步:在對話方塊初始話的地方如此hMCI = MCIWndCreate(NULL, NULL,WS

MFC學習筆記之多對話方塊使用定時器

MFC菜鳥第一次發貼,請各位高人指教:我需要做一個基於對話方塊的程式,主對話方塊TimerTryDlg上就兩個按鈕,確定鈕按下後執行訊息處理OnFirstOK(),先初始化定時器,再開啟有模式對話方塊TestDlg,定時器時間到了執行OnTimer-在子對話方塊上的一個靜態控制元件上畫點,但OnTimer在

VS2008MFC對話方塊介面程式設計Caption中文亂碼的解決辦法

  最近在使用VS2008編寫一個基於對話方塊的程式時,在對話方塊中新增Static控制元件,編寫其Caption時寫中文的話會出現亂碼。    在預覽狀態下(快捷鍵是Ctrl+T)可能看到中文,但是編譯執行後對話方塊中的中文全是問號。 即使你用的VS2008中文版,即使

MFC對話方塊建立點陣圖按鈕

1.可新建一個類ImageButton(繼承自CButton),並設定其風格為自繪: ModifyStyle(0,BS_OWNERDRAW);ImageButton.h:class ImageButton : public CButton{private: public: I

MFC對話方塊程式當滑鼠移動到控制元件上後改變形狀

處理父視窗的WM_SETCURSOR訊息:      BOOL   CYourDlg::OnSetCursor(CWnd*   pWnd,   UINT   nHitTest,   UINT   message)        {          //   TODO:   Add   your   me

[MFC]在程式訪問對話方塊的控制元件——GetDlgItem函式

1. 使用GetDlgItem函式來訪問對話方塊中的控制元件:     1) 函式原型:CWnd* CWnd::GetDlgItem(int nID) const;     2) 只要引數指定為要訪問的控制元件的ID,即可返回該控制元件的指標,但要注意的是返回的是CWnd*

MFC對話方塊程式的OnCreate和OnInitDialog函式

        最近做一個簡單的專案,需要使用到MFC。雖說這個東西已經很老舊了,但是為了專案使用,開始學它。需要將一個osg三維檔案顯示在控制元件中,這裡使用編輯框空間,除錯過程中遇到了CEdit

vs2010單文件新增對話方塊並在對話方塊新增屬性框(標籤框)

1.建立單文件Demo 在資源檢視Dialog中插入兩個Dialoge,Style設定為child,Border設定為chill。為兩個對話方塊分別新增類,基類為CPropertyPage,類名CP1,CP2。在P1的標頭檔案新增 #include "resource.h" 2.在類檢視中在De

vs2010對話方塊新增屬性頁

方法一 1.建立對話方塊(style child,Border Thin),新增類CProperty 2.在主對話方塊中.cpp,包含兩個子對話方塊的標頭檔案 CPropertySheet sheet; CPage pag