• Advertisement
Sign in to follow this  

what the problem with this

This topic is 3612 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
but now another prob arised

even when i click my menu bar (new) it shows button pressed

actually i tried this


switch (message) /* handle the messages */
{



case WM_COMMAND:

switch( HIWORD(wParam) )
{
case BN_CLICKED:
MessageBox(hwnd,"button pressed","As",MB_ICONEXCLAMATION | MB_YESNO);
return 0;


}
switch( wParam )
{

case IDM_FILENEW:

// my rest of the code












how to correct it
thanks

Share this post


Link to post
Share on other sites
Quote:
Original post by MJP
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.


If you want the control's ID, use the LOWORD macro.

Share this post


Link to post
Share on other sites

but suppose i have more than 1 button on my window then how to find which one was pressed

thanks

Share this post


Link to post
Share on other sites
Quote:
Original post by MJP
Quote:
Original post by MJP
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.


If you want the control's ID, use the LOWORD macro.


Share this post


Link to post
Share on other sites
Look at this:


hBtn = CreateWindow( "BUTTON",
"a",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
50, 50, 100, 25,
hWnd,
(HMENU)103,
hInst,
NULL );


That "103" right there: that's the ID you've assigned the button. When you get a WM_COMMAND message from a control, such as a button, the lower-order word of the wParam is this ID you've assigned the control. This is all covered in the documentation for WM_COMMAND, as well as in the documentation for the control notification messages. If you get this ID by using the LOWORD macro, you should be able to determine which control sent it.

Share this post


Link to post
Share on other sites
thanks , it is now working
i wanted to know how to make a button having a bitmap image on it

i tried this
hBtn = CreateWindow("BUTTON","and",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP ,
0,0,50,35,
hWnd,
(HMENU)103,
// NULL,
hInstance,NULL);

but now dont know how to proceed further?
how to do it
thanks

Share this post


Link to post
Share on other sites
i ahve already seen that but cant understood
can u give a example please

thanks

Share this post


Link to post
Share on other sites

HANDLE hBitmap = LoadImage( hInstance, "buttonImage.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
SendMessage( hBtn, BM_SETIMAGE, IMAGE_BITMAP, hBitmap );

Share this post


Link to post
Share on other sites
when i wrote this , it gave error

invalid conversion from `void*' to `LPARAM'
initializing argument 4 of `LRESULT SendMessageA(HWND__*, UINT, WPARAM, LPARAM)'

how to correct it?
thanks

Share this post


Link to post
Share on other sites
thanks a lot
i have made my buttons as desired by me
thanks again...................

Share this post


Link to post
Share on other sites
but now i cant clear my screen since the buttons are there permanently

how to remove them from my opengl window?
please help
thanks

Share this post


Link to post
Share on other sites
i was clearing my screen by glClear(GL_COLOR_BUFFER_BIT);

but buttons were not dispearing
can someone help
thanks

Share this post


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

  • Advertisement