2012-11-13 1 views
0

스플리터를 사용하여 Childframe에 연결된 두 개의 다른 뷰에서 애플리케이션 뷰가 OpenGL 3D 모델로 나뉘어지는 애플리케이션을 만들고 싶습니다. 이 목적을 위해 부모 클래스를 뷰 클래스에서 확장하고이 클래스 안에서 모든 opengl 필수 코드를 초기화했습니다.두 개의 OpenGL 그래픽보기가있는 MFC MDI 스플리터가 작동하지 않습니다.

여기

#pragma once 

#include <gl/gl.h> 
#include <gl/glu.h> 

#define IL //when you dont want to use image library and you want to load everything by your self then remove this 

// COpenGlView view 

class COpenGlView : public CView 
{ 
    DECLARE_DYNCREATE(COpenGlView) 

protected: 
    void oglBeginRendering(); 
    COpenGlView();   // protected constructor used by dynamic creation 
    virtual ~COpenGlView(); 

/*******************/ 
     /* Private Members */ 
     /*******************/ 
     // Window information 
     CWnd *hWnd; 
     HDC hdc;   
     HGLRC hrc;   
     int m_nPixelFormat; 
     CRect m_rect; 
     CRect m_oldWindow; 
     CRect m_originalRect; 
public: 
     /******************/ 
     /* Public Members */ 
     /******************/ 
     UINT_PTR m_unpTimer; 
     // View information variables 
     float m_fLastX; 
     float m_fLastY; 
     float m_fPosX; 
     float m_fPosY; 
     float m_fZoom; 
     float m_fRotX; 
     float m_fRotY; 
     bool  m_bIsMaximized; 

     float m_fZoomSpeed; 
     float m_fRotateSpeed; 
     GLuint texture[1]; 


     void oglCreate(CRect rect, CWnd *parent,CString strWindowName=L"OpenGl"); 
     virtual void oglInitialize(void); 
     virtual void oglDrawScene(void); 
     float randFloat(const float& min, const float& max); 
     int  randInt(const int& min, const int& max); 

     void Reset(); 


     virtual void OnDraw(CDC* pDC);  // overridden to draw this view 

#ifdef _DEBUG 
    virtual void AssertValid() const; 
#ifndef _WIN32_WCE 
    virtual void Dump(CDumpContext& dc) const; 
#endif 
#endif 

protected: 
    DECLARE_MESSAGE_MAP() 
public: 
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 
    afx_msg void OnPaint(); 
    afx_msg void OnMouseMove(UINT nFlags, CPoint point); 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    afx_msg void OnTimer(UINT_PTR nIDEvent); 
    virtual void OnInitialUpdate(); 
}; 

// OpenGlView.cpp : implementation file 
// 

#include "stdafx.h" 

#include "OpenGlView.h" 



// COpenGlView 

IMPLEMENT_DYNCREATE(COpenGlView, CView) 

COpenGlView::COpenGlView() 
{ 

    m_fPosX = 0.0f;  // X position of model in camera view 
    m_fPosY = 0.0f;  // Y position of model in camera view 
    m_fZoom = 5.0f; // Zoom on model in camera view 
    m_fRotX = 0.0f;  // Rotation on model in camera view 
    m_fRotY = 0.0f;  // Rotation on model in camera view 
    m_fZoomSpeed=0.05f; 
    m_fRotateSpeed = 0.05f; 
    m_bIsMaximized = false; 

} 

COpenGlView::~COpenGlView() 
{ 
} 

void COpenGlView::Reset() 
{ 
    m_fPosX = 0.0f;  // X position of model in camera view 
    m_fPosY = 0.0f;  // Y position of model in camera view 
    m_fZoom = 5.0f; // Zoom on model in camera view 
    m_fRotX = 0.0f;  // Rotation on model in camera view 
    m_fRotY = 0.0f;  // Rotation on model in camera view 
    m_fZoomSpeed=0.05f; 
    m_fRotateSpeed = 0.05f; 
    m_bIsMaximized = false; 

} 

BEGIN_MESSAGE_MAP(COpenGlView, CView) 
    ON_WM_CREATE() 
    ON_WM_PAINT() 
    ON_WM_MOUSEMOVE() 
    ON_WM_SIZE() 
    ON_WM_TIMER() 
END_MESSAGE_MAP() 


// COpenGlView drawing 

void COpenGlView::OnDraw(CDC* pDC) 
{ 
    CDocument* pDoc = GetDocument(); 
    // TODO: add draw code here 
} 


// COpenGlView diagnostics 

#ifdef _DEBUG 
void COpenGlView::AssertValid() const 
{ 
    CView::AssertValid(); 
} 

#ifndef _WIN32_WCE 
void COpenGlView::Dump(CDumpContext& dc) const 
{ 
    CView::Dump(dc); 
} 
#endif 
#endif //_DEBUG 


// COpenGlView message handlers 

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



    return 0; 
} 

void COpenGlView::OnPaint() 
{ 
    //CPaintDC dc(this); // device context for painting 
    // TODO: Add your message handler code here 
    // Do not call CView::OnPaint() for painting messages 

    ValidateRect(NULL); 
} 

void COpenGlView::OnMouseMove(UINT nFlags, CPoint point) 
{ 
    int diffX = (int)(point.x - m_fLastX); 
    int diffY = (int)(point.y - m_fLastY); 
    m_fLastX = (float)point.x; 
    m_fLastY = (float)point.y; 


    // Left mouse button 

    if (nFlags & MK_LBUTTON) 
    { 
     m_fRotX += (float)m_fRotateSpeed * diffY; 

     if ((m_fRotX > 360.0f) || (m_fRotX < -360.0f)) 
     { 
      m_fRotX = 0.0f; 
     } 

     m_fRotY += (float)0.5f * diffX; 

     if ((m_fRotY > 360.0f) || (m_fRotY < -360.0f)) 
     { 
      m_fRotY = 0.0f; 
     } 
    } 

    // Right mouse button 
    else if (nFlags & MK_RBUTTON) 
    { 
     m_fZoom -= (float)m_fZoomSpeed * diffY; 
    } 

    // Middle mouse button 
    else if (nFlags & MK_MBUTTON) 
    { 
     m_fPosX += (float)0.05f * diffX; 
     m_fPosY -= (float)0.05f * diffY; 
    } 


    OnDraw(NULL); 


    CView::OnMouseMove(nFlags, point); 
} 

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

    if (0 >= cx || 0 >= cy || nType == SIZE_MINIMIZED) return; 

    // Map the OpenGL coordinates. 
    glViewport(0, 0, cx, cy); 

    // Projection view 
    glMatrixMode(GL_PROJECTION); 

    glLoadIdentity(); 

    // Set our current view perspective 
    gluPerspective(35.0f, (float)cx/(float)cy, 0.01f, 2000.0f); 

    // Model view 
    glMatrixMode(GL_MODELVIEW); 

    switch (nType) 
    { 
     // If window resize token is "maximize" 
     case SIZE_MAXIMIZED: 
     { 
      // Get the current window rect 
      GetWindowRect(m_rect); 

      // Move the window accordingly 
      MoveWindow(6, 6, cx - 14, cy - 14); 

      // Get the new window rect 
      GetWindowRect(m_rect); 

      // Store our old window as the new rect 
      m_oldWindow = m_rect; 

      break; 
     } 

     // If window resize token is "restore" 
     case SIZE_RESTORED: 
     { 
      // If the window is currently maximized 
      if (m_bIsMaximized) 
      { 
       // Get the current window rect 
       GetWindowRect(m_rect); 

       // Move the window accordingly (to our stored old window) 
       MoveWindow(m_oldWindow.left, m_oldWindow.top - 18, m_originalRect.Width() - 4, m_originalRect.Height() - 4); 

       // Get the new window rect 
       GetWindowRect(m_rect); 

       // Store our old window as the new rect 
       m_oldWindow = m_rect; 
      } 

      break; 
     } 
    } 
} 


void COpenGlView::oglBeginRendering() 
{ 
    SetTimer(1, 1, 0); 
} 

void COpenGlView::OnTimer(UINT_PTR nIDEvent) 
{ 
    switch (nIDEvent) 
    { 
     case 1: 
     { 
      // Clear color and depth buffer bits 
      wglMakeCurrent(hdc, hrc); 

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

      // Draw OpenGL scene 
      oglDrawScene(); 

      // Swap buffers 
      SwapBuffers(hdc); 

      glFlush(); 
      wglMakeCurrent(NULL, NULL); 



      break; 
     } 

     default: 
      break; 
    } 


    CView::OnTimer(nIDEvent); 
} 

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

    COpenGlView::oglInitialize(); 
    // TODO: Add your specialized code here and/or call the base class 
} 


void COpenGlView::oglCreate(CRect rect, CWnd *parent,CString strWindowName) 
{ 
    CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_OWNDC, NULL, (HBRUSH)GetStockObject(BLACK_BRUSH), NULL); 

    CreateEx(0, className,strWindowName, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, rect, parent, 0); 

    // Set initial variables' values 
    m_oldWindow = rect; 
    m_originalRect = rect; 

    hWnd = parent; 

    GLenum s = glGetError(); 

} 

void COpenGlView::oglInitialize(void) 
{ 
    // Initial Setup: 
    // 
    static PIXELFORMATDESCRIPTOR pfd = 
    { 
     sizeof(PIXELFORMATDESCRIPTOR), 
     1, 
     PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 
     PFD_TYPE_RGBA, 
     32, // bit depth 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     16, // z-buffer depth 
     0, 0, 0, 0, 0, 0, 0, 
    }; 


    // Get device context only once. 
    //hdc = GetDC()->m_hDC; 

    // Pixel format. 
    m_nPixelFormat = ChoosePixelFormat(hdc, &pfd); 
    SetPixelFormat(hdc, m_nPixelFormat, &pfd); 

    // Create the OpenGL Rendering Context. 
    hrc = wglCreateContext(hdc); 
    wglMakeCurrent(hdc, hrc); 

    // Basic Setup: 
    // 
    // Set color to use when clearing the background. 

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 
    glClearDepth(1.0f); 

    // Turn on backface culling 
    glFrontFace(GL_CCW); 
    glCullFace(GL_BACK); 

    // Turn on depth testing 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 

    GLenum a = glGetError(); 


    OnDraw(NULL); 

    //wglMakeCurrent(NULL, NULL); 
} 

void COpenGlView::oglDrawScene(void) 
{ 
    // Wireframe Mode 

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

    glBegin(GL_QUADS); 
      // Front Side 
      glVertex3f(1.0f, 1.0f, 1.0f); 
      glVertex3f(-1.0f, 1.0f, 1.0f); 
      glVertex3f(-1.0f, -1.0f, 1.0f); 
      glVertex3f(1.0f, -1.0f, 1.0f); 

      // Back Side 
      glVertex3f(-1.0f, -1.0f, -1.0f); 
      glVertex3f(-1.0f, 1.0f, -1.0f); 
      glVertex3f(1.0f, 1.0f, -1.0f); 
      glVertex3f(1.0f, -1.0f, -1.0f); 

      // Top Side 
      glVertex3f(1.0f, 1.0f, 1.0f); 
      glVertex3f(1.0f, 1.0f, -1.0f); 
      glVertex3f(-1.0f, 1.0f, -1.0f); 
      glVertex3f(-1.0f, 1.0f, 1.0f); 

      // Bottom Side 
      glVertex3f(-1.0f, -1.0f, -1.0f); 
      glVertex3f(1.0f, -1.0f, -1.0f); 
      glVertex3f(1.0f, -1.0f, 1.0f); 
      glVertex3f(-1.0f, -1.0f, 1.0f); 

      // Right Side 
      glVertex3f(1.0f, 1.0f, 1.0f); 
      glVertex3f(1.0f, -1.0f, 1.0f); 
      glVertex3f(1.0f, -1.0f, -1.0f); 
      glVertex3f(1.0f, 1.0f, -1.0f); 

      // Left Side 
      glVertex3f(-1.0f, -1.0f, -1.0f); 
      glVertex3f(-1.0f, -1.0f, 1.0f); 
      glVertex3f(-1.0f, 1.0f, 1.0f); 
      glVertex3f(-1.0f, 1.0f, -1.0f); 
    glEnd(); 

    glLoadIdentity(); 

    glTranslatef(0.0f, 0.0f, -m_fZoom); 
    glTranslatef(m_fPosX, m_fPosY, 0.0f); 
    glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f); 
    glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f); 

    GLenum a = glGetError(); 

} 


//-------------------------------------------------------- 

// Get an random integer within a specified range 

//-------------------------------------------------------- 

int COpenGlView::randInt(const int& min, const int& max) { 
    return ((rand()%(int)(((max) + 1)-(min)))+ (min)); 
} 

//-------------------------------------------------------- 

// Get a random float within a specified range 

//-------------------------------------------------------- 

float COpenGlView::randFloat(const float& min, const float& max) { 
    float range = max - min; 
    float num = range * rand()/RAND_MAX; 
    return (num + min); 
} 

는 그때 동급 클래스로부터 2 개 이상의 뷰 클래스를 확장 CPP이다

C3dRightView : public COpenGlView 

및 childframe 클래스 다음

C3dRightView : public COpenGlView 

I 스플리터 코드를 추가하고 th 쪼개는 사람 창에있는 2 개의 종류. 문제는 두 opengl보기 코드를 잘 작동하지만 하나 OpenGL 초기화 중 하나를 중지 한 다음 다른 하나를 표시합니다. 나는이 두 가지 다른보기 모두에서 두 가지 다른 그래픽 OpenGL 애니메이션을 표시하지 않으며 모든 것을 시도했습니다. HDC 메모리 맵을 확인한 결과 두 클래스 모두 부모를 사용하여 동적 hdc 객체를 사용하고있는 것처럼 보였습니다. 그렇지만 코드를 중지하면 다른 뷰가 제대로 표시됩니다.

상세 클래스 뷰 initialupdate 함수 내부 코드 아래 코멘트 후 다른 도면 부호가 잘 작동한다면

class C3dRightView : public COpenGlView 
{ 
    DECLARE_DYNCREATE(C3dRightView) 

protected: 
    GLuint m_left_texture[53]; 

    C3dRightView();   // protected constructor used by dynamic creation 
    virtual ~C3dRightView(); 

public: 
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view 
#ifdef _DEBUG 
    virtual void AssertValid() const; 
#ifndef _WIN32_WCE 
    virtual void Dump(CDumpContext& dc) const; 
#endif 
#endif 


protected: 
    DECLARE_MESSAGE_MAP() 
public: 
    afx_msg void OnPaint(); 
    virtual void OnInitialUpdate(); 

    void oglDrawScene(void); 
    void oglInitialize(void); 
    afx_msg void OnTimer(UINT_PTR nIDEvent); 
}; 


void C3dRightView::OnPaint() 
{ 
    CPaintDC dc(this); // device context for painting 
    // TODO: Add your message handler code here 
    // Do not call CView::OnPaint() for painting messages 
} 



void C3dRightView::OnInitialUpdate() 
{ 
    hdc = C3dRightView::GetDC()->m_hDC; 

    /** If i open below code then left view stop displaying model **/ 
     COpenGlView::OnInitialUpdate(); 
     oglInitialize(); 
    //-=-=-=-=-=-=-==--=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 

    oglBeginRendering(); 
    // TODO: Add your specialized code here and/or call the base class 
} 


void C3dRightView::oglInitialize(void) 
{ 
    COpenGlView::oglInitialize(); 

} 
void C3dRightView::oglDrawScene(void) 
{ 
    // Wireframe Mode 

    glShadeModel(GL_SMOOTH);  

    glClearColor(0.0f, 1.0f, 1.0f, 0.0f); 

    glLoadIdentity(); 
    //glTranslatef(0.0f, 0.0f, -m_fZoom);//this is for zoom using left mouse click but no placing 
    glTranslatef(m_fPosX, m_fPosY,-m_fZoom); // this is for placing + zooming using middle scroll button mouse click 

    glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);//these two for mouse movement 
    glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f); 
    glRotated(90,0.0f, 0.0f, -1.0f); 
    glRotatef(180,1.0f,0,0.0f); 
    GLenum a = glGetError(); 

    glBegin(GL_TRIANGLES);        // Start Drawing A Triangle 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Front) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Left Of Triangle (Front) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Right Of Triangle (Front) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Right) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Left Of Triangle (Right) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Right Of Triangle (Right) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Back) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Left Of Triangle (Back) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f, -1.0f);     // Right Of Triangle (Back) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Left) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f,-1.0f);     // Left Of Triangle (Left) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Right Of Triangle (Left) 
    glEnd();  

} 

아래의 두 번째보기 파일이

class C3dLeftView : public COpenGlView 
{ 
    DECLARE_DYNCREATE(C3dLeftView) 

protected: 
    GLuint m_left_texture[53]; 
    C3dLeftView();   // protected constructor used by dynamic creation 
    virtual ~C3dLeftView(); 

public: 
    virtual void OnDraw(CDC* pDC);  // overridden to draw this view 
#ifdef _DEBUG 
    virtual void AssertValid() const; 
#ifndef _WIN32_WCE 
    virtual void Dump(CDumpContext& dc) const; 
#endif 
#endif 

protected: 
    DECLARE_MESSAGE_MAP() 
public: 
    afx_msg void OnPaint(); 
    virtual void OnInitialUpdate(); 

    void oglDrawScene(void); 
    void oglInitialize(void); 
    afx_msg void OnTimer(UINT_PTR nIDEvent); 
}; 


void C3dLeftView::OnPaint() 
{ 
    CPaintDC dc(this); // device context for painting 
    // TODO: Add your message handler code here 
    // Do not call CView::OnPaint() for painting messages 
} 

void C3dLeftView::OnInitialUpdate() 
{ 
    hdc = C3dLeftView::GetDC()->m_hDC; 
    COpenGlView::OnInitialUpdate(); 
    oglInitialize(); 
    oglBeginRendering(); 
    // TODO: Add your specialized code here and/or call the base class 
} 


void C3dLeftView::oglInitialize(void) 
{ 
    COpenGlView::oglInitialize(); 


} 
void C3dLeftView::oglDrawScene(void) 
{ 
    glShadeModel(GL_SMOOTH);  

    glClearColor(0.0f, 1.0f, 0.0f, 1.0f); 

    glLoadIdentity(); 
    //glTranslatef(0.0f, 0.0f, -m_fZoom);//this is for zoom using left mouse click but no placing 
    glTranslatef(m_fPosX, m_fPosY,-m_fZoom); // this is for placing + zooming using middle scroll button mouse click 

    glRotatef(m_fRotX, 1.0f, 0.0f, 0.0f);//these two for mouse movement 
    glRotatef(m_fRotY, 0.0f, 1.0f, 0.0f); 
    glRotated(90,0.0f, 0.0f, -1.0f); 
    glRotatef(180,1.0f,0,0.0f); 
    GLenum a = glGetError(); 

    glBegin(GL_TRIANGLES);        // Start Drawing A Triangle 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Front) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Left Of Triangle (Front) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Right Of Triangle (Front) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Right) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Left Of Triangle (Right) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Right Of Triangle (Right) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Back) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Left Of Triangle (Back) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f, -1.0f);     // Right Of Triangle (Back) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Left) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f,-1.0f);     // Left Of Triangle (Left) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Right Of Triangle (Left) 
    glEnd();  

    /*************************************************************************************/ 


} 

비슷하다.

COpenGlView::OnInitialUpdate(); 
    oglInitialize(); 

부모 코드의 initialupdate 코드가 두 개가 아닌 하나의 자식에 대해 어떻게 작동하는지 확인하십시오.

답변

1

편집 : 이유는 내가 처음에 생각한 것처럼 wglMakeCurrent() 일 수는 없습니다.

oglInitialize()을 너무 많이 호출하는 이유가있을 수 있습니다. 뷰와 스플리터를 만드는 방법에 따라 다르지만 게시하지 않은 코드가 다릅니다. 이를 수정하는 한 가지 방법은보기가 실제로 "처음에 업데이트"되는 횟수를 제한하는 것입니다.

은 생성자에서 (실제로는 항상 생성자의 모든 멤버를 초기화) 0에 hdc 멤버를 초기화 :

hdc이 0 인 경우
COpenGlView::COpenGlView() 
{ 
    hdc = 0; 
    // ... etc your stuff 
} 

번만 OGL 초기화를 수행 여기

void C3dRightView::OnInitialUpdate() 
{ 
    if (hdc == 0) 
    { 
     hdc = GetDC()->m_hDC; 
     COpenGlView::OnInitialUpdate(); 
     oglBeginRendering(); 
    } 
} 

너무 :

void C3dLeftView::OnInitialUpdate() 
{ 
    if (hdc == 0) 
    { 
     hdc = GetDC()->m_hDC; 
     COpenGlView::OnInitialUpdate(); 
     oglBeginRendering(); 
    } 
} 

신뢰할 수 있어야합니다.

편집 2 : 코드를 사용해보십시오.C3dRightView::OnInitialUpdate은 내가 위에 게시 한 것과 같지 않았습니다. 초기화가 엉망이되는지 확실하지 않습니다. 미래에 당신을 도울 수있는 내 대답 :

Ontimer에서 함수 호출 pdoc->UpdateAll(NULL,NULL,NULL) 기능은 여기가 늦을 수도 있지만

if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(C3dRightView), CSize(cr.Width()/2, cr.Height()), pContext)) 
{ 
    MessageBox(L"Error setting up splitter frames!", L"Init Error!", MB_OK | MB_ICONERROR); 
    return FALSE; 
} 

// had to add this line here: 
m_wndSplitter.GetPane(0, 1)->SendMessage(WM_INITIALUPDATE); 

return TRUE; 
+0

나는 모든 것이 렌더링되는 Timer 함수에서 wglMakeCurrent를 호출합니다. 하지만 그것은 작동하지 않습니다 내 코드를 확인하고 내가 wglMaleCurrent가 누락되었다고 생각하는지 말해? 타이머는 자식 클래스에 의해 활성화되고 부모 클래스는 타이머 스레드를 처리하고 wglMakeCurrent ... 사이의 타이머 스레드 열린 gl 그리기 occours 내에서 책임이 있지만 여전히 하나의 창에서 공백으로 표시됩니다. – wolvorinePk

+0

@wolvorinePk 한 창에 렌더링 한 피라미드가 표시되지 않는다는 것을 의미합니까? 다음 무언가가 그것을 숨기고있다, 당신이 너무 많은 시간을 초기화하기 때문에 나는 신뢰한다. 나는 대답을 업데이트했다. –

+0

나는 조언을 해준 것과 똑같은 것을 시도했지만 여전히 두 가지를 보여주지는 못했다. 만약 내가이 의견을 다음 다른 작품의 의견을 초기화, 내가 dropbox에 코드를 업로드하시기 바랍니다 당신은 왜 아직도 작동하지 볼 수 있습니까? http://dl.dropbox.com/u/104183650/test.zip – wolvorinePk

-1

을하지만, 예를 들어 CChildFrame::OnCreateClient에 수정 다음은 작동하는 것 같다. pdoc은 문서 클래스에 대한 포인터입니다. 그것은 모든보기를 업데이 트하도록 요청하고, 당신은 두 창문을 얻을 것이다 :).

관련 문제