 |
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, 01: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, 01: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, 01: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, 02: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, 12: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, 12: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, 13: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, 13: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, 14: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, 14: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.
|
|