Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Callback auf Funkionen in einem UDT??

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 02.10.2011, 01:15    Titel: Callback auf Funkionen in einem UDT?? Antworten mit Zitat

Hi zusammen,
Auch wenn mein Beispiel Windows-spezifisch ist,
gilt die frage wohl eher FB im allgemeinen zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.10.2011, 01:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 02.10.2011, 01:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 02.10.2011, 02:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 02.10.2011, 12:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 02.10.2011, 12:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 02.10.2011, 13:39    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.10.2011, 13:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 02.10.2011, 14:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 02.10.2011, 14:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz