Solved

Create viewport on window with other win32 controls...

Posted on 2004-08-27
3
1,124 Views
Last Modified: 2013-12-06
I have a window,  600 x 400, and I want to display a small gl drawing viewport on the right 300 pixels (or near that), and the left to contain various controls.

I've tried simply calling  glViewport(300,375,250,250), but the whole window becomes black,  overwriting my controls...

What am I doing wrong?

Here's my WinMain



int WINAPI WinMain( HINSTANCE hInstance,  HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow )
{
    time_t now;
      time(&now);
      srand(now % 65535);
      
      WNDCLASS wc;
    HWND hWnd;
      HWND hwnd_static1, hStatic2;

    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) COLOR_BACKGROUND;
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
    wc.lpszClassName = "openGL";
      RegisterClass( &wc );

      // create window
      hWnd = CreateWindow(
                  "openGL",
                  "Fur Generator",
                  WS_CAPTION |WS_POPUPWINDOW | WS_VISIBLE,
                  175, 50, 600, 300,
                  NULL, NULL, hInstance, NULL );
      



      strcpy(lf.lfFaceName,"verdana");

      lf.lfHeight = 14;
      lf.lfWeight = 500;
      hFont = CreateFontIndirect(&lf); //or any other font creation method chosen;
      
      lf.lfHeight = 12;
      hSmallFont = CreateFontIndirect(&lf);

      
//+++ make "create" button
      hButton1 = CreateWindow("BUTTON","Create",WS_CHILD | WS_VISIBLE ,190,180,100,20, hWnd,(HMENU)ID_BUTTON1,hInstance,NULL);

      SendMessage(hButton1, WM_SETFONT, (WPARAM)hFont, 1);

//--- made create button



//+++ make "source" button
      hButton1 = CreateWindow("BUTTON","Source File",WS_CHILD | WS_VISIBLE ,10,0,100,20, hWnd,(HMENU)ID_BUTTON_SOURCE,hInstance,NULL);

      SendMessage(hButton1, WM_SETFONT, (WPARAM)hSmallFont, 1);
//--- made source button


//+++ make "output" button
      hButton1 = CreateWindow("BUTTON","Output File",WS_CHILD | WS_VISIBLE ,10,21,100,20, hWnd,(HMENU)ID_BUTTON_SOURCE,hInstance,NULL);

      SendMessage(hButton1, WM_SETFONT, (WPARAM)hSmallFont, 1);
//--- made output button



//+++ make "preview" outline  (until glviewport works)
      
      HWND gloutput = CreateWindow("static","",WS_BORDER | WS_CHILD | WS_VISIBLE ,350,15,220,220, hWnd,(HMENU)ID_BUTTON_SOURCE,hInstance,NULL);
      
       HWND gloutputlabel = CreateWindow("static","preview", WS_CHILD | WS_VISIBLE ,350,0,220,220, hWnd,(HMENU)ID_BUTTON_SOURCE,hInstance,NULL);
            SendMessage(gloutputlabel , WM_SETFONT, (WPARAM)hFont, 1);
//--- made output frame

      
//+++ make the source object dropdown


      hwnd_static1 = CreateWindow("static","Objects:",WS_CHILD | WS_VISIBLE | SS_LEFT,10,50,200,18,hWnd,NULL,hInstance,NULL);
   
      SendMessage(hwnd_static1, WM_SETFONT, (WPARAM)hFont, 1);
      SetWindowText(hwnd_static1,"Source Object");
   
      hSourceCombo = CreateWindow("combobox", "", WS_BORDER  | WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_TABSTOP,110,45,160,100,hWnd,NULL,hInstance,NULL);

      SendMessage(hSourceCombo, WM_SETFONT, (WPARAM)hFont, 1);

      //SendMessage(hSourceCombo,CB_ADDSTRING,0,(long)"object1");
      //SendMessage(hSourceCombo,CB_ADDSTRING,0,(long)"object2");
      //SendMessage(hSourceCombo,CB_ADDSTRING,0,(long)"object3");
//--- made source object dropdown

 



// +++  create percent edit box etc...

      hEditPercent= CreateWindow("edit","0", WS_BORDER  | WS_TABSTOP | WS_CHILD | WS_VISIBLE | SS_RIGHT,10,90,35,20,hWnd,NULL,hInstance,NULL);
      hStatic2 = CreateWindow("static","% of points used:",WS_CHILD | WS_VISIBLE | SS_LEFT,47,92,120,18,hWnd,NULL,hInstance,NULL);

   
    SendMessage(hStatic2, WM_SETFONT, (WPARAM)hFont, 1);
      SendMessage(hEditPercent, WM_SETFONT, (WPARAM)hFont, 1);
// --- created percent edit box, etc...

      

      EnableOpenGL( hWnd, &hDC, &hRC );
      glViewport(350,300,220,220);

      // main program loop
      while ( !bQuit ) {


            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 {

                  glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
                  glClear( GL_COLOR_BUFFER_BIT );


                  SwapBuffers( hDC );
   
            } // else

      } // while peek_message


      return msg.lParam;

} // end of winmain
0
Comment
Question by:a1programmer
3 Comments
 
LVL 2

Accepted Solution

by:
davidnsc1 earned 500 total points
ID: 12036368
I don't have a true answer, but, seeing that you haven't gotten a response yet, I might as well suggest a possible cause.  It's possible that the double-buffering is causing problems with the window, since you're swapping the buffer of the whole hDC and Windows doesn't draw to back buffers.

Wish I could be more help!
0
 
LVL 7

Author Comment

by:a1programmer
ID: 12044471
Thanks...   I actually found a way to do it.  I created a child window inside the window, and used it to draw on. ;)

I did try not doing the double buffering, and using a PFD_SUPPORT_GDI (or whatever) , but this is better.

__
A1
0
 
LVL 1

Expert Comment

by:E-Duck
ID: 12271872
the child-frame is one way, but you could get some problems, when you try to draw i.e. an background to the whole window. In this case it would be more easy to lay viewport and Ortho to the whole screen an enable the glScissorBox to your drawing-area. Thus your controlls will not be overwritten...
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

What is RenderMan: RenderMan is a not any particular piece of software. RenderMan is an industry standard, defining set of rules that any rendering software should use, to be RenderMan-compliant. Pixar's RenderMan is a flagship implementation of …
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
Sending a Secure fax is easy with eFax Corporate (http://www.enterprise.efax.com). First, Just open a new email message.  In the To field, type your recipient's fax number @efaxsend.com. You can even send a secure international fax — just include t…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…

746 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now