Results 1 to 7 of 7

Thread: CreateWindowEx() returining 0!

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1

    CreateWindowEx() returining 0!

    Hi all,
    I am trying to make a bare bones Windows unit that will create, update, and destroy an OpenGL window (Win OS) for me (I am using Delphi 2010 if this helps).

    I took the basic code from the Lesson 2 NeHe OpenGL window code:
    lesson02.zip

    and made a stand-alone Win OS unit:
    xeEngine_window_win.zip

    EDIT: I am using this unit inside a DLL to try and create a window...

    Here are the two CreateGlWindow routines (original) and then mine:

    Orginal
    Code:
    function CreateGlWindow(title:Pchar; width,height,bits:integer;FullScreenflag:bool):boolean stdcall;
    var
      Pixelformat: GLuint;            // Ukl?°d?° form?°t pixel??
      wc:TWndclass;                   // Struktura Windows Class
      dwExStyle:dword;                // Rozš????en?? styl okna
      dwStyle:dword;                  // Styl okna
      pfd: pixelformatdescriptor;     // Nastaven?? form?°tu pixel??
      dmScreenSettings: Devmode;      // M??d za????zen??
      h_Instance:hinst;               // Instance okna
      WindowRect: TRect;              // Obd?©ln??k okna
    begin
      WindowRect.Left := 0;                               // Nastav?? lev?? okraj na nulu
      WindowRect.Top := 0;                                // Nastav?? horn?? okraj na nulu
      WindowRect.Right := width;                          // Nastav?? prav?? okraj na zadanou hodnotu
      WindowRect.Bottom := height;                        // Nastav?? spodn?? okraj na zadanou hodnotu
      h_instance:=GetModuleHandle(nil);                   // Z??sk?° instanci okna
      FullScreen:=FullScreenflag;                         // Nastav?? prom?¨nnou fullscreen na spr?°vnou hodnotu
      with wc do
        begin
          style:=CS_HREDRAW or CS_VREDRAW or CS_OWNDC;    // P??ekreslen?? p??i zm?¨n?¨ velikosti a vlastn?? DC
          lpfnWndProc:=@WndProc;                          // Definuje proceduru okna
          cbClsExtra:=0;                                  // Ž?°dn?° extra data
          cbWndExtra:=0;                                  // Ž?°dn?° extra data
          hInstance:=h_Instance;                          // Instance
          hIcon:=LoadIcon(0,IDI_WINLOGO);                 // Standardn?? ikona
          hCursor:=LoadCursor(0,IDC_ARROW);               // Standardn?? kurzor myši
          hbrBackground:=0;                               // Pozad?? nen?? nutn?©
          lpszMenuName:=nil;                              // Nechceme menu
          lpszClassName:='OpenGl';                        // Jm?©no t????dy okna
        end;
      if  RegisterClass(wc)=0 then                        // Registruje t????du okna
        begin
          MessageBox(0,'Failed To Register The Window Class.','Error',MB_OK or MB_ICONERROR);
          Result:=false;                                  // P??i chyb?¨ vr?°t?? false
          exit;
        end;
      if FullScreen then                                  // Budeme ve fullscreenu?
        begin
          ZeroMemory( @dmScreenSettings, sizeof(dmScreenSettings) );  // Vynulov?°n?? pam?¨ti
          with dmScreensettings do
            begin
              dmSize := sizeof(dmScreenSettings);         // Velikost struktury Devmode
              dmPelsWidth  := width;	                    // Š????ka okna
    	        dmPelsHeight := height;                     // V??ška okna
              dmBitsPerPel := bits;                       // Barevn?° hloubka
              dmFields     := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
            end;
          // Pokus?? se použ??t pr?°v?¨ definovan?© nastaven??
          if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN))<>DISP_CHANGE_SUCCESSFUL THEN
            Begin
              // Nejde-li fullscreen, m??že uživatel spustit program v okn?¨ nebo ho opustit
              if MessageBox(0,'This FullScreen Mode Is Not Supported. Use Windowed Mode Instead?'
                                                 ,'NeHe GL',MB_YESNO or MB_ICONEXCLAMATION)= IDYES then
                    FullScreen:=false                     // B?¨h v okn?¨
              else
                begin
                  // Zobraz?? uživateli zpr?°vu, že program bude ukon?®en
                  MessageBox(0,'Program Will Now Close.','Error',MB_OK or MB_ICONERROR);
                  Result:=false;                          // Vr?°t?? FALSE
                  exit;
                end;
              end;
        end;
      if FullScreen then                                  // Jsme st?°le ve fullscreenu?
        begin
          dwExStyle:=WS_EX_APPWINDOW;                     // Rozš????en?? styl okna
          dwStyle:=WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
          Showcursor(false);                              // Skryje kurzor
        end
      else
        begin
          dwExStyle:=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;   // Rozš????en?? styl okna
          dwStyle:=WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
        end;
      AdjustWindowRectEx(WindowRect,dwStyle,false,dwExStyle); // P??izp??soben?? velikosti okna
      // Vytvo??en?? okna
      H_wnd:=CreateWindowEx(dwExStyle,                    // Rozš????en?? styl
                                   'OpenGl',              // Jm?©no t????dy
                                   Title,                 // Titulek
                                   dwStyle,               // Definovan?? styl
                                   0,0,                   // Pozice
                                   WindowRect.Right-WindowRect.Left,  // V??po?®et š????ky
                                   WindowRect.Bottom-WindowRect.Top,  // V??po?®et v??šky
                                   0,                     // Ž?°dn?© rodi?®ovsk?© okno
                                   0,                     // Bez menu
                                   hinstance,             // Instance
                                   nil);                  // Nep??edat nic do WM_CREATE
      if h_Wnd=0 then                                     // Pokud se okno nepoda??ilo vytvo??it
        begin
          KillGlWindow();                                 // Zruš?? okno
          MessageBox(0,'Window creation error.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Vr?°t?? chybu
          exit;
        end;
      with pfd do                                         // Ozn?°m??me Windows jak chceme vše nastavit
        begin
          nSize:= SizeOf( PIXELFORMATDESCRIPTOR );        // Velikost struktury
          nVersion:= 1;                                   // ?à??slo verze
          dwFlags:= PFD_DRAW_TO_WINDOW                    // Podpora okna
            or PFD_SUPPORT_OPENGL                         // Podpora OpenGL
            or PFD_DOUBLEBUFFER;                          // Podpora Double Bufferingu
          iPixelType:= PFD_TYPE_RGBA;                     // RGBA Format
          cColorBits:= bits;                              // Zvol?? barevnou hloubku
          cRedBits:= 0;                                   // Bity barev ignorov?°ny
          cRedShift:= 0;
          cGreenBits:= 0;
          cBlueBits:= 0;
          cBlueShift:= 0;
          cAlphaBits:= 0;                                 // Ž?°dn?? alpha buffer
          cAlphaShift:= 0;                                // Ignorov?°n Shift bit
          cAccumBits:= 0;                                 // Ž?°dn?? akumula?®n?? buffer
          cAccumRedBits:= 0;                              // Akumula?®n?? bity ignorov?°ny
          cAccumGreenBits:= 0;
          cAccumBlueBits:= 0;
          cAccumAlphaBits:= 0;
          cDepthBits:= 16;                                // 16-bitov?? hloubkov?? buffer (Z-Buffer)
          cStencilBits:= 0;                               // Ž?°dn?? Stencil Buffer
          cAuxBuffers:= 0;                                // Ž?°dn?? Auxiliary Buffer
          iLayerType:= PFD_MAIN_PLANE;                    // Hlavn?? vykreslovac?? vrstva
          bReserved:= 0;                                  // Rezervov?°no
          dwLayerMask:= 0;                                // Maska vrstvy ignorov?°na
          dwVisibleMask:= 0;
          dwDamageMask:= 0;
        end;
      h_Dc := GetDC(h_Wnd);                               // Zkus?? p??ipojit kontext za????zen??
      if h_Dc=0 then                                      // Poda??ilo se p??ipojit kontext za????zen???
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'Cant''t create a GL device context.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      PixelFormat := ChoosePixelFormat(h_Dc, @pfd);       // Zkus?? naj??t Pixel Format
      if (PixelFormat=0) then                             // Poda??ilo se naj??t Pixel Format?
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'Cant''t Find A Suitable PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      if (not SetPixelFormat(h_Dc,PixelFormat,@pfd)) then  // Poda??ilo se nastavit Pixel Format?
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'Cant''t set PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      h_Rc := wglCreateContext(h_Dc);                     // Poda??ilo se vytvo??it Rendering Context?
      if (h_Rc=0) then
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'Cant''t create a GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      if (not wglMakeCurrent(h_Dc, h_Rc)) then            // Poda??ilo se aktivovat Rendering Context?
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'Cant''t activate the GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      ShowWindow(h_Wnd,SW_SHOW);                          // Zobrazen?? okna
      SetForegroundWindow(h_Wnd);                         // Do pop??ed??
      SetFOcus(h_Wnd);                                    // Zam?¨???? fokus
      ReSizeGLScene(width,height);                        // Nastaven?? perspektivy OpenGL sc?©ny
      if (not InitGl()) then                              // Inicializace okna
        begin
          KillGLWindow();                                 // Zav??e okno
          MessageBox(0,'initialization failed.','Error',MB_OK or MB_ICONEXCLAMATION);
          Result:=false;                                  // Ukon?®?? program
          exit;
        end;
      Result:=true;                                       // Vše prob?¨hlo v po???°dku
    end;
    Last edited by paul_nicholls; 10-08-2011 at 03:47 AM. Reason: didn't mention DLL fact

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •