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:

multikey bei mehreren Fenstern?

 
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: 12.03.2013, 01:37    Titel: multikey bei mehreren Fenstern? Antworten mit Zitat

Wollte eigentlich meine 'opengl durch zweites fenster routine' überarbeiten und hatte etwas langeweile wo ich mal mit zwei fenstern mit opengl render context rumgespielt habe...
Klappt eigentlich ganz gut, nur funktioniert nun plötzlich die abfrage von Multikey so nicht mehr, inkey dagegen funktioniert problemlos wie es scheint... liegt es an meinem code, vielleicht das abfangen der messages vom anderen fenstern, das hin und her springen des rendercontextes oder an irgendwas anderes?

nebenbei reagieren beide fenster teilweise sehr träge...

hier langer bastelcode: (fehlt natürlich noch einiges)
Code:

#Include once "windows.bi"
#Include once "GL/gl.bi"
'#Include once "GL/glext.bi"
#Include once "GL/glu.bi"

#Define cmdmsg(msg) Open cons for output as #99 : print #99,msg : close #99 :

#Define VSYNC &b000010000

Namespace Win32_Window
   
    #IfnDef PFNWGLSWAPINTERVALEXTPROC
    Type PFNWGLSWAPINTERVALEXTPROC as Function (interval as integer) as BOOL '(WINAPI *PFNWGLSWAPINTERVALEXTPROC)(int interval);
    #EndIf
       
    Dim h_Instance as hInstance 'Program Instance Handle
    Dim h_DC       as HDC       'Device Context Handle
    Dim h_RC       as HGLRC     'OpenGL Rendering Context Handle
    Dim h_Wnd      as HWND      'Window Handle
   
   
    Dim Win_width  as UInteger
    Dim Win_height as UInteger
    Dim Win_bits   as UInteger
    Dim Win_bpp    as UInteger
    Dim Win_title  as STRING
    Dim Win_driver as STRING
   
    Declare Function WndProc_win32 (byval h_Wnd as HWND, byval u_Msg as UINT, byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
    Declare Function KillWindow_win32() as BOOL
   
    Function InitWindow_win32() as BOOL
        Screeninfo Win_width,Win_height,Win_bits,Win_bpp,,,Win_driver
       
        If (screenptr = 0) Then
            '' Error:
            cmdmsg("ERROR: No Mainscreen initialised.")
            Return FALSE
        End If
       
        If (lcase(Win_driver)="opengl") Then
            '' Error:
            cmdmsg("ERROR: OpenGL is initialised on Mainscreen.")
            'Return FALSE
        End If
       
        Win_title = "Win32GL"
       
        Return TRUE
    End Function
   
   
    Function CreateGLWindow_win32(byval flags as UInteger = 0, byval DepthBits as UInteger = 16) as BOOL
        h_Instance = GetModuleHandle(NULL)
       
        '' ----
        Dim wc          as WNDCLASSEX
        Dim wcname      as STRING * 8  = "Win32GL"+chr(0)
       
        With wc
            .cbSize        = sizeof(WNDCLASSEX)
            .style         = CS_HREDRAW OR CS_VREDRAW OR CS_OWNDC
            .lpfnWndProc   = @WndProc_win32
            .cbClsExtra    = 0
            .cbWndExtra    = 0
            .hInstance     = h_Instance
            .hIcon         = LoadIcon(NULL, IDI_WINLOGO)
            .hCursor       = LoadCursor(NULL, IDC_ARROW)
            .hbrBackground = NULL
            .lpszMenuName  = NULL
            .lpszClassName = strptr(wcname)
        End With
   
        If (RegisterClassEx(@wc) = 0) Then
            '' Error: could not register Window Class
            cmdmsg("ERROR: could not register Window Class")
            Return FALSE
        End If
        '' ----
       
       
        '' ----
        Dim dwExStyle   as DWORD
        Dim dwStyle     as DWORD
       
        dwExStyle = WS_EX_APPWINDOW OR WS_EX_WINDOWEDGE
        dwStyle   = WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX
        'dwStyle   = WS_OVERLAPPEDWINDOW 'RESIZABLE flag
        'dwStyle   = WS_POPUP
       
        Dim WindowRect  as RECT
       
        With WindowRect
            .left   = 0
            .top    = 0
            .right  = Win_width
            .bottom = Win_height
        End With
       
        AdjustWindowRectEx(@WindowRect, dwStyle, FALSE, dwExStyle)
       
        h_Wnd = CreateWindowEx(dwExStyle, strptr(wcname), Win_title, dwStyle, 0, 0, WindowRect.right-WindowRect.left, WindowRect.bottom-WindowRect.top, NULL, NULL, h_Instance, NULL)
       
        If (h_Wnd = 0) Then
            '' Error: couldn't create Window
            KillWindow_win32()
            Return FALSE
        End If
       
        h_DC  = GetDC(h_Wnd)
       
        If (h_DC = 0) Then
            '' Error: couldn't get DC
            KillWindow_win32()
            Return FALSE
        End If
        '' ----
       
        '' set up pixelformat
        Dim pfd         as PIXELFORMATDESCRIPTOR
       
        Dim alphabits as UInteger
        If (Win_bits = 32) Then
            alphabits = 8
        Else
            alphabits = 0
        End If
       
        '' Note: '*' not realy sure what it is doing right now (get information)
        With pfd
            .nSize = sizeof(PIXELFORMATDESCRIPTOR)
            .nVersion        = 1 '*
            .dwFlags         = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER '*
            .iPixelType      = PFD_TYPE_RGBA 'or PFD_TYPE_COLORINDEX
            .cColorBits      = Win_bits  'Zero or grater
            .cRedBits        = 0 'Not used
            .cRedShift       = 0 'Not used
            .cGreenBits      = 0 'Not used
            .cGreenShift     = 0 'Not used
            .cBlueBits       = 0 'Not used
            .cBlueShift      = 0 'Not used
            .cAlphaBits      = alphabits
            .cAlphaShift     = 0 'Not Used
            .cAccumBits      = 0 '*
            .cAccumRedBits   = 0 'Not used
            .cAccumGreenBits = 0 'Not used
            .cAccumBlueBits  = 0 'Not used
            .cAccumAlphaBits = 0 'Not used
            .cDepthBits      = DepthBits '*
            .cStencilBits    = 0 '*
            .cAuxBuffers     = 0 '*
            .iLayerType      = PFD_MAIN_PLANE
            .bReserved       = 0 'Not used
            .dwLayerMask     = 0 'Not used
            .dwVisibleMask   = 0 'Not used
            .dwDamageMask    = 0 'Not used
        End With
        cmdmsg(pfd.cColorBits)
        '' choose pixelformat
        Dim PixelFormat as GLuint
       
        PixelFormat = ChoosePixelFormat(h_DC, @pfd)
       
        If (PixelFormat = 0) Then
            '' Error: couldn't find any pixelformat
            KillWindow_win32()
            Return FALSE
        End If
       
        '' set pixelformat
        If (SetPixelFormat(h_DC, PixelFormat, @pfd) = 0) Then
            '' Error: couldn't set pixelformat
            KillWindow_win32()
            Return FALSE
        End If
       
        '' get rendering context
        h_RC = wglCreateContext(h_DC)
       
        If (h_RC = 0) Then
            '' Error: couldn't get Rendering Context
            KillWindow_win32()
            Return FALSE
        End If
       
        '' activate rendering context
        If (wglMakeCurrent(h_DC, h_RC) = 0) Then
            '' Error: couldn't activate rendering context
            KillWindow_win32()
            Return FALSE
        End If
       
        ShowWindow(h_Wnd, SW_SHOW)
        SetForegroundWindow(h_Wnd)
        SetFocus(h_Wnd)
       
        ''V-Sync
        Dim wglSwapIntervalEXT as PFNWGLSWAPINTERVALEXTPROC
       
        wglSwapIntervalEXT = cast(PFNWGLSWAPINTERVALEXTPROC,wglGetProcAddress("wglSwapIntervalEXT"))
       
        If (wglSwapIntervalEXT = 0) Then
            '' WARNING: no V-Sync
            cmdmsg("WARNING: V-Sync not available")
        Else
            If (flags AND VSync) Then
                cmdmsg("INFO: V-Sync activated")
                wglSwapIntervalEXT(1)
            Else
                wglSwapIntervalEXT(0)
            End If
        End If
       
        Return TRUE
    End Function ''CreateWindow_win32
   
    Function KillWindow_win32() as BOOL
        return TRUE
    End Function ''KillWindow_win32
   
    Function WndProc_win32 (byval h_Wnd   as HWND, byval u_Msg   as UINT, byval w_Param as WPARAM, byval l_Param as LPARAM) as LRESULT
   
        Select Case (u_Msg)
            Case WM_SYSCOMMAND
                Select Case (w_Param)
                    Case SC_SCREENSAVE
                        Return 0
                    Case SC_MONITORPOWER
                        Return 0
                End Select
            Case WM_CLOSE
                PostQuitMessage(0)
                Return 0
        End Select
   
        Return DefWindowProc(h_Wnd,u_Msg,w_Param,l_Param)   
    End Function ''WndProc_win32
   
   
    'UnregisterClass("Wnd32GL", GetModuleHandle(NULL))

End Namespace 'Win32_Window

Screenres 640,480,32,,&h02
Dim h_Wnd      as HWND
Dim h_DC       as HDC       'Device Context Handle
Dim h_RC       as HGLRC     'OpenGL Rendering Context Handle

ScreenControl 2, cast(Integer, h_Wnd )

h_DC  = wglGetCurrentDC()'GetDC(h_Wnd)
h_RC  = wglGetCurrentContext()

If (Win32_Window.InitWindow_win32()) Then
    Win32_Window.CreateGLWindow_win32(VSYNC)
End If
cmdmsg(h_Wnd)
cmdmsg(h_DC)
cmdmsg(h_RC)

wglMakeCurrent(h_DC, h_RC)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0f,640/480,0.1f,100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
   
glShadeModel(GL_SMOOTH)
glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
glClearDepth(1.0f)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

wglMakeCurrent(Win32_Window.h_DC, Win32_Window.h_RC)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0f,640/480,0.1f,100.0f)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
   
glShadeModel(GL_SMOOTH)
glClearColor(0.0f, 0.0f, 0.0f, 0.0f)
glClearDepth(1.0f)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

Dim wm_msg as MSG 
dim ikey as string
do
       
        If (PeekMessage(@wm_msg,NULL,0,0,PM_REMOVE)) Then
            TranslateMessage(@wm_msg)
            DispatchMessage(@wm_msg)           
        End If
       
        wglMakeCurrent(h_DC, h_RC)
       
        glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
       
        gltranslatef 0.0,0.0,-6.0
       
        glBegin(GL_TRIANGLES)
            glColor3f 0.3,0.0,0.0
            glVertex3f  0.0, 0.5,0.0
            glColor3f 0.2,1.0,0.0
            glVertex3f  1.0,-0.5,0.0
            glColor3f 0.0,0.0,1.0
            glVertex3f -1.0,-0.5,0.0
        glEnd()
       
        SwapBuffers(h_DC)

        wglMakeCurrent(Win32_Window.h_DC, Win32_Window.h_RC)
       
        glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
       
        gltranslatef 0.0,0.0,-5.0
       
        glBegin(GL_TRIANGLES)
            glColor3f 1.0,0.0,0.0
            glVertex3f  0.0, 0.5,0.0
            glColor3f 0.0,1.0,1.0
            glVertex3f  1.0,-0.5,0.0
            glColor3f 0.0,0.0,1.0
            glVertex3f -1.0,-0.5,0.0
        glEnd()
       
        SwapBuffers(Win32_Window.h_DC)

       
        ikey=inkey
        if ikey<>"" then cmdmsg(asc(ikey))
        if ikey=chr(27) THEN EXIT DO
loop until multikey(&h01)'ESC

_________________
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: 12.03.2013, 02:09    Titel: Antworten mit Zitat

OT: Musst du diese ellenlangen Codes immer pasten? Dafür gibt es doch das NoPaste im FB-Portal oder von mir aus auch Pastebin! Grade wenn dann erst mal eine Diskussion am Laufen ist, stören so seitenlange Codes einfach nur noch.
_________________
» 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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 12.03.2013, 15:07    Titel: Antworten mit Zitat

OT: Auch wenn hier lange Codes den Lesefluss beeinträchtigen, finde ich es (insbesondere für Archivzwecke) sinnvoller, wenn Code direkt im Forum gepostet wird, als irgendwo extern (wobei FBP nicht unbedingt zu den "externen" gehört). Ansonsten ist nach einiger Zeit oft der Code verloren, weil die externe Seite nicht mehr erreichbar ist.
Viel sinnvoller würde ich es betrachten, wenn man die Foren-Software um eine Code-Collapse Funktion, so wie im internationalen Forum bereits vorhanden, erweitern würde. Das wäre wahrscheinlich nahezu kein Aufwand und würd beide Probleme lösen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4702
Wohnort: ~/

BeitragVerfasst am: 13.03.2013, 15:05    Titel: Antworten mit Zitat

Code-Collapse ist glaube ich sowieso geplant. Aber wie du schon sagtest: FBP ist nichts externes, sondern wurde extra für diesen Zweck bereitgestellt; und da geht auch ganz bestimmt kein Code verloren. happy
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
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