#include <windows.h>
#include <gl/gl.h>
HINSTANCE hInst;
LRESULT CALLBACK
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
VOID EnableOpenGL(HWND hWnd, HDC * hDC, HGLRC * hRC);
VOID DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC);
// WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int iCmdShow)
{
WNDCLASS wc;
HWND hWnd;
HDC hDC;
HGLRC hRC;
MSG msg;
BOOL bQuit = FALSE;
float theta = 0.0f;
// register window class
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "GLSample";
RegisterClass( &wc );
// create main window
hWnd = CreateWindow(
"GLSample", "OpenGL Sample",
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
0, 0, 256, 256,
NULL, NULL, hInstance, NULL);
// enable OpenGL for the window
EnableOpenGL( hWnd, &hDC, &hRC );
HWND hBtn = NULL;
hBtn = CreateWindow("BUTTON","a",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
50,50,100,25,
hWnd,
(HMENU)103,
hInst,NULL);
// program main loop
while (!bQuit)
{
// check for messages
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// handle or dispatch messages
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
// OpenGL animation code goes here
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f( 1.0f, 0.0f, 0.0f ); glVertex2f( 0.0f, 1.0f );
glColor3f( 0.0f, 1.0f, 0.0f ); glVertex2f( 0.87f, -0.5f );
glColor3f( 0.0f, 0.0f, 1.0f ); glVertex2f( -0.87f, -0.5f );
glEnd();
SwapBuffers( hDC );
}
}
// shutdown OpenGL
DisableOpenGL( hWnd, hDC, hRC );
// destroy the window explicitly
DestroyWindow( hWnd );
return msg.wParam;
}
// Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
return 0;
case WM_CLOSE:
PostQuitMessage( 0 );
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE:
PostQuitMessage( 0 );
return 0;
}
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
// Enable OpenGL
VOID EnableOpenGL( HWND hWnd, HDC * hDC, HGLRC * hRC )
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
// get the device context (DC)
*hDC = GetDC( hWnd );
// set the pixel format for the DC
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat( *hDC, &pfd );
SetPixelFormat( *hDC, iFormat, &pfd );
// create and enable the render context (RC)
*hRC = wglCreateContext( *hDC );
wglMakeCurrent( *hDC, *hRC );
}
// Disable OpenGL
VOID DisableOpenGL( HWND hWnd, HDC hDC, HGLRC hRC )
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
}
what the problem with this
i wrote a code to make a button on my opengl window like this. but the button appears only when i clicks upon its location and again disapears.........
i was trying to make a regular button which always remained on the screen .
here goes my code.. please point out the reasons for it not working ........
i tried to write the createbutton statement in wm_create but that also creates the same problem
thanks in advance
[Edited by - asdfwe on April 4, 2008 5:02:35 AM]
I think the problem here is that controls created with CreateWindow is rendered by the windows native rendering engine called GDI. When you create and initialize the OpenGL render engine, it takes over the responsibility of rendering the window and will simply overwrite any graphic that is not rendered by itself.
Mixing GDI and OpenGL rendering might be possible but it is not a common thing to do as it would be inefficient and cumbersome if at all possible. Once you have OpenGL up and running you are supposed to use OpenGL for all rendering to the window.
Mixing GDI and OpenGL rendering might be possible but it is not a common thing to do as it would be inefficient and cumbersome if at all possible. Once you have OpenGL up and running you are supposed to use OpenGL for all rendering to the window.
Quote:// create main window hWnd = CreateWindow( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 256, 256, NULL, NULL, hInstance, NULL);
The above code is wrong for OpenGL. If you are using any child controls, you need to add the WS_CLIPSIBLINGS and WS_CLIPCHILDREN flags. (Just bitwise OR them together in the above code).
Quote:Original post by CrypterQuote:// create main window hWnd = CreateWindow( "GLSample", "OpenGL Sample", WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE, 0, 0, 256, 256, NULL, NULL, hInstance, NULL);
The above code is wrong for OpenGL. If you are using any child controls, you need to add the WS_CLIPSIBLINGS and WS_CLIPCHILDREN flags. (Just bitwise OR them together in the above code).
thanks a lot ........ its been working now
also i need to know who to handle button clinks now
is there any wm_ ? case for it
please help
thanks
A button, like most of the windows controls, sends notification messages to the parent window when events occur. When a button is clicked, it sends a WM_COMMAND message where the lower-order word of the wParam is the button's id, the higher-order word of wParam is BN_CLICKED, and lParam is a handle to the button.
See the documentation for more info.
See the documentation for more info.
i tried this
case WM_COMMAND:
switch( wParam )
{
case BN_CLICKED:
MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO);
return 0;
but still on pressing the button , the messagebox did not appear
how to correct it.
case WM_COMMAND:
switch( wParam )
{
case BN_CLICKED:
MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO);
return 0;
but still on pressing the button , the messagebox did not appear
how to correct it.
Quote:Original post by asdfwe
i tried this
case WM_COMMAND:
switch( wParam )
{
case BN_CLICKED:
MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO);
return 0;
but still on pressing the button , the messagebox did not appear
how to correct it.
Like I said, BN_CLICKED shows up in the higher-order word of wParam (upper 16 bits in 32-bit Windows). You can use the HIWORD macro to get that value if you want.
Quote:Original post by MJPQuote:Original post by asdfwe
i tried this
case WM_COMMAND:
switch( wParam )
{
case BN_CLICKED:
MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO);
return 0;
but still on pressing the button , the messagebox did not appear
how to correct it.
Like I said, BN_CLICKED shows up in the higher-order word of wParam (upper 16 bits in 32-bit Windows). You can use the HIWORD macro to get that value if you want.
u did not answer my question :)
I did answer your question: use the HIWORD macro.
case WM_COMMAND: switch( HIWORD(wParam) ) { case BN_CLICKED: MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO); }
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement