OpenGL control on split MFC form
-
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
-
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
Since all this code is based on CodeProject articles you may get more help by using the forum at the end of the article. Also, you should not call
OnDraw()
directly, you should use the standard Windows rules for updating Windows. See UpdateWindow function (Windows)[^]. -
Since all this code is based on CodeProject articles you may get more help by using the forum at the end of the article. Also, you should not call
OnDraw()
directly, you should use the standard Windows rules for updating Windows. See UpdateWindow function (Windows)[^].??? Richard, Was this post meant for me? I NEVER use OnDraw directly, and my App is not at all based on Code Project Articles! I am just feeling around on my own, to solve a particular problem. If it IS meant for me a sentence containing "Wrong End" and "Stick" springs to mind! About Code Project Articles, I Only suggested, that, if I ever get this to work, that it merits me submitting an article about how to avoid the pittfals! :)
Bram van Kampen