what the problem with this

Started by
37 comments, last by Crypter 16 years ago
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 ........




#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 );
} 








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]
Advertisement
please help .................
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.
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 Crypter
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).


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.
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.
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 MJP
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.


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