Hello everyone! Whenever I change the background color from the popup menu, part of the menu remains on the window. Does anyone know why and how that can be fixed? The code is enclosed below. Any help is appreciated as well, ;-).
X3J16
#include <windows.h>
#include <gl\gl.h>
#define WND_X_POS 20
#define WND_Y_POS 20
#define WND_HEIGHT 480
#define WND_WIDTH 400
#define WHITE_BKGND 0
#define BLACK_BKGND 1
#define IDM_BKGND_WHITE 100
#define IDM_BKGND_BLACK 101
#define IDM_APP_EXIT 102
static LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
static const char g_szWndClsName[] = “my_window_class”;
static const char g_szWndCaption[] = “;-)”;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pszCmdLine, int iShowCmd)
{
WNDCLASS wc;
HWND hwnd;
MSG msg;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szWndClsName;
RegisterClass(&wc);
hwnd = CreateWindow(g_szWndClsName, g_szWndCaption,
WS_OVERLAPPEDWINDOW,
WND_X_POS, WND_Y_POS,
WND_WIDTH, WND_HEIGHT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iShowCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
static HMENU CreateOpenGLPopupMenu(VOID);
static VOID SetWindowPixelFormat(HDC);
static VOID RenderOpenGLFace(HDC, UCHAR);
static LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HMENU hPopupMenu = NULL;
static HDC hDC = NULL;
static HGLRC hGLRC = NULL;
static UCHAR BkgndColor = WHITE_BKGND;
POINT pt;
switch (uMsg) {
case WM_CREATE:
hDC = GetDC(hWnd);
SetWindowPixelFormat(hDC);
hGLRC = wglCreateContext(hDC); /* Create OpenGL rendering context and */
wglMakeCurrent(hDC, hGLRC); /* make it current for this thread. */
hPopupMenu = CreateOpenGLPopupMenu();
return 0;
case WM_SIZE:
glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0F, 1.0F, 0.0F, 1.0F, -1.0F, 1.0F);
return 0;
case WM_PAINT:
RenderOpenGLFace(hDC, BkgndColor);
ValidateRect(hWnd, NULL);
return 0;
case WM_RBUTTONUP:
pt.x = LOWORD(lParam);
pt.y = HIWORD(lParam);
ClientToScreen(hWnd, &pt);
TrackPopupMenu(hPopupMenu, TPM_LEFTBUTTON, pt.x, pt.y,
0, hWnd, NULL);
return 0;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_BKGND_WHITE:
BkgndColor = WHITE_BKGND;
CheckMenuItem(hPopupMenu, IDM_BKGND_BLACK, MF_UNCHECKED);
CheckMenuItem(hPopupMenu, IDM_BKGND_WHITE, MF_CHECKED);
break;
case IDM_BKGND_BLACK:
BkgndColor = BLACK_BKGND;
CheckMenuItem(hPopupMenu, IDM_BKGND_WHITE, MF_UNCHECKED);
CheckMenuItem(hPopupMenu, IDM_BKGND_BLACK, MF_CHECKED);
break;
case IDM_APP_EXIT:
SendMessage(hWnd, WM_CLOSE, 0, 0);
return 0;
default:
break;
}
InvalidateRect(hWnd, NULL, FALSE);
return 0;
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
SendMessage(hWnd, WM_CLOSE, 0, 0);
break;
case WM_DESTROY:
wglMakeCurrent(NULL, NULL); /* Detach the current rendering context */
wglDeleteContext(hGLRC); /* from the thread and delete it. */
ReleaseDC(hWnd, hDC);
DestroyMenu(hPopupMenu);
PostQuitMessage(0);
return 0;
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
static HMENU CreateOpenGLPopupMenu(VOID)
{
struct {
UINT uFlags;
UINT uItemID;
PCSTR pszMenuText;
} MenuOptions[] = {
MF_STRING | MF_CHECKED, IDM_BKGND_WHITE, “White Background”,
MF_STRING, IDM_BKGND_BLACK, “Black Background”,
MF_SEPARATOR, 0, NULL,
MF_STRING, IDM_APP_EXIT, “Exit”
};
HMENU hPopupMenu;
int i;
hPopupMenu = CreatePopupMenu();
for (i = 0; i < sizeof MenuOptions / sizeof MenuOptions[0]; ++i)
AppendMenu(hPopupMenu,
MenuOptions[i].uFlags,
MenuOptions[i].uItemID,
MenuOptions[i].pszMenuText);
return hPopupMenu;
}
static VOID SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), /* Size of this pfd /
1, / Version number /
PFD_DRAW_TO_WINDOW | / Support window /
PFD_SUPPORT_OPENGL | / Support OpenGL /
PFD_DOUBLEBUFFER, / Double buffered /
PFD_TYPE_RGBA, / RGBA type /
24, / 24-bit color depth /
0, 0, 0, 0, 0, 0, / Color bits ignored /
0, / No alpha buffer /
0, / Shift bit ignored /
0, / No accumulation buffer /
0, 0, 0, 0, / Accum bits ignored /
32, / 32-bit z-buffer /
0, / No stencil buffer /
0, / No auxiliary buffer /
PFD_MAIN_PLANE, / Main layer /
0, / Reserved /
0, 0, 0 / Layer masks ignored */
};
int iPixelFormat;
/*
Get the device context's best available pixel format match and make
that match the device context's current pixel format.
*/
iPixelFormat = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, iPixelFormat, &pfd);
}
static VOID RenderOpenGLFace(HDC hDC, UCHAR BkgndColor)
{
static const GLfloat WhiteBkgndColor[3] = { 1.0F, 1.0F, 1.0F },
BlackBkgndColor[3] = { 0.0F, 0.0F, 0.0F };
if (BkgndColor == WHITE_BKGND)
glClearColor(WhiteBkgndColor[0], WhiteBkgndColor[1], WhiteBkgndColor[2], 0.0F);
else
glClearColor(BlackBkgndColor[0], BlackBkgndColor[1], BlackBkgndColor[2], 0.0F);
glClear(GL_COLOR_BUFFER_BIT);
glFlush();
SwapBuffers(hDC);
}