Jump to content
  • Advertisement
Sign in to follow this  
asdfwe

what the problem with this

This topic is 3785 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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]

Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
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).

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites
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);
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!