  | 
					
						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 | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 02.10.2011, 00:15    Titel: Callback auf Funkionen in einem UDT?? | 
				     | 
			 
			
				
  | 
			 
			
				Hi zusammen,
 
Auch wenn mein Beispiel Windows-spezifisch ist, 
 
gilt die frage wohl eher FB im allgemeinen  
 
 
Ich wollte ein C Beispiel übersetzen, dabei allerdings auf Globale Variablen verzichten und hab alle Funktionen in einer UDT Declariert...
 
 
Leider benötige ich dabei auch eine Callback Function, welche jetzt auf Variablen zugreifen müssten, die jetzt eben in diesem UDT sind und nicht mehr Global...
 
 
Den pointer auf die funktion mit '@this.meinefunktion' setzen geht leider nicht...
 
 
Hier mein code, er soll ein OpenGL Windows Fenster initiieren...
 
 	  | Code: | 	 		  
 
'' Tutorial 1 "Nur ein schwarzes Fenster"
 
'' gedownloaded von www.codeworx.org
 
'' Version 1.0, Hans-Jakob Schwer, 7.11.2001
 
'' Original von Jeff Molofee, neu kommentiert und übersetzt aus dem Englischen
 
 
'' diverse Windowsfunktionen
 
#include "windows.bi"
 
'' Damit kann Glu32 genutzt werden.
 
#include "GL\glu.bi"   
 
'' Damit kann OpenGL32 genutzt werden.
 
#include "GL\gl.bi"
 
 
'' WndProc wird deklariert
 
Declare Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
 
 
 
Type WinType
 
    Declare Constructor()
 
    Declare Destructor()
 
    Declare Sub KillGLWindow()
 
    
 
    Declare Function CreateGLWindow (byval Win_title  as String , _
 
                                     byval Win_width  as Integer, _
 
                                     byval Win_height as Integer, _
 
                                     byval Win_bits   as Integer, _
 
                                     byval screenflag as BOOL) as BOOL
 
    
 
'    Declare Function WndProc        (byval h_Wnd   as HWND, _
 
'                                     byval u_Msg   as UINT, _
 
'                                     byval w_Param as WPARAM, _
 
'                                     byval l_Param as LPARAM) as LRESULT
 
                                     
 
    Declare Function WinMain        (byval h_Instance     as HINSTANCE, _
 
                                     byval h_PrevInstance as HINSTANCE, _
 
                                     byval lp_CmdLine     as LPSTR    , _
 
                                     byval n_CmdShow      as Integer  ) as Integer
 
                                     
 
 
    h_RC       as HGLRC     '' Der OpenGL Rendering Context
 
    h_DC       as HDC       '' Geschützter GDI Device Context
 
    h_Wnd      as HWND      '' Verweist später auf den Windows Handle
 
    h_Instance as HINSTANCE '' Die Instanz der Anwendung
 
    
 
    keys       as bool PTR
 
    active     as bool
 
    fullscreen as bool
 
    
 
    WndProcCP  as any ptr
 
End Type
 
 
Constructor.WinType()
 
    with this
 
        .h_RC  = NULL
 
        .h_RC  = NULL
 
        .h_Wnd = NULL
 
        
 
        .keys  = allocate(256)
 
        .active = TRUE
 
        .fullscreen = TRUE
 
        
 
        .WndProcCP = @WndProc
 
    End With
 
End Constructor
 
 
Destructor.WinType()
 
    with this
 
        .h_RC  = NULL
 
        .h_RC  = NULL
 
        .h_Wnd = NULL
 
        
 
        deallocate (.keys)
 
        active = FALSE
 
        fullscreen = FALSE
 
    End With
 
End Destructor
 
 
 
Sub ReSizeGLScene(byval GL_width as GLsizei, byval GL_height as GLsizei) '(as GLvoid)
 
    '' Initialisierung des OpenGL-Fensters
 
 
    '' GL_height darf nicht 0 sein, damit es im späteren 
 
    '' Programmablauf nicht zu einer Division durch 0 kommt.
 
    If GL_height<1 Then GL_height=1
 
 
    '' Hier wird der Mittelpunkt auf den die Perspektive zuläuft 
 
    '' zurückgesetzt.
 
    glViewport(0, 0, GL_width, GL_height)
 
    
 
    '' Hier wird die Projektionsmatrix festgelegt
 
    glMatrixMode(GL_PROJECTION)
 
 
    '' und angepasst 
 
    glLoadIdentity()
 
  
 
    '' Hier wird die das Verhältnis der Höhe zur Breite übergeben
 
    '' und der Verzerrungswinkel von 45 Grad übergeben
 
    gluPerspective(45.0f,cast(GLfloat,GL_width/GL_height),0.1f,100.0f) 
 
  
 
    '' Hier wird die sogenannte modelview-Matrix festgelegt
 
    glMatrixMode(GL_MODELVIEW)
 
 
    '' und angepasst.  
 
    glLoadIdentity()
 
End Sub
 
 
Function InitGL() as Integer
 
 
    '' Das Smooth Shading wird aktiviert, das 
 
    '' sehr schöne Farbübergänge auf Körpern ermöglicht.
 
    glShadeModel(GL_SMOOTH)
 
 
    '' In diesem Falle ein schwarzer Hintergrund
 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
 
    
 
    '' depht buffer zurückgesetzt
 
    glClearDepth(1.0f)
 
    
 
    '' Aktivierung des depht Tests (dazu später mehr.)
 
    glEnable(GL_DEPTH_TEST)
 
    
 
    '' Der Typ des Depht Tests wird festgelegt
 
    glDepthFunc(GL_LEQUAL)
 
    
 
    '' Perspektive wird festgelegt
 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
 
    
 
    Return TRUE '' Initialisierung scheint geklappt zu haben!
 
End Function
 
 
Function DrawGLScene() as Integer
 
 
    '' Die vorherige Szene wird vom Bildschirm gelöscht, 
 
    '' damit die neuen nicht einfach über die alten    
 
    '' Objekte gezeichnet werden
 
    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
 
    
 
    '' modelview-Matrix wird wieder einmal zurückgesetzt
 
    glLoadIdentity()
 
 
    Return TRUE '' Alles hat geklappt
 
End Function
 
 
Sub WinType.KillGLWindow()
 
    With this
 
    
 
    '' Kontrolle auf Vollbildmodus
 
    If (.fullscreen) Then 
 
        '' Zurück zum Desktop
 
        ChangeDisplaySettings(NULL,0) 
 
        '' Der abgeschaltete Mauszeiger wird wieder angezeigt
 
        ShowCursor(TRUE)
 
    End If
 
 
    '' Rendering Context (RC) vorhanden?
 
    If (.h_RC) Then 
 
        '' Kann der DC und RC überhaupt gelöscht werden?
 
        If NOT(wglMakeCurrent(NULL,NULL)) Then
 
            MessageBox(NULL, "Entfernen des DC und RC fehlgeschlagen.", _
 
            "Fehler",MB_OK OR MB_ICONINFORMATION)
 
        End If
 
   
 
        '' Kann der RC gelöscht werden?
 
        If NOT(wglDeleteContext(.h_RC)) Then
 
            MessageBox(NULL, "Entfernen des RC fehlgeschlagen.", _
 
            "Fehler...",MB_OK OR MB_ICONINFORMATION)
 
            '' Der RC wird NULL gesetzt, also entfernt
 
            .h_RC=NULL
 
        End If
 
 
        '' Kann der Device Context (DC) freigegeben werden?
 
        If .h_DC Then
 
            If NOT(ReleaseDC(.h_Wnd,.h_DC)) Then
 
                MessageBox(NULL, "Freigabe des Device Context fehlgeschlagen.", _
 
                "Fehler",MB_OK OR MB_ICONINFORMATION)
 
                '' Der DC wird entfernt
 
                .h_DC=NULL
 
            End If
 
        End If
 
 
        '' Kann das Programmfenster geschlossen werden?
 
        If .h_Wnd Then
 
            If NOT(DestroyWindow(.h_Wnd)) Then
 
                MessageBox(NULL, "Konnte hWnd nicht löschen.", _
 
                "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
 
                '' Setze den hWnd auf NULL
 
                .h_Wnd=NULL 
 
            End If
 
        End If
 
 
        '' Kann die Registrierung rückgängig gemacht werden?
 
        If NOT(UnregisterClass(@"OpenGL",.h_Instance)) Then
 
            MessageBox(NULL, "Konnte Klasse nicht entfernen.", _
 
            "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
 
            '' Setze hInstance auf NULL
 
            .h_Instance=NULL
 
        End If
 
    End If
 
    End With
 
End Sub        
 
 
 
Function WinType.CreateGLWindow (byval Win_title  as String , byval Win_width as Integer, _
 
                                 byval Win_height as Integer, byval Win_bits  as Integer, _
 
                                 byval screenflag as BOOL) as BOOL
 
    
 
    '' Speichert das Pixelformat
 
    Dim PixelFormat as GLuint
 
    '' wc wird eine Instanz der Fensterklasse
 
    Dim wc          as WNDCLASS
 
    '' weitere Informationen
 
    Dim dwExStyle   as DWORD
 
    '' Fensterinformationen
 
    Dim dwStyle     as DWORD
 
    '' Speicher für aktuelle Auflösung
 
    Dim WindowRect  as RECT
 
 
    '' Die linke Seite des Rechtecks wirtd auf 0 gesetzt
 
    WindowRect.left=0
 
    '' Hier wird die gewünschte Breite des Fensters gespeichert
 
    WindowRect.right=Win_width
 
    '' Die obere Seite wird auch auf 0 gesetzt
 
    WindowRect.top=0
 
    '' Und hier wird die Höhe abgelegt
 
    WindowRect.bottom=Win_height
 
    
 
    With this
 
    '' Hier wird fullscreen 
 
    '' auf den Wert von screenflag 
 
    '' gesetzt, welches ja übergeben wurde
 
    .fullscreen=screenflag
 
    '' Die Instanz des Programmes bekommt ein 
 
    '' Handle zugeordnet
 
    .h_Instance = GetModuleHandle(NULL)
 
 
    '' Bei Veränderungen in der Höhe und/oder Breite, 
 
    '' soll ne gezeichnet werden
 
    wc.style = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
 
    '' WndProc behandelt die auftretenden Nachrichten
 
    wc.lpfnWndProc = .WndProcCP
 
    '' Wird nicht benötigt
 
    wc.cbClsExtra = 0
 
    '' und das auch nicht
 
    wc.cbWndExtra = 0
 
    '' Die Instanz wird festgelegt
 
    wc.hInstance = .h_Instance
 
    '' Lädt das Standardsymbol
 
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO)
 
    '' Lädt einen Cursor
 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW)
 
    '' Es soll kein bestimmter Hintergrund angezeigt werden
 
    wc.hbrBackground = NULL
 
    '' Auch ein Menü wird nicht benötigt.
 
    wc.lpszMenuName = NULL
 
    '' OpenGL wird der Name der Klasse
 
    wc.lpszClassName = @"OpenGL"
 
 
    '' Versuch die Klasse zu registrieren
 
    If NOT(RegisterClass(@wc)) Then
 
        MessageBox(NULL, "Konnte die Fensterklasse nicht registrieren.", _
 
        "ERROR", MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurückgeben und beenden
 
        Return FALSE
 
    End If
 
 
    '' Soll im Vollbildmodus gestartet werden
 
    If .fullscreen Then
 
 
        '' Instanz von DEVMODE wird erzeugt
 
        'DEVMODE dmScreenSettings; 
 
        Dim dmScreenSettings as DEVMODE
 
 
        'memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); 
 
        '// Diese wird geleert
 
 
        '' dmsize soll genauso groß wie die dmScreenSettings sein
 
        dmScreenSettings.dmSize = len(dmScreenSettings)
 
 
        '' Die drei Werte (height, width und bits) 
 
        '' wurden der Prozedur übergeben und werden 
 
        '' nun in dmScreenSettings gespeichert
 
        dmScreenSettings.dmPelsWidth  = Win_width
 
        dmScreenSettings.dmPelsHeight = Win_height
 
        dmScreenSettings.dmBitsPerPel = Win_bits 
 
        '' Hier werden die drei Werte in einem Ausdruck gespeichert
 
        dmScreenSettings.dmFields     = DM_BITSPERPEL OR DM_PELSWIDTH OR DM_PELSHEIGHT
 
    
 
 
    If ChangeDisplaySettings(@dmScreenSettings,CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then
 
        '' CDS_FULLSCREEN blendet zusätzlich die Startleiste aus
 
        
 
        If MessageBox(NULL, _
 
        "Der gewünschte Vollbildmodus wird nicht unterstützt, soll stattdessen im Fenstermodus ausgegeben werden?", _
 
        "OpenGL", MB_YESNO OR MB_ICONEXCLAMATION) = IDYES Then
 
            '' Der Benutzer möchte im Fenster weitermachen, 
 
            '' dazu wird fullscreen auf FALSE gesetzt
 
            .fullscreen=FALSE
 
        Else
 
        '' Falls der Benutzer das Programm aus gegebenen 
 
        '' Anlass beenden will, wird FALSE zurückgegeben.
 
            Return FALSE
 
        End If
 
    End If
 
    
 
 
    '' Konnte in den Vollbildmodus geschaltet werden? 
 
    '' (Wenn nicht, wird ja im Fenster weitergemacht!)
 
    If fullscreen Then
 
        
 
        '' Fenstereigenschaften
 
        dwExStyle = WS_EX_APPWINDOW 
 
        '' Fenstereigenschaften
 
        dwStyle   = WS_POPUP
 
        '' Der Mauszeiger wird nicht angezeigt
 
        ShowCursor(FALSE)
 
    Else
 
        '' Das Fenster soll zusätzlich einen 3D Rahmen bekommen
 
        dwExStyle = WS_EX_APPWINDOW OR WS_EX_WINDOWEDGE
 
        '' Ein typisches Windowsfenster mit 
 
        '' Minimieren, Maximieren, etc
 
        dwStyle   = WS_OVERLAPPEDWINDOW
 
    End If
 
 
    '' Fenster wird angepasst
 
    AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
 
    
 
    '' dwExStyle       : Die erweiterten Eigenschaften des Fensters
 
    '' "OpenGL"        : Der Name der Klasse
 
    '' Win_title       : Der Titel des Fensters
 
    '' WS_CLIPSIBLINGS : Wird von OpenGL benötigt
 
    '' WS_CLIPCHILDREN : Wird auch von OpenGL benötigt
 
    '' dwStyle         : auch Eigenschaften des Fensters
 
    '' 0, 0            : Die Position des zu erstellenden Fensters
 
    '' WindowRect.right-WindowRect.left
 
    ''                 : die ermittelten Werte für die Breite
 
    '' WindowRect.bottom-WindowRect.top
 
    ''                 : und hier für die Länge
 
    '' NULL            : Es soll kein übergordnetes Fendster erstellt werden
 
    '' NULL            : kein Menü
 
    '' hInstance       : Die Instanz wird übergeben
 
    '' NULL            : Wird nicht benötigt
 
    
 
    If NOT(.h_Wnd=CreateWindowEx(dwExStyle, _
 
        @"OpenGL", Win_title, _
 
        WS_CLIPSIBLINGS OR WS_CLIPCHILDREN OR dwStyle, _
 
        0, 0, WindowRect.right-WindowRect.left, _
 
        WindowRect.bottom-WindowRect.top, _
 
        NULL, NULL, .h_Instance, NULL)) Then
 
 
 
        '' Grafikeinstellungen zurücksetzen
 
        KillGLWindow()
 
        
 
        MessageBox(NULL, "Fenster konnte nicht erstellt werden.", _
 
        "ERROR", MB_OK OR MB_ICONEXCLAMATION)
 
        
 
        Return FALSE
 
    End If
 
 
 
    '' pdf ist jetzt ein PIXELFORMATDESCRIPTOR
 
    
 
    '' len(PIXELFORMATDESCRIPTOR) : Die größe muss natürlich stimmen
 
    '' 1,                         : Versionsnummer
 
    '' PFD_DRAW_TO_WINDOW         : Das Format muss in Fenster sichtbar sein können    
 
    '' PFD_SUPPORT_OPENGL         : OpenGL muss unterstützt werden
 
    '' PFD_DOUBLEBUFFER           : Double Buffering muss unterstützt werden
 
    '' PFD_TYPE_RGBA              : Das RGBA muss unterstützt werden
 
    '' bits                       : Die übergebene Farbtiefe wird hier benötigt
 
    '' 0, 0, 0, 0, 0, 0           : wird nicht benötigt
 
    '' 0                          : kein Alpha Buffer
 
    '' 0                          : Shift Bit ignoriert
 
    '' 0                          : kein Accumulation Buffer
 
    '' 0                          : kein Accumulation Buffer
 
    '' 0, 0, 0, 0                 : nicht benötigt
 
    '' 16                         : 16Bit Z-Buffer (Depth Buffer)
 
    '' 0                          : kein Stencil Buffer
 
    '' 0                          : kein Auxiliary Buffer
 
    '' PFD_MAIN_PLANE             : Die Hauptebene auf die später gezeichnet wird
 
    '' 0                          : unwichtig
 
    '' 0, 0, 0                    : keine Ebenenmasken benötigt
 
    Static pfd as PIXELFORMATDESCRIPTOR
 
    pfd.nsize      = len(PIXELFORMATDESCRIPTOR)
 
    pfd.nVersion   = 1
 
    pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
 
    pfd.iPixelType = PFD_TYPE_RGBA
 
    pfd.cColorBits = Win_bits
 
    pfd.cDepthBits = 16
 
    pfd.iLayerType = PFD_MAIN_PLANE
 
 
 
    '' Versuch, den DC zu bekommen
 
    If NOT(.h_DC=GetDC(.h_Wnd)) Then
 
        '' Alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte keinen DC erstellen.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurückgeben, beenden
 
        Return FALSE 
 
    End If
 
 
    '' Kann Windows ein passendes finden? 
 
    If NOT(PixelFormat=ChoosePixelFormat(.h_DC,@pfd)) Then 
 
  
 
        '' Falls keins gefunden werden kann:
 
        '' Alles zurücksetzen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte kein passendes Pixelformat finden.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und Ende.
 
        Return FALSE
 
    End If
 
 
    '' Kann das Pixelformat gesetzt werden?
 
    If NOT(SetPixelFormat(.h_DC,PixelFormat,@pfd)) Then
 
        '' Leider nicht, Fehlerpopup und raus
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte Pixelformat nicht setzen.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
    '' Versuch den RC zu bekommen
 
    If NOT(.h_RC=wglCreateContext(.h_DC)) Then
 
        '' Alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte keinen Rendering Context bekommen.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
 
    '' Versuch den RC zu aktivieren
 
    If NOT(wglMakeCurrent(h_DC,h_RC)) Then
 
        '' hat nicht geklappt, also alles zurück
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte den Rendering Context nmicht aktivieren.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
    '' Fenster anzeigen
 
    ShowWindow(.h_Wnd,SW_SHOW)
 
    '' Priorität des Programms wird erhöht
 
    SetForegroundWindow(.h_Wnd)
 
    '' Tastatureingaben werden jetzt an das Programm geleitet
 
    SetFocus(.h_Wnd)
 
                  
 
    '' Die Perspektive wird aktiviert
 
    ReSizeGLScene(Win_width, Win_height)
 
 
    '' Initialisiere das OpenGL Fenster
 
    If NOT(InitGL()) Then
 
 
        '' Falls das nicht geklappt haben sollte alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Initialisierung fehlgeschlagen.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE wird zurückgegeben
 
        Return FALSE
 
    End If
 
    End If
 
    '' Alles hat geklappt!!!
 
    End WIth
 
    Return TRUE
 
End Function
 
 
 
 
Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, _
 
                 byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
 
                 
 
    '' Sind Nachrichten in der Nachrichtenschleife?
 
    Select Case (u_Msg)
 
        
 
        '' Ist das Programm aktiv?
 
        Case WM_ACTIVATE
 
            '' Ist das Programm nicht minimiert?
 
            If NOT(HIWORD(w_Param)) Then
 
                '' active wird TRUE
 
                'active=TRUE
 
            Else
 
                '' Programm ist minimiert
 
                'active=FALSE
 
            End If
 
            '' Rückgabe: 0
 
            Return 0
 
        
 
        '' Ist ein Systemkommando (wie z.B. 
 
        '' "Bildschirmschoner soll gestartet werden") vorhanden?
 
        Case WM_SYSCOMMAND
 
            '' wParam würde diesen Befehl enthalten
 
            Select Case (w_Param)
 
                '' Versucht Windows den Bildschirmschoner zu starten
 
                Case SC_SCREENSAVE
 
                    '' wird durch die Rückgabe von 0 verhindert
 
                    Return 0
 
                '' Soll der Monitor in den Stromsparmodus gehen?
 
                Case SC_MONITORPOWER
 
                    '' wird durch die Rückgabe von 0 verhindert
 
                    Return 0
 
            ''break; // Das wars.
 
            End Select
 
        
 
        '' Ist eine WM_CLOSE Nachricht vorhanden?
 
        Case WM_CLOSE 
 
            '' Die Nachricht zum Beenden wird "gepostet"
 
            PostQuitMessage(0)
 
            '' und zurück.
 
            Return 0
 
        
 
        '' Drückt der Benutzer eine Taste???
 
        Case WM_KEYDOWN
 
            '' Der Wert im Array keys[] der dem Code 
 
            '' der Taste entspricht, wird true gesetzt
 
            'keys[w_Param] = TRUE
 
            '' und zurück...
 
            Return 0
 
 
        '' Wurde eine Taste losgelassen?
 
        Case WM_KEYUP
 
            '' Wen ja, dann soll dieser Wert im Array keys[] 
 
            '' auf FALSE gesetzt werden
 
            'keys[w_Param] = FALSE
 
            '' und zurück.
 
            Return 0
 
        '' Die Fenstergröße wurde geändert
 
        Case WM_SIZE
 
            '' LoWord ist die Breite, HiWord die Höhe, 
 
            '' ReSizeGLScene() verändert dann die 
 
            '' Größe des OpenGL-Fensters
 
            ReSizeGLScene(LOWORD(l_Param),HIWORD(l_Param))
 
            '' und zurück
 
            Return 0
 
    End Select
 
    
 
    Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)
 
End Function
 
 
 
 
Function WinType.WinMain(byval h_Instance     as HINSTANCE, _
 
                         byval h_PrevInstance as HINSTANCE, _
 
                         byval lp_CmdLine     as LPSTR    , _
 
                         byval n_CmdShow      as Integer  ) as Integer
 
 
    Dim wm_msg  as MSG
 
    Dim wm_done as BOOL = FALSE
 
 
 
    If MessageBox(NULL,"Soll im Vollbildmodus gestartet werden?", _
 
    "Vollbilmodus gewünscht?",MB_YESNO OR MB_ICONQUESTION)=IDNO Then
 
        '' Falls nein gedrückt wurde, 
 
        '' wird fullscreen false gesetzt
 
        fullscreen=FALSE
 
    End If
 
 
    If NOT(CreateGLWindow("Opengl Tutorial 1 - Nur ein schwarzes Fenster - www.codeworx.org", _
 
    640,480,16,fullscreen)) Then
 
        '' Falls ein Fehler auftrat, beenden
 
        Return 0
 
    End If
 
    
 
 
    '' Solange done nicht TRUE ist:
 
    While NOT(wm_done) 
 
        
 
        '' Sind Nachrichten vorhanden
 
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
 
    
 
            '' Liegt eine Nachricht zum beenden vor?
 
            If wm_msg.message=WM_QUIT Then
 
                '' Wenn dem so ist, wird done 
 
                '' true und das Programm beendet
 
                wm_done=TRUE
 
            '' Wenn nicht werden die anderen Nachrichten ausgewertet
 
            Else 
 
                '' Umformen der Nachricht
 
                TranslateMessage(@wm_msg)
 
                DispatchMessage(@wm_msg)
 
            End If
 
        '' Falls keine Nachrichten bereit liegen
 
        Else
 
            '' Programm aktiv?
 
            If (active) Then
 
                '' Wurde ESC gedrückt?
 
                If keys[VK_ESCAPE] Then
 
                    '' Wenn ESC gedrückt wurde, beenden
 
                    wm_done=TRUE
 
                '' ESC wurde nicht gedrückt
 
                Else 
 
                    '' Die Szene ausgeben
 
                    DrawGLScene()
 
                    '' Die Puffer werden getauscht
 
                    SwapBuffers(this.h_DC)
 
                End If
 
                
 
                '' Wird F1 gedrückt?
 
                If keys[VK_F1] Then
 
                    '' Es darf nicht gewartet werden bis F1 losgelassen wird,
 
                    '' ansonsten könnte das Bild mehrmals hin und herschalten
 
                    keys[VK_F1]=FALSE
 
                    '' Das aktuelle Fenster wird gelöscht
 
                    KillGLWindow()
 
                    '' fullscreen erhält seinen entgegengesetzten Wert
 
                    '' (bei FALSE TRUE, und bei TRUE FALSE.)
 
                    fullscreen=NOT(fullscreen)
 
                    If NOT(CreateGLWindow("Lektion 1",640,480,16,fullscreen)) Then
 
                        '' Zurück falls ein Fehler auftrat
 
                        Return 0
 
                    End If
 
                End If
 
            End If
 
        End If
 
    Wend
 
    
 
    '' Das Fenster löschen.
 
    KillGLWindow()
 
    '' Das Programm verlassen.
 
    Return (wm_msg.wParam)
 
End Function
 
 
 
 
Dim Test as WinType
 
Test.CreateGLWindow("Test",640,800,16,0)
 
 | 	 
  _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 02.10.2011, 00:25    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das klappt so nicht. Callback-Funktionen müssen statisch sein. Wenn sie nicht statisch sind, bekommen sie ja den impliziten this-Parameter mit übergeben. Wie man statische Funktionen in FB deklariert weiß ich jetzt nicht auswendig (das STATIC hinter dem Funktionsnamen wird auf jeden Fall das falsche STATIC sein), aber das wird man ja in der Referenz irgendwo erfahren können. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ThePuppetMaster
 
  
  Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
  | 
		
			
				 Verfasst am: 02.10.2011, 00:48    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Richtig. Das "@this.meinefunktion" funktioniert generell nicht.
 
Du musst das auf jeden fall anders lösen.
 
z.B. über einen Zwischenschritt zum manuellem Setzen.
 
 
(hatte das problem früher auch schon mal)
 
 
 
MfG
 
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 02.10.2011, 01:05    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Nagut, danke...
 
 
dachte wär eine gute Idee mit dem UDT gewesen um auf globale Variablen zu verzichten...
 
 
Hab es dann nun doch erstmal wieder ohne UDT gemacht, bis mir evtl mal was anderes einfällt.
 
 
btw: das Beispiel soll nur ein Fenster erzeugen, zwar startet es nun ohne fehler, allerdings 'antwortet' das Fenster/der Prozess leider nicht?!
 
 
Geändertes Beispiel:
 
 
 
 	  | Code: | 	 		  
 
'' Tutorial 1 "Nur ein schwarzes Fenster"
 
'' gedownloaded von www.codeworx.org
 
'' Version 1.0, Hans-Jakob Schwer, 7.11.2001
 
'' Original von Jeff Molofee, neu kommentiert und übersetzt aus dem Englischen
 
 
'' diverse Windowsfunktionen
 
#include "windows.bi"
 
'' Damit kann Glu32 genutzt werden.
 
#include "GL\glu.bi"   
 
'' Damit kann OpenGL32 genutzt werden.
 
#include "GL\gl.bi"
 
 
 
Dim Shared h_RC       as HGLRC     = NULL '' Der OpenGL Rendering Context
 
Dim Shared h_DC       as HDC       = NULL '' Geschützter GDI Device Context
 
Dim Shared h_Wnd      as HWND      = NULL '' Verweist später auf den Windows Handle
 
Dim Shared h_Instance as HINSTANCE        '' Die Instanz der Anwendung
 
    
 
Dim Shared keys       as bool PTR  
 
keys = Allocate(256)
 
 
Dim Shared active     as bool      = TRUE
 
Dim Shared fullscreen as bool      = TRUE
 
    
 
Declare Sub KillGLWindow()
 
    
 
Declare Function CreateGLWindow (byval Win_title  as String , _
 
                                 byval Win_width  as Integer, _
 
                                 byval Win_height as Integer, _
 
                                 byval Win_bits   as Integer, _
 
                                 byval screenflag as BOOL) as BOOL
 
  
 
Declare Function WndProc        (byval h_Wnd   as HWND, _
 
                                 byval u_Msg   as UINT, _
 
                                 byval w_Param as WPARAM, _
 
                                 byval l_Param as LPARAM) as LRESULT
 
                                     
 
Declare Function WinMain        (byval h_Instance     as HINSTANCE, _
 
                                 byval h_PrevInstance as HINSTANCE, _
 
                                 byval lp_CmdLine     as LPSTR    , _
 
                                 byval n_CmdShow      as Integer  ) as Integer
 
                                     
 
 
 
 
Sub ReSizeGLScene(byval GL_width as GLsizei, byval GL_height as GLsizei) '(as GLvoid)
 
    '' Initialisierung des OpenGL-Fensters
 
 
    '' GL_height darf nicht 0 sein, damit es im späteren 
 
    '' Programmablauf nicht zu einer Division durch 0 kommt.
 
    If GL_height<1 Then GL_height=1
 
 
    '' Hier wird der Mittelpunkt auf den die Perspektive zuläuft 
 
    '' zurückgesetzt.
 
    glViewport(0, 0, GL_width, GL_height)
 
    
 
    '' Hier wird die Projektionsmatrix festgelegt
 
    glMatrixMode(GL_PROJECTION)
 
 
    '' und angepasst 
 
    glLoadIdentity()
 
  
 
    '' Hier wird die das Verhältnis der Höhe zur Breite übergeben
 
    '' und der Verzerrungswinkel von 45 Grad übergeben
 
    gluPerspective(45.0f,cast(GLfloat,GL_width/GL_height),0.1f,100.0f) 
 
  
 
    '' Hier wird die sogenannte modelview-Matrix festgelegt
 
    glMatrixMode(GL_MODELVIEW)
 
 
    '' und angepasst.  
 
    glLoadIdentity()
 
End Sub
 
 
Function InitGL() as Integer
 
 
    '' Das Smooth Shading wird aktiviert, das 
 
    '' sehr schöne Farbübergänge auf Körpern ermöglicht.
 
    glShadeModel(GL_SMOOTH)
 
 
    '' In diesem Falle ein schwarzer Hintergrund
 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
 
    
 
    '' depht buffer zurückgesetzt
 
    glClearDepth(1.0f)
 
    
 
    '' Aktivierung des depht Tests (dazu später mehr.)
 
    glEnable(GL_DEPTH_TEST)
 
    
 
    '' Der Typ des Depht Tests wird festgelegt
 
    glDepthFunc(GL_LEQUAL)
 
    
 
    '' Perspektive wird festgelegt
 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
 
    
 
    Return TRUE '' Initialisierung scheint geklappt zu haben!
 
End Function
 
 
Function DrawGLScene() as Integer
 
 
    '' Die vorherige Szene wird vom Bildschirm gelöscht, 
 
    '' damit die neuen nicht einfach über die alten    
 
    '' Objekte gezeichnet werden
 
    glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
 
    
 
    '' modelview-Matrix wird wieder einmal zurückgesetzt
 
    glLoadIdentity()
 
 
    Return TRUE '' Alles hat geklappt
 
End Function
 
 
Sub KillGLWindow()
 
        
 
    '' Kontrolle auf Vollbildmodus
 
    If fullscreen Then 
 
        '' Zurück zum Desktop
 
        ChangeDisplaySettings(NULL,0) 
 
        '' Der abgeschaltete Mauszeiger wird wieder angezeigt
 
        ShowCursor(TRUE)
 
    End If
 
 
    '' Rendering Context (RC) vorhanden?
 
    If (h_RC) Then 
 
        '' Kann der DC und RC überhaupt gelöscht werden?
 
        If wglMakeCurrent(NULL,NULL)=0 Then
 
            MessageBox(NULL, "Entfernen des DC und RC fehlgeschlagen.", _
 
            "Fehler",MB_OK OR MB_ICONINFORMATION)
 
        End If
 
   
 
        '' Kann der RC gelöscht werden?
 
        If wglDeleteContext(h_RC)=0 Then
 
            MessageBox(NULL, "Entfernen des RC fehlgeschlagen.", _
 
            "Fehler...",MB_OK OR MB_ICONINFORMATION)
 
            '' Der RC wird NULL gesetzt, also entfernt
 
            h_RC=NULL
 
        End If
 
 
        '' Kann der Device Context (DC) freigegeben werden?
 
        If h_DC Then
 
            If ReleaseDC(h_Wnd,h_DC)=0 Then
 
                MessageBox(NULL, "Freigabe des Device Context fehlgeschlagen.", _
 
                "Fehler",MB_OK OR MB_ICONINFORMATION)
 
                '' Der DC wird entfernt
 
                h_DC=NULL
 
            End If
 
        End If
 
 
        '' Kann das Programmfenster geschlossen werden?
 
        If h_Wnd Then
 
            If DestroyWindow(h_Wnd)=0 Then
 
                MessageBox(NULL, "Konnte hWnd nicht löschen.", _
 
                "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
 
                '' Setze den hWnd auf NULL
 
                h_Wnd=NULL 
 
            End If
 
        End If
 
 
        '' Kann die Registrierung rückgängig gemacht werden?
 
        If UnregisterClass(@"OpenGL",h_Instance)=0 Then
 
            MessageBox(NULL, "Konnte Klasse nicht entfernen.", _
 
            "SHUTDOWN ERROR",MB_OK OR MB_ICONINFORMATION)
 
            '' Setze hInstance auf NULL
 
            h_Instance=NULL
 
        End If
 
    End If
 
End Sub        
 
 
 
Function CreateGLWindow (byval Win_title  as String , byval Win_width as Integer, _
 
                         byval Win_height as Integer, byval Win_bits  as Integer, _
 
                         byval screenflag as BOOL) as BOOL
 
    
 
    '' Speichert das Pixelformat
 
    Dim PixelFormat as GLuint
 
    '' wc wird eine Instanz der Fensterklasse
 
    Dim wc          as WNDCLASS
 
    '' weitere Informationen
 
    Dim dwExStyle   as DWORD
 
    '' Fensterinformationen
 
    Dim dwStyle     as DWORD
 
    '' Speicher für aktuelle Auflösung
 
    Dim WindowRect  as RECT
 
 
    '' Die linke Seite des Rechtecks wirtd auf 0 gesetzt
 
    WindowRect.left=0
 
    '' Hier wird die gewünschte Breite des Fensters gespeichert
 
    WindowRect.right=Win_width
 
    '' Die obere Seite wird auch auf 0 gesetzt
 
    WindowRect.top=0
 
    '' Und hier wird die Höhe abgelegt
 
    WindowRect.bottom=Win_height
 
 
    '' Instanz von DEVMODE wird erzeugt
 
    'DEVMODE dmScreenSettings; 
 
    Dim dmScreenSettings as DEVMODE
 
 
    '' Hier wird fullscreen 
 
    '' auf den Wert von screenflag 
 
    '' gesetzt, welches ja übergeben wurde
 
    fullscreen=screenflag
 
    '' Die Instanz des Programmes bekommt ein 
 
    '' Handle zugeordnet
 
    h_Instance = GetModuleHandle(NULL)
 
 
    '' Bei Veränderungen in der Höhe und/oder Breite, 
 
    '' soll ne gezeichnet werden
 
    wc.style = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
 
    '' WndProc behandelt die auftretenden Nachrichten
 
    wc.lpfnWndProc = @WndProc
 
    '' Wird nicht benötigt
 
    wc.cbClsExtra = 0
 
    '' und das auch nicht
 
    wc.cbWndExtra = 0
 
    '' Die Instanz wird festgelegt
 
    wc.hInstance = h_Instance
 
    '' Lädt das Standardsymbol
 
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO)
 
    '' Lädt einen Cursor
 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW)
 
    '' Es soll kein bestimmter Hintergrund angezeigt werden
 
    wc.hbrBackground = NULL
 
    '' Auch ein Menü wird nicht benötigt.
 
    wc.lpszMenuName = NULL
 
    '' OpenGL wird der Name der Klasse
 
    wc.lpszClassName = @"OpenGL"
 
 
    '' Versuch die Klasse zu registrieren
 
    If RegisterClass(@wc)=0 Then
 
        MessageBox(NULL, "Konnte die Fensterklasse nicht registrieren.", _
 
        "ERROR", MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurückgeben und beenden
 
        Return FALSE
 
    End If
 
 
    '' Soll im Vollbildmodus gestartet werden
 
    If .fullscreen Then
 
 
        'memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); 
 
        '// Diese wird geleert
 
 
        '' dmsize soll genauso groß wie die dmScreenSettings sein
 
        dmScreenSettings.dmSize = len(dmScreenSettings)
 
 
        '' Die drei Werte (height, width und bits) 
 
        '' wurden der Prozedur übergeben und werden 
 
        '' nun in dmScreenSettings gespeichert
 
        dmScreenSettings.dmPelsWidth  = Win_width
 
        dmScreenSettings.dmPelsHeight = Win_height
 
        dmScreenSettings.dmBitsPerPel = Win_bits 
 
        '' Hier werden die drei Werte in einem Ausdruck gespeichert
 
        dmScreenSettings.dmFields     = DM_BITSPERPEL OR DM_PELSWIDTH OR DM_PELSHEIGHT
 
    End If
 
 
    If ChangeDisplaySettings(@dmScreenSettings,CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL Then
 
        '' CDS_FULLSCREEN blendet zusätzlich die Startleiste aus
 
        
 
        If MessageBox(NULL, _
 
        "Der gewünschte Vollbildmodus wird nicht unterstützt, soll stattdessen im Fenstermodus ausgegeben werden?", _
 
        "OpenGL", MB_YESNO OR MB_ICONEXCLAMATION) = IDYES Then
 
            '' Der Benutzer möchte im Fenster weitermachen, 
 
            '' dazu wird fullscreen auf FALSE gesetzt
 
            .fullscreen=FALSE
 
        Else
 
        '' Falls der Benutzer das Programm aus gegebenen 
 
        '' Anlass beenden will, wird FALSE zurückgegeben.
 
            Return FALSE
 
        End If
 
    End If
 
    
 
 
    '' Konnte in den Vollbildmodus geschaltet werden? 
 
    '' (Wenn nicht, wird ja im Fenster weitergemacht!)
 
    If .fullscreen Then
 
        
 
        '' Fenstereigenschaften
 
        dwExStyle = WS_EX_APPWINDOW 
 
        '' Fenstereigenschaften
 
        dwStyle   = WS_POPUP
 
        '' Der Mauszeiger wird nicht angezeigt
 
        ShowCursor(FALSE)
 
    Else
 
        '' Das Fenster soll zusätzlich einen 3D Rahmen bekommen
 
        dwExStyle = WS_EX_APPWINDOW OR WS_EX_WINDOWEDGE
 
        '' Ein typisches Windowsfenster mit 
 
        '' Minimieren, Maximieren, etc
 
        dwStyle   = WS_OVERLAPPEDWINDOW
 
    End If
 
 
    '' Fenster wird angepasst
 
    AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
 
    
 
    '' dwExStyle       : Die erweiterten Eigenschaften des Fensters
 
    '' "OpenGL"        : Der Name der Klasse
 
    '' Win_title       : Der Titel des Fensters
 
    '' WS_CLIPSIBLINGS : Wird von OpenGL benötigt
 
    '' WS_CLIPCHILDREN : Wird auch von OpenGL benötigt
 
    '' dwStyle         : auch Eigenschaften des Fensters
 
    '' 0, 0            : Die Position des zu erstellenden Fensters
 
    '' WindowRect.right-WindowRect.left
 
    ''                 : die ermittelten Werte für die Breite
 
    '' WindowRect.bottom-WindowRect.top
 
    ''                 : und hier für die Länge
 
    '' NULL            : Es soll kein übergordnetes Fendster erstellt werden
 
    '' NULL            : kein Menü
 
    '' hInstance       : Die Instanz wird übergeben
 
    '' NULL            : Wird nicht benötigt
 
    
 
    .h_Wnd=CreateWindowEx(dwExStyle, _
 
        @"OpenGL", Win_title, _
 
        WS_CLIPSIBLINGS OR WS_CLIPCHILDREN OR dwStyle, _
 
        0, 0, WindowRect.right-WindowRect.left, _
 
        WindowRect.bottom-WindowRect.top, _
 
        NULL, NULL, .h_Instance, NULL)
 
    
 
    If .h_Wnd=0 Then
 
        '' Grafikeinstellungen zurücksetzen
 
        KillGLWindow()
 
        
 
        MessageBox(NULL, "Fenster konnte nicht erstellt werden.", _
 
        "ERROR", MB_OK OR MB_ICONEXCLAMATION)
 
        
 
        Return FALSE
 
    End If
 
 
 
    '' pdf ist jetzt ein PIXELFORMATDESCRIPTOR
 
    
 
    '' len(PIXELFORMATDESCRIPTOR) : Die größe muss natürlich stimmen
 
    '' 1,                         : Versionsnummer
 
    '' PFD_DRAW_TO_WINDOW         : Das Format muss in Fenster sichtbar sein können    
 
    '' PFD_SUPPORT_OPENGL         : OpenGL muss unterstützt werden
 
    '' PFD_DOUBLEBUFFER           : Double Buffering muss unterstützt werden
 
    '' PFD_TYPE_RGBA              : Das RGBA muss unterstützt werden
 
    '' bits                       : Die übergebene Farbtiefe wird hier benötigt
 
    '' 16                         : 16Bit Z-Buffer (Depth Buffer)
 
    '' PFD_MAIN_PLANE             : Die Hauptebene auf die später gezeichnet wird
 
    Static pfd as PIXELFORMATDESCRIPTOR
 
    pfd.nsize      = len(PIXELFORMATDESCRIPTOR)
 
    pfd.nVersion   = 1
 
    pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
 
    pfd.iPixelType = PFD_TYPE_RGBA
 
    pfd.cColorBits = Win_bits
 
    pfd.cDepthBits = 16
 
    pfd.iLayerType = PFD_MAIN_PLANE
 
 
 
    '' Versuch, den DC zu bekommen
 
    .h_DC=GetDC(.h_Wnd)
 
    If .h_DC=0 Then
 
        '' Alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte keinen DC erstellen.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurückgeben, beenden
 
        Return FALSE 
 
    End If
 
 
    '' Kann Windows ein passendes finden? 
 
    PixelFormat=ChoosePixelFormat(.h_DC,@pfd)
 
    If PixelFormat=0 Then 
 
  
 
        '' Falls keins gefunden werden kann:
 
        '' Alles zurücksetzen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte kein passendes Pixelformat finden.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und Ende.
 
        Return FALSE
 
    End If
 
 
    '' Kann das Pixelformat gesetzt werden?
 
    If SetPixelFormat(.h_DC,PixelFormat,@pfd)=0 Then
 
        '' Leider nicht, Fehlerpopup und raus
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte Pixelformat nicht setzen.", _
 
        "ERROR",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
    '' Versuch den RC zu bekommen
 
    .h_RC=wglCreateContext(.h_DC)
 
    If .h_RC=0 Then
 
        '' Alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte keinen Rendering Context bekommen.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
 
    '' Versuch den RC zu aktivieren
 
    If wglMakeCurrent(h_DC,h_RC)=0 Then
 
        '' hat nicht geklappt, also alles zurück
 
        KillGLWindow()
 
        MessageBox(NULL,"Konnte den Rendering Context nmicht aktivieren.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE zurück und raus
 
        Return FALSE
 
    End If
 
 
    '' Fenster anzeigen
 
    ShowWindow(.h_Wnd,SW_SHOW)
 
    '' Priorität des Programms wird erhöht
 
    SetForegroundWindow(.h_Wnd)
 
    '' Tastatureingaben werden jetzt an das Programm geleitet
 
    SetFocus(.h_Wnd)
 
                  
 
    '' Die Perspektive wird aktiviert
 
    ReSizeGLScene(Win_width, Win_height)
 
 
    '' Initialisiere das OpenGL Fenster
 
    If InitGL()=0 Then
 
        '' Falls das nicht geklappt haben sollte alles rückgängig machen
 
        KillGLWindow()
 
        MessageBox(NULL,"Initialisierung fehlgeschlagen.", _
 
        "Fehler",MB_OK OR MB_ICONEXCLAMATION)
 
        '' FALSE wird zurückgegeben
 
        Return FALSE
 
    End If
 
    '' Alles hat geklappt!!!
 
    Return TRUE
 
End Function
 
 
 
 
Function WndProc(byval h_Wnd as HWND, byval u_Msg as UINT, _
 
                 byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
 
                 
 
    '' Sind Nachrichten in der Nachrichtenschleife?
 
    Select Case (u_Msg)
 
        
 
        '' Ist das Programm aktiv?
 
        Case WM_ACTIVATE
 
            '' Ist das Programm nicht minimiert?
 
            If HIWORD(w_Param)=0 Then
 
                '' active wird TRUE
 
                active=TRUE
 
            Else
 
                '' Programm ist minimiert
 
                active=FALSE
 
            End If
 
            '' Rückgabe: 0
 
            Return 0
 
        
 
        '' Ist ein Systemkommando (wie z.B. 
 
        '' "Bildschirmschoner soll gestartet werden") vorhanden?
 
        Case WM_SYSCOMMAND
 
            '' wParam würde diesen Befehl enthalten
 
            Select Case (w_Param)
 
                '' Versucht Windows den Bildschirmschoner zu starten
 
                Case SC_SCREENSAVE
 
                    '' wird durch die Rückgabe von 0 verhindert
 
                    Return 0
 
                '' Soll der Monitor in den Stromsparmodus gehen?
 
                Case SC_MONITORPOWER
 
                    '' wird durch die Rückgabe von 0 verhindert
 
                    Return 0
 
            ''break; // Das wars.
 
            End Select
 
        
 
        '' Ist eine WM_CLOSE Nachricht vorhanden?
 
        Case WM_CLOSE 
 
            '' Die Nachricht zum Beenden wird "gepostet"
 
            PostQuitMessage(0)
 
            '' und zurück.
 
            Return 0
 
        
 
        '' Drückt der Benutzer eine Taste???
 
        Case WM_KEYDOWN
 
            '' Der Wert im Array keys[] der dem Code 
 
            '' der Taste entspricht, wird true gesetzt
 
            keys[w_Param] = TRUE
 
            '' und zurück...
 
            Return 0
 
 
        '' Wurde eine Taste losgelassen?
 
        Case WM_KEYUP
 
            '' Wen ja, dann soll dieser Wert im Array keys[] 
 
            '' auf FALSE gesetzt werden
 
            keys[w_Param] = FALSE
 
            '' und zurück.
 
            Return 0
 
        '' Die Fenstergröße wurde geändert
 
        Case WM_SIZE
 
            '' LoWord ist die Breite, HiWord die Höhe, 
 
            '' ReSizeGLScene() verändert dann die 
 
            '' Größe des OpenGL-Fensters
 
            ReSizeGLScene(LOWORD(l_Param),HIWORD(l_Param))
 
            '' und zurück
 
            Return 0
 
    End Select
 
    
 
    Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)
 
End Function
 
 
 
 
Function WinMain(byval h_Instance     as HINSTANCE, _
 
                 byval h_PrevInstance as HINSTANCE, _
 
                 byval lp_CmdLine     as LPSTR    , _
 
                 byval n_CmdShow      as Integer  ) as Integer
 
 
    Dim wm_msg  as MSG
 
    Dim wm_done as BOOL = FALSE
 
 
 
    If MessageBox(NULL,"Soll im Vollbildmodus gestartet werden?", _
 
    "Vollbilmodus gewünscht?",MB_YESNO OR MB_ICONQUESTION)=IDNO Then
 
        '' Falls nein gedrückt wurde, 
 
        '' wird fullscreen false gesetzt
 
        fullscreen=FALSE
 
    End If
 
 
    If CreateGLWindow("Opengl Tutorial 1 - Nur ein schwarzes Fenster - www.codeworx.org", _
 
    640,480,16,fullscreen)=0 Then
 
        '' Falls ein Fehler auftrat, beenden
 
        Return 0
 
    End If
 
    
 
 
    '' Solange done nicht TRUE ist:
 
    While wm_done=FALSE
 
        
 
        '' Sind Nachrichten vorhanden
 
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
 
    
 
            '' Liegt eine Nachricht zum beenden vor?
 
            If wm_msg.message=WM_QUIT Then
 
                '' Wenn dem so ist, wird done 
 
                '' true und das Programm beendet
 
                wm_done=TRUE
 
            '' Wenn nicht werden die anderen Nachrichten ausgewertet
 
            Else 
 
                '' Umformen der Nachricht
 
                TranslateMessage(@wm_msg)
 
                DispatchMessage(@wm_msg)
 
            End If
 
        '' Falls keine Nachrichten bereit liegen
 
        Else
 
            '' Programm aktiv?
 
            If (active) Then
 
                '' Wurde ESC gedrückt?
 
                If keys[VK_ESCAPE] Then
 
                    '' Wenn ESC gedrückt wurde, beenden
 
                    wm_done=TRUE
 
                '' ESC wurde nicht gedrückt
 
                Else 
 
                    '' Die Szene ausgeben
 
                    DrawGLScene()
 
                    '' Die Puffer werden getauscht
 
                    SwapBuffers(h_DC)
 
                End If
 
                
 
                '' Wird F1 gedrückt?
 
                If keys[VK_F1] Then
 
                    '' Es darf nicht gewartet werden bis F1 losgelassen wird,
 
                    '' ansonsten könnte das Bild mehrmals hin und herschalten
 
                    keys[VK_F1]=FALSE
 
                    '' Das aktuelle Fenster wird gelöscht
 
                    KillGLWindow()
 
                    '' fullscreen erhält seinen entgegengesetzten Wert
 
                    '' (bei FALSE TRUE, und bei TRUE FALSE.)
 
                    fullscreen=NOT(fullscreen)
 
                    If CreateGLWindow("Lektion 1",640,480,16,fullscreen)=0 Then
 
                        '' Zurück falls ein Fehler auftrat
 
                        Return 0
 
                    End If
 
                End If
 
            End If
 
        End If
 
    Wend
 
    '' Das Fenster löschen.
 
    KillGLWindow()
 
    '' Das Programm verlassen.
 
    Return (wm_msg.wParam)
 
End Function
 
 
 
CreateGLWindow("Test",400,400,32,0)
 
 
sleep
 
 
h_RC  = NULL
 
h_RC  = NULL
 
h_Wnd = NULL
 
        
 
deallocate (keys)
 
active     = FALSE
 
fullscreen = FALSE
 
 | 	 
  _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		MOD Fleißiger Referenzredakteur
  
  Anmeldungsdatum: 10.09.2007 Beiträge: 1003
 
  | 
		
			
				 Verfasst am: 02.10.2011, 11:30    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Statische Methoden in UDTs sind kein Problem, hier ein kleiner Beispielcode:
 
 
Function- und Subpointer Vergleich
 
 
Im Beispiel wird auch gezeigt, wie man durch Überladung gleichzeitig eine statische und eine nicht statische Version der gleichen Methode nutzen kann. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 02.10.2011, 11:51    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				gerade getestet, da spuckte der Compiler mir direkt das nächste aus:
 
 
 	  | Zitat: | 	 		  | error 183: Only static members can be accessed from static functions | 	  
 
 
hab dazu dann das hier gefunden:
 
 
 	  | Zitat: | 	 		  | Du kannst zwar auf eine statische Prozedur zeigen, aber die kann nicht mehr auf die anderen Records des UDTs zugreifen - ziemlich sinnlos also | 	  
 
 
also doch nicht so einfach zu machen, schade... _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		MOD Fleißiger Referenzredakteur
  
  Anmeldungsdatum: 10.09.2007 Beiträge: 1003
 
  | 
		
			
				 Verfasst am: 02.10.2011, 12:39    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| Schau dir meinen Beispielcode bitte genau an, die statische Methode kriegt das eigene Objekt explizit als Parameter mitgegeben, somit kann man auch darauf zugreifen. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Jojo alter Rang
  
  Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
  | 
		
			
				 Verfasst am: 02.10.2011, 12:41    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Das selbe Problem musste ich interessanterweise schon einem Kommilitonen in C++ lösen (bzw feststellen dass es nur sehr hässlich geht). Ich hab mir nicht deinen gesamten Code angeschaut, aber da es sich um OpenGL dreht, vermute ich, dass du genau wie er daran scheiterst, dass du den Callback-Funktionen keine zusätzlichen Benutzerdaten übergeben kannst. Wäre das möglich, könntest du z.B. einfach einen Pointer auf ein UDT übergeben. Aber so bringt das UDT in der Tat nicht viele Vorteile, außer dass der globale Namespace nicht so verschmutzt 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 | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 02.10.2011, 13:03    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				In deinem Beispiel wird (leicht verwirrend) das eigene UDT übergeben,
 
so das es Indirekt zugriff auf die Records erhält...
 
 
Bei meinem Beispiel versuch ich ein Fenster mithilfe der WinAPI zu erstellen, und diese brauch irgendwie die Callback Function auf dessen übergabe ich keinen einfluss habe...
 
 
Ich kann die zwar jetzt so übergeben, aber wie gesagt ist dann das Problem das ich nicht auf die Records zugreifen kann.
 
 
http://msdn.microsoft.com/de-de/library/ms633573.aspx _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		MOD Fleißiger Referenzredakteur
  
  Anmeldungsdatum: 10.09.2007 Beiträge: 1003
 
  | 
		
			
				 Verfasst am: 02.10.2011, 13:07    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				| Naja gut, wenn es so ist wie Jojo auch sagt, dass du keinen Einfluss darauf hast, dann ist UDT momentan eine schlechte Wahl. Zum Aufräumen höchstens noch ein Namespace, der Effektiv aber nicht viel bringt. | 
			 
		  | 
	 
	
		| 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.
  | 
   
 
     |