I am trying to build an MFC application the uses a form with two panes, one for controls and the other for an OpenGL graphics window. I followed 2 code project for this task.
- 15338/SDI-with-split-window by kencocomputers
- Setting up OpenGL in an MFC control from codeguru C10975
The split window application part worked fine but I cannot initialize the openGL context in the graphics pane.
The classes in the project are:
- CAboutDlg
- CFormLeft
- CFormRight
- CMainForm
- CMFC_SurfaceViwerApp
- COpenGLControl
CFormLeft and CFormRight views are created in the CManFrame function
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
Specifically with:
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CFormLeft), CSize(300, 100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CFormRight), CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
My question is how to actually implement the OpenGL Window; I suspect that it requires some code like:
void COpenGLControl::oglInitialize()
{
// 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);
// Send draw request
OnDraw(NULL);
}
But how does it activate? I put a call inside the oglCreate() function but nothing happened.
void COpenGLControl::oglCreate(CRect rect, CWnd *parent)
{
CString className = AfxRegisterWndClass(CS_HREDRAW |
CS_VREDRAW | CS_OWNDC, NULL,
(HBRUSH)GetStockObject(BLACK_BRUSH), NULL);
CreateEx(0, className, L"OpenGL", WS\_CHILD | WS\_VISIBLE |
WS\_CLIPSIBLINGS | WS\_CLIPCHILDREN, rect, parent, 0);
// Set initial variables' values
m\_oldWindow = rect;
m\_originalRect = re