[ZT]VC多文檔應用中OpenGL的使用

來源:互聯網
上載者:User

---- 在應用中,有時希望對一個資料能用多種表現方式同時表示,用SDI應用程式就無法實現這一需求;而用MDI應用,則可同時開啟多個視圖,每個視圖中顯示資料的不同屬性。

---- 在MDI中使用OpenGL的關鍵有兩點:

---- 1、正確設定和管理全域變數。

---- 2、正確的裝置上下文(DC:Device Context)與繪製上下文(RC:Rendering Context)的 關聯,每個視圖管理著一個裝置上下文,而繪製上下文在整個程式運行期間只有一個,因此必須正確關聯,才能將繪製的情境正確顯示在各個視圖中。

---- 下面以一個簡單的執行個體(TestMdi)來說明這兩點。該例子的功能是對開啟的視圖進行計 數,在奇數號的視圖中顯示一個圓,偶數號的視圖中顯示一個正方形。計數器m_iCount定義 在應用程式類CTestMdiApp中,初始化為0。因為應用程式類管理整個程式,包括程式的初始 化,所以全域資料應該定義在這裡。CTestMdiApp中還需要增加一個訊息響應函數OnFileNew():

   void CTestMdiApp::OnFileNew()
   {
   m_iCount++;
   CWndApp::OnFileNew();
   }

---- 這是由MFC的訊息處理機制將訊息按CView- >CDoc- >CMainFrame- >CWndApp的順序依次發送給各 對象,由第一個有對就訊息響應的對象來處理。OnFileNew()在CWndApp中的實現是產生新的文 檔,該例中文檔類沒有自己的變數,在實際應用中通常是有一些控制視圖屬性的參數。

---- 對視圖對象CTestMdiView進行如下的改變:

---- 1) 增加成員變數
   HGLRC m_hRC; 繪製上下文控制代碼;
   CDC *m_pCDC; 裝置上下文指標;
   int m_iID;  視圖ID,該應用中建立的第幾個視圖;

---- 2) 對OnCreate(LPCREATESTRUCT lpCreateStruct)進行修改:
int CTestmdiView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{  
   .........
   // TODO: Add your specialized creation code here
  
   // OpenGL rendering context creation
   PIXELFORMATDESCRIPTOR pfd;
   int n;

   // initialize the private member
   m_pCDC = new CClientDC(this);

   // bSetupPixelFormat()建立應用所需的像素格式,並與當前裝置上下文相關聯
   if (!bSetupPixelFormat())
    return 0;

   n = ::GetPixelFormat(m_pCDC- >GetSafeHdc());

   ::DescribePixelFormat(m_pCDC->GetSafeHdc(),n,sizeof(pfd),&pfd);

   // link the Win Device Context with the OGL Rendering Context
    m_hRC = wglCreateContext(m_pCDC- >GetSafeHdc());

   // specify the target DeviceContext (window) of the subsequent OGL calls
   wglMakeCurrent(m_pCDC->GetSafeHdc(), m_hRC);
  
   //注意:在SDI應用中不需要此名,而對MDI則必不可少
   wglMakeCurrent(NULL,NULL);
  
   //獲得全域變數:計數器
   CTestmdiApp *pApp = (CTestmdiApp*)AfxGetApp();
   m_iID = pApp- >m_iCount;  
   return 0;
}

---- 3) 對OnDestroy函數修改:
void CTestmdiView::OnDestroy()
{
   // 確保刪除的是正確的視圖及其繪製上下文
   wglMakeCurrent(m_pCDC->GetSafeHdc(), m_hRC);
   if (m_hRC!=NULL)
   ::wglDeleteContext(m_hRC);

   // destroy Win Device Context
   if(m_pCDC)
    delete m_pCDC;

    .....
   //Todo: .....
}

---- 4)OnDraw()函數做如下修改:
void CTestmdiView::OnDraw()
{
   .....
   //Todo: ....
   wglMakeCurrent(m_pCDC->GetSafeHdc(), m_hRC);

   if(pApp->m_iCount%2==0)
   {
    //第偶數個視圖, 畫正方形
    DrawSquare();
   }
   else
   {
    //第奇數個視圖,畫圓
    DrawCircle();
   }
  
   //注意畫完之後立即斷開DC與RC的關聯,使其他視圖在啟用時能正確與RC相聯
   wglMakeCurrent(NULL, NULL);  
}

---- 5)PreCreateWindow(CREATESTRUCT &cs)函數:
BOOL CTestmdiView::PreCreateWindow(CREATESTRUCT& cs)
{
   // TODO: Modify the Window
   class or styles here by modifying
   //  the CREATESTRUCT cs

   //  OpenGL的要求:
   cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

   //  MDI 應用的要求:
   cs.lpszClass = AfxRegisterWndClass(CS_OWNDC | CS_HREDRAW | CS_VREDRAW);

   return CView::PreCreateWindow(cs);
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.