In our previous articles, we have discussed linking OpenGL-related files to the Project and preparing the MFC Dialog to display the OpenGL graphics. You must read the below articles before you continue reading this article.
OpenGL – How to draw on MFC dialog? – Linking opengl32.lib
OpenGL – How to draw on MFC dialog? – Prepare to draw the Graphics
Through this article, I want to put it all together with a working code example. And also you will see the screenshot of it, at the end.
Include OpenGL header file(s)
Step 1. OpenGL function declarations are declared in the header file “gl.h” and it has to be included in the Project to enable to use of the OpenGL functions.
#include <gl/gl.h>
Link opengl32.lib file to the Project
Step 2. To load, opengl32.dll to the Project; where OpenGL functions are defined; we need to add opengl32.lib file to our Project.
Open Project properties, then expand Configuration properties; and then expand Linker. Select Input option; then add “opengl32.lib” into “Additional Dependencies” field. Press the OK button to apply the changes.
Prepare to draw OpenGL graphics
Step 3. Prepare the MFC dialog to draw the OpenGL graphics.
BOOL COpenGLDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//{{ OpenGL - Prepare to draw
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1, // version number
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL // support OpenGL
PFD_TYPE_RGBA, // RGBA type
24, // 24-bit color depth
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32, // 32-bit z-buffer
0, 0, 0, 0, 0, 0, 0
};
CDC *pDC = this->GetDC();
if ( pDC != NULL )
{
HDC hdc = pDC->GetSafeHdc();
if ( hdc != NULL )
{
int ipf = ChoosePixelFormat(hdc, &pfd);
if ( ipf != 0 )
{
if ( SetPixelFormat(hdc, ipf, &pfd) == TRUE )
{
HGLRC hglrc = wglCreateContext(hdc);
if ( hglrc != NULL )
wglMakeCurrent(hdc, hglrc);
}
}
}
this->ReleaseDC(pDC);
}
//}} OpenGL
return TRUE; // return TRUE unless you set the focus to a control
}Draw the scene
Step 4. Using gl functions we are going to draw graphics on the MFC dialog. glRectf function is used to draw the rectangle. Observe the values passed to this function; all are float values.
glColor3f function is used to set the color value; it considers R (Red), G (Green), and B (Blue) components to display the color.
Finally, we used glFlush function to empty the commands in the command buffer, and execute them immediately.
void COpenGLDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
//{{ OpenGL - Draw the scene
{
glColor3f(0.0f, 1.0f, 0.0f);
glRectf(-1.0f, -1.0f, 1.0f, 1.0f);
glFlush();
}
//}} OpenGL
}
}Delete rendering context
Step 5. Delete the rendering context. This we can delete only when NO current rendering context is selected for the calling thread.
void COpenGLDlg::OnDestroy()
{
//{{ OpenGL - Clean up
CDC *pDC = this->GetDC();
if ( pDC != NULL )
{
HDC hdc = pDC->GetSafeHdc();
if ( hdc != NULL )
{
HGLRC hglrc = wglGetCurrentContext();
if ( hglrc != NULL )
{
if ( wglMakeCurrent(NULL, NULL) == TRUE )
wglDeleteContext(hglrc);
}
}
this->ReleaseDC(pDC);
}
//}} OpenGL
CDialogEx::OnDestroy();
}Step 6. Now we have the complete code, in-place. Build the application and run the project. You will see a green color-filled rectangle; drawn on the MFC dialog. The screenshot of it is, below;

// Malin