 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 14.10.2009, 02:44 Titel: warum laeuft portierter c++ code nicht? |
|
|
Hallo,
da ich neu in sachen freebasic bin habe ich mir mal den c++ source von
nehe's lession 2 vorgenommen und diesen nach FB portiert.
leider musste ich feststellen das es da zu "komischen" fehlern kommt.
habe dieses tut in c++ und fb compiliert, beide compiler melden keine
errors. die unter c++ erstelte exe laeuft einwandfrei, die unter fb compilierte
laeuft zwar aber kann anscheinend das fenster nicht registrieren.
hier mal der fb sourcecode
Code: |
#Include once "windows.bi"
#include once "gl/gl.bi"
#include once "gl/glu.bi"
#Include once "gl/glext.bi"
#include once "crt.bi"
Dim Shared hDC As HDC = NULL ' Private GDI Device Context
Dim Shared hRC As HGLRC = NULL ' Permanent Rendering Context
Dim Shared hWnd As HWND = NULL ' Holds Our Window Handle
Dim Shared hInstance As HINSTANCE ' Holds The Instance Of The Application
Dim Shared keys(256) As Boolean ' Array Used For The Keyboard Routine
Dim Shared active As Boolean = TRUE ' Window Active Flag Set To TRUE By Default
Dim Shared fullscreen As Boolean = TRUE ' Fullscreen Flag Set To Fullscreen Mode By Default
Declare function WinMain(ByVal hInstance As HINSTANCE,byval hPrevInstance As HINSTANCE,byval lpCmdLine As LPSTR,byval nCmdShow As integer) As integer ' Window Show State
end WinMain( GetModuleHandle( null ), null, Command$, SW_NORMAL )
Declare Function WndProc( byval hWnd as HWND, byval message as UINT, byval wParam as WPARAM, byval lParam as LPARAM) As LRESULT
Declare Function CreateGLWindow(ByVal Title As string,byval wwidth As integer,byval wheight As integer,byval bits as integer,byval fullscreenflag As Boolean) As Boolean
Declare Function KillGLWindow() As Boolean
Declare Function DrawGLScene() As Boolean
Declare Function InitGL() As Boolean
Declare Function ReSizeGLScene(wwidth As integer,wheight As integer) As Boolean
Const szAppName = "OpenGL"
' Resize And Initialize The GL Window
Function ReSizeGLScene(wwidth As integer,wheight As integer) As Boolean
if (wheight=0) Then wheight=1 ' Prevent A Divide By Zero By
' Making Height Equal One
glViewport(0,0,width,wheight) ' Reset The Current Viewport
glMatrixMode(GL_PROJECTION) ' Select The Projection Matrix
glLoadIdentity() ' Reset The Projection Matrix
' Calculate The Aspect Ratio Of The Window
gluPerspective(45.0f,wwidth/wheight,0.1f,100.0f)
glMatrixMode(GL_MODELVIEW) ' Select The Modelview Matrix
glLoadIdentity() ' Reset The Modelview Matrix
Return true
End function
' All Setup For OpenGL Goes Here
Function InitGL() As Boolean
glShadeModel(GL_FLAT) ' Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f) ' Black Background
glClearDepth(1.0f) ' Depth Buffer Setup
glEnable(GL_DEPTH_TEST) ' Enables Depth Testing
glDepthFunc(GL_LEQUAL) ' The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) ' Really Nice Perspective Calculations
return TRUE ' Initialization Went OK
End function
' Here's Where We Do All The Drawing
Function DrawGLScene() As Boolean
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)' Clear Screen And Depth Buffer
glLoadIdentity() ' Reset The Current Modelview Matrix
glTranslatef(-1.5f,0.0f,-6.0f) ' Move Left 1.5 Units And Into The Screen 6.0
glBegin(GL_TRIANGLES) ' Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f) ' Top
glVertex3f(-1.0f,-1.0f, 0.0f) ' Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f) ' Bottom Right
glEnd() ' Finished Drawing The Triangle
glTranslatef(3.0f,0.0f,0.0f) ' Move Right 3 Units
glBegin(GL_QUADS) ' Draw A Quad
glVertex3f(-1.0f, 1.0f, 0.0f) ' Top Left
glVertex3f( 1.0f, 1.0f, 0.0f) ' Top Right
glVertex3f( 1.0f,-1.0f, 0.0f) ' Bottom Right
glVertex3f(-1.0f,-1.0f, 0.0f) ' Bottom Left
glEnd() ' Done Drawing The Quad
return TRUE ' Keep Going
End function
'Properly Kill The Window
Function KillGLWindow() As Boolean
if (fullscreen) then ' Are We In Fullscreen Mode?
ChangeDisplaySettings(NULL,0) ' If So Switch Back To The Desktop
ShowCursor(TRUE) ' Show Mouse Pointer
EndIf
if (hRC) then ' Do We Have A Rendering Context?
if (wglMakeCurrent(NULL,NULL)=false) then ' Are We Able To Release The DC And RC Contexts?
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK or MB_ICONINFORMATION)
EndIf
if (wglDeleteContext(hRC)=false) Then ' Are We Able To Delete The RC?
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK or MB_ICONINFORMATION)
EndIf
hRC=NULL ' Set RC To NULL
EndIf
if ((hDC<>NULL) And ReleaseDC(hWnd,hDC)=FALSE) then ' Are We Able To Release The DC
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK or MB_ICONINFORMATION)
hDC=NULL ' Set DC To NULL
EndIf
if ((hWnd<>NULL) And (DestroyWindow(hWnd)=false) ) then ' Are We Able To Destroy The Window?
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK or MB_ICONINFORMATION)
hWnd=NULL ' Set hWnd To NULL
EndIf
if (UnregisterClass("OpenGL",hInstance)=false) then ' Are We Able To Unregister Class
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK or MB_ICONINFORMATION)
hInstance=NULL ' Set hInstance To NULL
EndIf
Return true
End Function
'create the GL-Window
Function CreateGLWindow(ByVal Title As string,byval wwidth As integer,byval wheight As integer,byval bits as integer,byval fullscreenflag As Boolean) As Boolean
Dim PixelFormat As integer ' Holds The Results After Searching For A Match
Dim wc As WNDCLASS ' Windows Class Structure
Dim dwExStyle As DWORD ' Window Extended Style
Dim dwStyle As DWORD ' Window Style
Dim WindowRect As RECT ' Grabs Rectangle Upper Left / Lower Right Values
WindowRect.left=0 ' Set Left Value To 0
WindowRect.right=wwidth ' Set Right Value To Requested Width
WindowRect.top=0 ' Set Top Value To 0
WindowRect.bottom=wheight ' Set Bottom Value To Requested Height
fullscreen=fullscreenflag ' Set The Global Fullscreen Flag
hInstance = GetModuleHandle(NULL) ' Grab An Instance For Our Window
wc.style = CS_HREDRAW or CS_VREDRAW or CS_OWNDC ' Redraw On Size, And Own DC For Window.
wc.lpfnWndProc = @WndProc ' WndProc Handles Messages
wc.cbClsExtra = 0 ' No Extra Window Data
wc.cbWndExtra = 0 ' No Extra Window Data
wc.hInstance = hInstance ' Set The Instance
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO) ' Load The Default Icon
wc.hCursor = LoadCursor(NULL, IDC_ARROW) ' Load The Arrow Pointer
wc.hbrBackground = NULL ' No Background Required For GL
wc.lpszMenuName = NULL ' We Don't Want A Menu
wc.lpszClassName = StrPtr("OpenGL") ' Set The Class Name
if (RegisterClass(@wc)=false) Then ' Attempt To Register The Window Class
MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
EndIf
if (fullscreen) then ' Attempt Fullscreen Mode?
Dim dmScreenSettings As DEVMODE ' Device Mode
ZeroMemory(@dmScreenSettings, sizeof (DEVMODE)) ' Makes Sure Memory's Cleared
dmScreenSettings.dmSize=sizeof(DEVMODE) ' Size Of The Devmode Structure
dmScreenSettings.dmPelsWidth = wwidth ' Selected Screen Width
dmScreenSettings.dmPelsHeight = wheight ' Selected Screen Height
dmScreenSettings.dmBitsPerPel = bits ' Selected Bits Per Pixel
dmScreenSettings.dmFields=DM_BITSPERPEL Or DM_PELSWIDTH Or DM_PELSHEIGHT
' Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
if (ChangeDisplaySettings(@dmScreenSettings,CDS_FULLSCREEN)<>DISP_CHANGE_SUCCESSFUL) then
' If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode.
if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO Or MB_ICONEXCLAMATION)=IDYES) then
fullscreen=FALSE ' Windowed Mode Selected. Fullscreen = FALSE
else
' Pop Up A Message Box Letting User Know The Program Is Closing.
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK Or MB_ICONSTOP)
return FALSE ' Return FALSE
endif
endif
endif
if (fullscreen) then ' Are We Still In Fullscreen Mode?
dwExStyle=WS_EX_APPWINDOW ' Window Extended Style
dwStyle=WS_POPUP ' Windows Style
ShowCursor(FALSE) ' Hide Mouse Pointer
else
dwExStyle=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE ' Window Extended Style
dwStyle=WS_OVERLAPPEDWINDOW ' Windows Style
endif
AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle) ' Adjust Window To True Requested Size
' Create The Window
If (hWnd=CreateWindowEx( dwExStyle,"OpenGL",Title, dwStyle Or WS_CLIPSIBLINGS Or WS_CLIPCHILDREN,0, 0, WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL)=false) Then
KillGLWindow() 'Reset The Display
MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
endif
Static pfd As PIXELFORMATDESCRIPTOR ' pfd Tells Windows How We Want Things To Be
' Size Of This Pixel Format Descriptor
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR)
pfd.nVersion = 1 ' Version Number
pfd.dwFlags = PFD_DRAW_TO_WINDOW Or PFD_SUPPORT_OPENGL Or PFD_DOUBLEBUFFER ' Must Support Double Buffering
pfd.iPixelType = PFD_TYPE_RGBA ' Request An RGBA Format
pfd.cColorBits = bits ' Select Our Color Depth
pfd.cRedBits = 0
pfd.cRedShift = 0
pfd.cGreenBits = 0
pfd.cGreenShift = 0
pfd.cBlueBits = 0
pfd.cBlueShift = 0 ' Color Bits Ignored
pfd.cAlphaBits = 0 ' No Alpha Buffer
pfd.cAlphaShift = 0 ' Shift Bit Ignored
pfd.cAccumBits = 0 ' No Accumulation Buffer
pfd.cAccumRedBits = 0
pfd.cAccumGreenBits = 0
pfd.cAccumBlueBits = 0
pfd.cAccumAlphaBits = 0 ' Accumulation Bits Ignored
pfd.cDepthBits = 16 ' 16Bit Z-Buffer (Depth Buffer)
pfd.cStencilBits = 0 ' No Stencil Buffer
pfd.cAuxBuffers = 0 ' No Auxiliary Buffer
pfd.iLayerType = PFD_MAIN_PLANE ' Main Drawing Layer
pfd.bReserved = 0 ' Reserved
pfd.dwLayerMask = 0
pfd.dwVisibleMask = 0
pfd.dwDamageMask = 0 ' Layer Masks Ignored
if (not(hDC=GetDC(hWnd))) Then ' Did We Get A Device Context?
KillGLWindow() ' Reset The Display
MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
EndIf
if (not(PixelFormat=ChoosePixelFormat(hDC,@pfd))) Then ' Did Windows Find A Matching Pixel Format?
KillGLWindow() 'Reset The Display
MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
endif
If not(SetPixelFormat(hDC,PixelFormat,@pfd)) then ' Are We Able To Set The Pixel Format?
KillGLWindow() ' Reset The Display
MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
endif
if not(hRC=wglCreateContext(hDC)) then ' Are We Able To Get A Rendering Context?
KillGLWindow() ' Reset The Display
MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
endif
If Not(wglMakeCurrent(hDC,hRC)) Then ' Try To Activate The Rendering Context
KillGLWindow() ' Reset The Display
MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
endif
ShowWindow(hWnd,SW_SHOW) ' Show The Window
SetForegroundWindow(hWnd) ' Slightly Higher Priority
SetFocus(hWnd) ' Sets Keyboard Focus To The Window
ReSizeGLScene(wwidth, wheight) ' Set Up Our Perspective GL Screen
if not(InitGL()) then ' Initialize Our Newly Created GL Window
KillGLWindow() ' Reset The Display
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK Or MB_ICONEXCLAMATION)
return FALSE ' Return FALSE
EndIf
return TRUE ' Success
End function
Function WndProc(ByVal hWnd As HWND,ByVal uMsg As UINT,byval wParam as WPARAM,byval lParam as LPARAM) As LRESULT ' Additional Message Information
Select Case (uMsg) ' Check For Windows Messages
case WM_ACTIVATE ' Watch For Window Activate Message
if ( Not HIWORD(wParam)) Then ' Check Minimization State
active=TRUE ' Program Is Active
else
active=FALSE ' Program Is No Longer Active
EndIf
return 0 ' Return To The Message Loop
case WM_SYSCOMMAND
Select case (wParam)
case SC_SCREENSAVE
case SC_MONITORPOWER
return 0
End select
case WM_CLOSE ' Did We Receive A Close Message?
PostQuitMessage(0) ' Send A Quit Message
return 0 ' Jump Back
case WM_KEYDOWN ' Is A Key Being Held Down?
keys(wParam) = TRUE ' If So, Mark It As TRUE
return 0 ' Jump Back
case WM_KEYUP ' Has A Key Been Released?
keys(wParam) = FALSE ' If So, Mark It As FALSE
return 0 ' Jump Back
case WM_SIZE ' Resize The OpenGL Window
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)) ' LoWord=Width, HiWord=Height
return 0 ' Jump Back
End select
' Pass All Unhandled Messages To DefWindowProc
return DefWindowProc(hWnd,uMsg,wParam,lParam)
end function
function WinMain(ByVal hInstance As HINSTANCE,byval hPrevInstance As HINSTANCE,byval lpCmdLine As LPSTR,byval nCmdShow As integer) As integer ' Window Show State
Dim msg As MSG ' Windows Message Structure
Dim done As Boolean = FALSE ' Bool Variable To Exit Loop
' Ask The User Which Screen Mode They Prefer
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO Or MB_ICONQUESTION)=IDNO) then
fullscreen=FALSE ' Windowed Mode
EndIf
' Create Our OpenGL Window
if ( Not CreateGLWindow("NeHe's First Polygon Tutorial",640,480,32,fullscreen)) then
return 0 ' Quit If Window Was Not Created
EndIf
while(Not done) ' Loop That Runs While done=FALSE
if (PeekMessage(@msg,NULL,0,0,PM_REMOVE)) Then ' Is There A Message Waiting?
if (msg.message=WM_QUIT) then ' Have We Received A Quit Message?
done=TRUE ' If So done=TRUE
else ' If Not, Deal With Window Messages
TranslateMessage(@msg) ' Translate The Message
DispatchMessage(@msg) ' Dispatch The Message
endif
else ' If There Are No Messages
' Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
if ((active And not DrawGLScene()) or keys(VK_ESCAPE)) then ' Active? Was There A Quit Received?
done=TRUE ' ESC or DrawGLScene Signalled A Quit
else ' Not Time To Quit, Update Screen
SwapBuffers(hDC) ' Swap Buffers (Double Buffering)
EndIf
if (keys(VK_F1)) then ' Is F1 Being Pressed?
keys(VK_F1)=FALSE ' If So Make Key FALSE
KillGLWindow() ' Kill Our Current Window
fullscreen= Not fullscreen ' Toggle Fullscreen / Windowed Mode
' Recreate Our OpenGL Window
if ( Not CreateGLWindow("NeHe's First Polygon Tutorial",640,480,16,fullscreen)) then
return 0 ' Quit If Window Was Not Created
endif
endif
endif
wend
' Shutdown
KillGLWindow() ' Kill The Window
return (msg.wParam) ' Exit The Program
End function
|
falls evtl jemand mal drueber schauen koennte und mir sagen kann
was ich falsch mache waere ich dankbar dafuer.
sitze hier nun den ganzen tag da und habe nun wirklich keine idee mehr
warum das nich funzen will.
naja danke im vorraus.
gruesse |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 14.10.2009, 07:08 Titel: |
|
|
nun gut ich habe es nun doch geschafft den code zum laufen zu bekommen.
statt zB Code: | IF (NOT(hDC=GetDC(hWnd))) THEN... |
muss es Code: | hDC=GetDC(hWnd)
IF hDC = NULL THEN... |
heisen.
also thema beendet und geschlossen.
gruesse |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.10.2009, 13:52 Titel: |
|
|
Ja, da musst du aufpassen; FB unterscheidet nicht zwischen =/==, &/&&, |/||. Nun gut, in der aktuellen version gibt's endlich auch AndAlso / OrElse (was && und || enspricht), aber zwischen = und == kann man immer noch nicht richtig unterscheiden. Ist halt Basic.  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Haubitze
Anmeldungsdatum: 14.10.2009 Beiträge: 132
|
Verfasst am: 15.10.2009, 05:46 Titel: |
|
|
naja damit komm ich ja noch klar nur das man in If..Then keine functionen
aufrufen kann die etwas zuruckgeben und das einer variablen gleich
in der if then zuzuweisen und dann noch nachzu schaun ob es wahr oder falsch ist....
boar krasser text
naja damran muss ich mich noch gewoehnen.
koennte zwar auch in c++ schreiben aber finde Basic irgendwie hammer.
liegt wohl an meinem alten brotkasten den ich noch zuhause habe.
ach ja und mit dem orelse und andalso komm ich ja nun garnet klar das
mag aber an der syntax liegen. aber danke fuer den hinweis.
gruesse |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 15.10.2009, 13:32 Titel: |
|
|
Zitat: | naja damit komm ich ja noch klar nur das man in If..Then keine functionen
aufrufen kann die etwas zuruckgeben und das einer variablen gleich
in der if then zuzuweisen und dann noch nachzu schaun ob es wahr oder falsch ist.... |
Ja, das ist eben weil ein = als == in dem Fall interpretiert wird... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|