[Plib-users] Problem with a PUI-Win32-Native
Brought to you by:
sjbaker
|
From: <pos...@ca...> - 2008-02-29 11:22:54
|
Hi all,
I integrated plib into my GLUT-based application. It works GREAT. I'm one more
happy user in my sandbox.
Now, problem arises when integrating inside a WIN32 application, whose windows
does (and will, probably) not be wrapped with GLUT.
The following code below, using basis example, illustrates the problem :
a device context gets created, some opengl is painted inside, and the gui (a
button and a menu) gets called.
Running the application : the gui shows up.
when I check if a gui's element is hit by a mouse clic, the puMouse(..) returns
correct, identifying wether an element was clicked or not.
But no objects callbacks occurs and the submenu stays invisible. The menu is
hilighted when the mouse points over and the buttonbox can be checked.
What am I doing wrong ?
/* PUI - WIN32 - NO GLUT */
#pragma comment ( lib, "fnt.lib" )
#pragma comment ( lib, "pui.lib" )
#pragma comment ( lib, "sg.lib" )
#pragma comment ( lib, "ul.lib" )
#define PU_USE_NATIVE
#include <plib/pu.h>
#include<windows.h>
#include<gl/gl.h>
#include<gl/glu.h>
void Render();
bool InitializeGL();
HDC g_HDC;
float xRotation = 0.0f;
float yRotation = 0.0f;
int gWidth = 0;
int gHeight = 0;
void button_cb(puObject *) {MessageBox(NULL,"ok","ok",MB_OK);}
void foo_cb (puObject *) {MessageBox(NULL,"foo","foo",MB_OK);}
void bar_cb (puObject *) {MessageBox(NULL,"bar","bar",MB_OK);}
void exit_cb (puObject *) {exit(0);}
char *file_submenu [] = { "Exit","foo","bar", NULL } ;
puCallback file_submenu_cb[] = { exit_cb, foo_cb, bar_cb, NULL } ;
char * PUIlabels[5] = { "Label1", "Label2", "This is Label3", "Four", NULL } ;
puMenuBar * menu;
puOneShot *b;
puButtonBox * checkList;
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of structure.
1, // always 1.
PFD_DRAW_TO_WINDOW | // support window
PFD_SUPPORT_OPENGL | // support OpenGl
PFD_DOUBLEBUFFER, // support double buffering
PFD_TYPE_RGBA, // support RGBA
16, // bit color mode
0, 0, 0, 0, 0, 0, // ignore color bits
0, // no alpha buffer
0, // ignore shift bit
0, // no accumulation buffer
0, 0, 0, 0, // ignore accumulation bits.
16, // number of depth buffer bits.
0, // number of stencil buffer bits.
0, // 0 means no auxiliary buffer
PFD_MAIN_PLANE, // The main drawing plane
0, // this is reserved
0, 0, 0 }; // layer masks ignored.
// this chooses the best pixel format and returns index.
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
// This set pixel format to device context.
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; // Rendering context.
static HDC hDC; // Device context.
int width, height; // The window width and height.
static POINT oldMousePos; // Last mouse position.
static POINT currentMousePos; // Current mouse position.
static bool isMouseActive; // Is the left mouse button down.
switch(message)
{
case WM_CREATE: // Windows creation.
hDC = GetDC(hwnd); // This gets the device context for our window.
g_HDC = hDC; // Assigns the global device context to this
one.
SetupPixelFormat(hDC); // Call the pixel format function.
hRC = wglCreateContext(hDC); // Creates the rendering context.
wglMakeCurrent(hDC, hRC); // Makes the rendering context.
return 0;
break;
case WM_CLOSE: // Close message.
case WM_DESTROY:
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC); // Deletes the rendering context.
PostQuitMessage(0); // Says close the program.
return 0;
break;
case WM_SIZE: // re-size message.
height = HIWORD(lParam); // This gets the height of the window.
width = LOWORD(lParam); // This gets the width of the window.
if(height == 0) // we don't want it to be possible for a
{ // height of 0. If it is 0 me make it 1.
height = 1;
}
gHeight = height;
gWidth = width;
puSetWindowSize ( width, height ) ;
glViewport(0, 0, width, height);// resets the viewport to new dimensions.
glMatrixMode(GL_PROJECTION); // Sets the projection matrix.
glLoadIdentity(); // Reset the modelview matrix.
// calculate the aspect ratio of the window.
gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
break;
}
break;
case WM_LBUTTONDOWN:
oldMousePos.x = currentMousePos.x = LOWORD (lParam);
oldMousePos.y = currentMousePos.y = HIWORD (lParam);
if( puMouse ( 1, PU_DOWN, currentMousePos.x, currentMousePos.y ))
//{ }//MessageBox(NULL,"DOWN","down",MB_OK); }
isMouseActive = true;
break;
case WM_LBUTTONUP:
currentMousePos.x = LOWORD (lParam);
currentMousePos.y = HIWORD (lParam);
if( puMouse ( 1, PU_UP, currentMousePos.x, currentMousePos.y ))
{}// MessageBox(NULL,"UP","UP",MB_OK); }
isMouseActive = false;
break;
case WM_MOUSEMOVE:
currentMousePos.x = LOWORD (lParam);
currentMousePos.y = HIWORD (lParam);
if(isMouseActive)
{
xRotation -= (currentMousePos.x - oldMousePos.x);
yRotation -= (currentMousePos.y - oldMousePos.y);
}
oldMousePos.x = currentMousePos.x;
oldMousePos.y = currentMousePos.y;
puMouse(currentMousePos.x,currentMousePos.y);
break;
default: break;
}
// What this does is pass all of the unhandled messages to DefWindowProc
return (DefWindowProc(hwnd, message, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nShowCmd)
{
MSG msg; // A message variable.
WNDCLASSEX windowClass; // Your Window class.
HWND hwnd; // The Window handle.
bool isFinished; // True then exit.
windowClass.cbSize = sizeof(WNDCLASSEX); // size of the WNDCLASSEX
structure.
windowClass.style = CS_HREDRAW | CS_VREDRAW; // style of the window.
windowClass.lpfnWndProc = WndProc; // Address to the windows
procedure.
windowClass.cbClsExtra = 0; // Extra class information.
windowClass.cbWndExtra = 0; // Extra window information.
windowClass.hInstance = hInstance; // Handle of application
Instance.
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);// Handle of application
Icon.
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);// mouse cursor
windowClass.hbrBackground = NULL; // background color.
windowClass.lpszMenuName = NULL; // name of the main menu.
windowClass.lpszClassName = "puitest";// window class name.
windowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);// icon when minimized.
if(!RegisterClassEx(&windowClass)) return 0;
// Create the window.
hwnd = CreateWindowEx(NULL,// The extended window style.
"puitest",// window Class name.
"a problem",// window name.
WS_OVERLAPPEDWINDOW | WS_VISIBLE |// The window style.
WS_SYSMENU | WS_CLIPCHILDREN |// window style.
WS_CLIPSIBLINGS,// window style.
100, 100,// window x, y coordinate.
640, 480,// window width and height.
NULL,// handle to parent window.
NULL,// menu.
hInstance,// handle to app instance.
NULL); // pointer to window creation data.
if(!hwnd) return 0;
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
isFinished = false;
if(!InitializeGL()) isFinished = true;
while(!isFinished)
{
if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
isFinished = true;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else Render();
}
return (int)msg.wParam;
}
bool InitializeGL()
{
puInit ();
menu = new puMenuBar(-1);
menu->add_submenu ( "File", file_submenu, file_submenu_cb ) ;
menu->close();
b = new puOneShot ( 0, 0, "say hello") ;
b -> setCallback ( button_cb ) ;
checkList = new puButtonBox ( 50, 50, 200, 200, PUIlabels, 0 ) ;
glClearColor(0.6f, 0.6f, 0.8f, 0.0f); // Clear the screen to black.
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
return true;
}
void Render()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
glRotatef(-yRotation, 1.0f, 0.0f, 0.0f);
glRotatef(-xRotation, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f);
glEnd();
puDisplay () ;
SwapBuffers(g_HDC);
}
|