• Welcome to PlanetSquires Forums.
 

Keyboardcodes OpenGL qt

Started by Frank Bruebach, March 13, 2024, 10:24:20 AM

Previous topic - Next topic

Frank Bruebach

Hello all how I can make a Keyboard Code Action including to Afx and OpenGL (Here: gl/Windows/glu.bi ?

#include <GLFW/glfw3.h>

// This function is called whenever a key is pressed or released
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (action == GLFW_PRESS)
    {
        // Print the key code when a key is pressed
        printf("Key pressed: 0x%x\n", key);
    }
}

int main()
{
    // Initialize GLFW
    if (!glfwInit())
    {
        return -1;
    }

    // Create a window
    GLFWwindow* window = glfwCreateWindow(800, 600, "My OpenGL Window", NULL, NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    // Make the window's context current
    glfwMakeContextCurrent(window);

    // Set the key callback function
    glfwSetKeyCallback(window, key_callback);

    // Main loop
    while (!glfwWindowShouldClose(window))
    {
        // Render your scene here

        // Swap the front and back buffers
        glfwSwapBuffers(window);

        // Poll for events
        glfwPollEvents();
    }

    // Terminate GLFW
    glfwTerminate();
    return 0;
}
This code sets up a key

Theres a sub in nehe example 03 for example with cogl.processKeyStrokes() thats the right place?

This Kind of Setup is new for me

Regards frank

José Roca

Better take another example like the 08, which processes several keys:

' =======================================================================================
' Processes keystrokes
' Parameters:
' * uMsg = The Windows message
' * wParam = Additional message information.
' * lParam = Additional message information.
' The contents of the wParam and lParam parameters depend on the value of the uMsg parameter.
' =======================================================================================
SUB COGL.ProcessKeystrokes (BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)

   STATIC AS BOOLEAN lp, fp, light

   SELECT CASE uMsg
      CASE WM_KEYDOWN   ' // A nonsystem key has been pressed
         SELECT CASE LOWORD(wParam)
            CASE VK_ESCAPE
               ' // Send a message to close the application
               SendMessageW m_hwnd, WM_CLOSE, 0, 0
            CASE VK_B
               blend = NOT blend
               IF blend = FALSE THEN
                  glEnable GL_BLEND
                  glDisable GL_DEPTH_TEST
               ELSE
                  glDisable GL_BLEND
                  glEnable GL_DEPTH_TEST
               END IF
            CASE VK_L
               light = NOT light
               IF light = FALSE THEN glDisable GL_LIGHTING ELSE glEnable GL_LIGHTING
            CASE VK_F
               filter += 1
               IF filter > 2 THEN filter = 0
            CASE VK_PRIOR   ' // page up
               zoom -= 0.02
            CASE VK_NEXT   ' // page down
               zoom += 0.02
            CASE VK_UP
               xspeed -= 0.01
            CASE VK_DOWN
               xspeed += 0.01
            CASE VK_LEFT
               yspeed -= 0.01
            CASE VK_RIGHT
               yspeed += 0.01
         END SELECT
   END SELECT

END SUB
' =======================================================================================

Frank Bruebach

#2
Yes thanks Its a good example i have tested already but my question directed more to General  Keyboard Codes in OpenGL Modu

Something below
Case WM_KEYDOWN
...
fictive code
Print "last key pressed"
If lastkey = 1 then
Print lastkey + "  = 0x" hex(lastkey)
End If

#macro keydown
Case 27 : ' No Action ' escape key
Case 32 : ' No Action  ' space key
#endmacro


'sorry, my mistake, I know your nehe 8 example 'already yes it's a good one but my intention was
'to print the keyboard key codes :-)

'something like that in openGL and appears on 'console too

'

glColor4f 1.0, 1.0, 1.0, 0.5
dim mylastkey as integer

if mylastkey ' = 1 then
  print mylastkey " = 0x" hex(mylastkey)
else
  print "(none)"
end if

' my name
f 70=0x46
r 82=0x52
a 65=0x41
n 78=0x4e
k 75=0x4B


I have tried to built in nehe example 10 but failed

Frank Bruebach

#3
Good morning I have the solution was quite simple often WE are thinking too complicated lol

Used nehe 2 example.. If you Press a Keyboard Key the Hex value IS displayed

Solution Looks Like this one

CASE WM_KEYDOWN
         ' // Process keystrokes
           ' shows all keyboard codes :-)
            wkeystate = wParam AND &HFF ' Extract the key code
            PRINT "Last key pressed: 0x"; HEX(wkeystate)


'
########################################################################################
' Microsoft Windows
' File: CW_OGL_Nehe_02
' Contents: CWindow OpenGL - NeHe lesson 2
' Compiler: FreeBasic 32 & 64 bit
' Translated in 2017 by José Roca. Freeware. Use at your own risk.
' THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
' EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
' MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
' ########################################################################################

#define UNICODE
#INCLUDE ONCE "Afx/CWindow.inc"
#INCLUDE ONCE "GL/windows/glu.bi"
USING Afx

CONST GL_WINDOWWIDTH  = 600              ' Window width
CONST GL_WINDOWHEIGHT  = 400              ' Window height
CONST GL_WindowCaption = "NeHe Lesson 2"  ' Window caption

DECLARE FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
                          BYVAL hPrevInstance AS HINSTANCE, _
                          BYVAL szCmdLine AS ZSTRING PTR, _
                          BYVAL nCmdShow AS LONG) AS LONG

  END WinMain(GetModuleHandleW(NULL), NULL, COMMAND(), SW_NORMAL)

' // Forward declarations
DECLARE FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

' =======================================================================================
' OpenGL class
' =======================================================================================
TYPE COGL

  Private:
      m_hDC AS HDC      ' // Device context handle
      m_hRC AS HGLRC    ' // Rendering context handle
      m_hwnd AS HWND    ' // Window handle

  Public:
      DECLARE CONSTRUCTOR (BYVAL hwnd AS HWND, BYVAL nBitsPerPel AS LONG = 32, BYVAL cDepthBits AS LONG = 24)
      DECLARE DESTRUCTOR
      DECLARE SUB SetupScene (BYVAL nWidth AS LONG, BYVAL nHeight AS LONG)
      DECLARE SUB ResizeScene (BYVAL nWidth AS LONG, BYVAL nHeight AS LONG)
      DECLARE SUB RenderScene
      DECLARE SUB ProcessKeystrokes (BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)
      DECLARE SUB ProcessMouse (BYVAL uMsg AS UINT, BYVAL wKeyState AS DWORD, BYVAL x AS LONG, BYVAL y AS LONG)
      DECLARE SUB Cleanup

END TYPE
' =======================================================================================

' ========================================================================================
' COGL constructor
' ========================================================================================
CONSTRUCTOR COGL (BYVAL hwnd AS HWND, BYVAL nBitsPerPel AS LONG = 32, BYVAL cDepthBits AS LONG = 24)

  DO  ' // Using a fake loop to avoid the use of GOTO or nested IFs/END IFs

      ' // Get the device context
      IF hwnd = NULL THEN EXIT DO
      m_hwnd = hwnd
      m_hDC = GetDC(m_hwnd)
      IF m_hDC = NULL THEN EXIT DO

      ' // Pixel format
      DIM pfd AS PIXELFORMATDESCRIPTOR
      pfd.nSize      = SIZEOF(PIXELFORMATDESCRIPTOR)
      pfd.nVersion  = 1
      pfd.dwFlags    = PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER
      pfd.iPixelType = PFD_TYPE_RGBA
      pfd.cColorBits = nBitsPerPel
      pfd.cDepthBits = cDepthBits

      ' // Find a matching pixel format
      DIM pf AS LONG = ChoosePixelFormat(m_hDC, @pfd)
      IF pf = 0 THEN
        MessageBoxW hwnd, "Can't find a suitable pixel format", _
                    "Error", MB_OK OR MB_ICONEXCLAMATION
        EXIT DO
      END IF

      ' // Set the pixel format
      IF SetPixelFormat(m_hDC, pf, @pfd) = FALSE THEN
        MessageBoxW hwnd, "Can't set the pixel format", _
                    "Error", MB_OK OR MB_ICONEXCLAMATION
        EXIT DO
      END IF

      ' // Create a new OpenGL rendering context
      m_hRC = wglCreateContext(m_hDC)
      IF m_hRC = NULL THEN
        MessageBoxW hwnd, "Can't create an OpenGL rendering context", _
                    "Error", MB_OK OR MB_ICONEXCLAMATION
        EXIT DO
      END IF

      ' // Make it current
      IF wglMakeCurrent(m_hDC, m_hRC) = FALSE THEN
        MessageBoxW hwnd, "Can't activate the OpenGL rendering context", _
                    "Error", MB_OK OR MB_ICONEXCLAMATION
        EXIT DO
      END IF

      ' // Exit the fake loop
      EXIT DO
  LOOP

END CONSTRUCTOR
' ========================================================================================

' ========================================================================================
' COGL Destructor
' ========================================================================================
DESTRUCTOR COGL
  ' // Release the device and rendering contexts
  wglMakeCurrent m_hDC, NULL
  ' // Make the rendering context no longer current
  wglDeleteContext m_hRC
  ' // Release the device context
  ReleaseDC m_hwnd, m_hDC
END DESTRUCTOR
' ========================================================================================

' =======================================================================================
' All the setup goes here
' =======================================================================================
SUB COGL.SetupScene (BYVAL nWidth AS LONG, BYVAL nHeight AS LONG)

  ' // Specify clear values for the color buffers
  glClearColor 0.0, 0.0, 0.0, 0.0
  ' // Specify the clear value for the depth buffer
  glClearDepth 1.0
  ' // Specify the value used for depth-buffer comparisons
  glDepthFunc GL_LESS
  ' // Enable depth comparisons and update the depth buffer
  glEnable GL_DEPTH_TEST
  ' // Select smooth shading
  glShadeModel GL_SMOOTH

END SUB
' =======================================================================================

' =======================================================================================
' Resize the scene
' =======================================================================================
SUB COGL.ResizeScene (BYVAL nWidth AS LONG, BYVAL nHeight AS LONG)

  ' // Prevent divide by zero making height equal one
  IF nHeight = 0 THEN nHeight = 1
  ' // Reset the current viewport
  glViewport 0, 0, nWidth, nHeight
  ' // Select the projection matrix
  glMatrixMode GL_PROJECTION
  ' // Reset the projection matrix
  glLoadIdentity
  ' // Calculate the aspect ratio of the window
  gluPerspective 45.0, nWidth / nHeight, 0.1, 100.0
  ' // Select the model view matrix
  glMatrixMode GL_MODELVIEW
  ' // Reset the model view matrix
  glLoadIdentity

END SUB
' =======================================================================================

' =======================================================================================
' Draw the scene
' =======================================================================================
SUB COGL.RenderScene

  ' // Clear the screen buffer
  glClear GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT
  ' // Reset the view
  glLoadIdentity

  glTranslatef -1.5, 0.0, -6.0          ' Move left 1.5 units and into the screen

  glBegin GL_TRIANGLES                  ' Drawing using triangles
      glVertex3f  0.0, 1.0, 0.0          ' Top
      glVertex3f  1.0,-1.0, 0.0          ' Bottom right
      glVertex3f -1.0,-1.0, 0.0          ' Bottom left
  glEnd                                ' Finished drawing the triangle

  glTranslatef 3.0,0.0,0.0              ' Move right 3 units

  glBegin GL_QUADS                      ' Draw a quad
      glVertex3f -1.0, 1.0, 0.0          ' Top left
      glVertex3f  1.0, 1.0, 0.0          ' Top right
      glVertex3f  1.0,-1.0, 0.0          ' Bottom right
      glVertex3f -1.0,-1.0, 0.0          ' Bottom left
  glEnd                                ' Done drawing the quad

  ' // Exchange the front and back buffers
  SwapBuffers m_hdc

END SUB
' =======================================================================================

' =======================================================================================
' Processes keystrokes
' Parameters:
' * uMsg = The Windows message
' * wParam = Additional message information.
' * lParam = Additional message information.
' The contents of the wParam and lParam parameters depend on the value of the uMsg parameter.
' =======================================================================================
SUB COGL.ProcessKeystrokes (BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM)

  SELECT CASE uMsg
      CASE WM_KEYDOWN  ' // A nonsystem key has been pressed
        SELECT CASE LOWORD(wParam)
            CASE VK_ESCAPE
              ' // Send a message to close the application
              SendMessageW m_hwnd, WM_CLOSE, 0, 0
        END SELECT
  END SELECT

END SUB
' =======================================================================================

' =======================================================================================
' Processes mouse clicks and movement
' Parameters:
' * wMsg      = Windows message
' * wKeyState = Indicates whether various virtual keys are down.
'              MK_CONTROL    The CTRL key is down.
'              MK_LBUTTON    The left mouse button is down.
'              MK_MBUTTON    The middle mouse button is down.
'              MK_RBUTTON    The right mouse button is down.
'              MK_SHIFT      The SHIFT key is down.
'              MK_XBUTTON1  Windows 2000/XP: The first X button is down.
'              MK_XBUTTON2  Windows 2000/XP: The second X button is down.
' * x        = x-coordinate of the cursor
' * y        = y-coordinate of the cursor
' =======================================================================================
SUB COGL.ProcessMouse (BYVAL uMsg AS UINT, BYVAL wKeyState AS DWORD, BYVAL x AS LONG, BYVAL y AS LONG)

  SELECT CASE uMsg

      CASE WM_LBUTTONDOWN  ' // Left mouse button pressed
        ' // Put your code here

      CASE WM_LBUTTONUP  ' // Left mouse button releases
        ' // Put your code here

      CASE WM_MOUSEMOVE  ' // Mouse has been moved
        ' // Put your code here

      END SELECT

END SUB
' =======================================================================================

' =======================================================================================
' Cleanup
' =======================================================================================
SUB COGL.Cleanup

  ' ------------------------------------------------------------------------------------
  ' Insert your code here
  ' ------------------------------------------------------------------------------------

END SUB
' =======================================================================================

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WinMain (BYVAL hInstance AS HINSTANCE, _
                  BYVAL hPrevInstance AS HINSTANCE, _
                  BYVAL szCmdLine AS ZSTRING PTR, _
                  BYVAL nCmdShow AS LONG) AS LONG

  ' // Set process DPI aware
  ' // The recommended way is to use a manifest file
  AfxSetProcessDPIAware

  ' // Creates the main window
  DIM pWindow AS CWindow
  ' -or- DIM pWindow AS CWindow = "MyClassName" (use the name that you wish)
  ' // Create the window
  DIM hwndMain AS HWND = pWindow.Create(NULL, GL_WindowCaption, @WndProc)
  ' // Don't erase the background
  pWindow.ClassStyle = CS_DBLCLKS
  ' // Use a black brush
  pWindow.Brush = CreateSolidBrush(BGR(0, 0, 0))
  ' // Sizes the window by setting the wanted width and height of its client area
  pWindow.SetClientSize(GL_WINDOWWIDTH, GL_WINDOWHEIGHT)
  ' // Centers the window
  pWindow.Center

  ' // Show the window
  ShowWindow hwndMain, nCmdShow
  UpdateWindow hwndMain
 
  ' // Message loop
  DIM uMsg AS tagMsg
  WHILE GetMessageW(@uMsg, NULL, 0, 0)
      TranslateMessage @uMsg
      DispatchMessageW @uMsg
  WEND

  FUNCTION = uMsg.wParam

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hwnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

  STATIC pCOGL AS COGL PTR  ' // Pointer to the COGL class
  DIM wkeystate as integer, action as integer
 
  SELECT CASE uMsg

      CASE WM_SYSCOMMAND
        ' // Disable the Windows screensaver
        IF (wParam AND &hFFF0) = SC_SCREENSAVE THEN EXIT FUNCTION
        ' // Close the window
        IF (wParam AND &hFFF0) = SC_CLOSE THEN
            SendMessageW hwnd, WM_CLOSE, 0, 0
            EXIT FUNCTION
        END IF

      CASE WM_CREATE
        ' // Initialize the new OpenGL window
        pCOGL = NEW COGL(hwnd)
        ' // Retrieve the coordinates of the window's client area
        DIM rc AS RECT
        GetClientRect hwnd, @rc
        ' // Set up the scene
        pCOGL->SetupScene rc.Right - rc.Left, rc.Bottom - rc.Top
        ' // Set the timer (using a timer to trigger redrawing allows a smoother rendering)
        SetTimer(hwnd, 1, 0, NULL)
        EXIT FUNCTION

        CASE WM_DESTROY
        ' // Kill the timer
        KillTimer(hwnd, 1)
        ' // Clean resources
        pCOGL->Cleanup
        ' // Delete the COGL class
        Delete pCOGL
        ' // Ends the application by sending a WM_QUIT message
        PostQuitMessage(0)
        EXIT FUNCTION

      CASE WM_TIMER
        ' // Render the scene
        pCOGL->RenderScene
        EXIT FUNCTION

      CASE WM_SIZE
        pCOGL->ResizeScene LOWORD(lParam), HIWORD(lParam)
        EXIT FUNCTION

      CASE WM_KEYDOWN
        ' // Process keystrokes
          ' shows all keyboard codes :-)
            wkeystate = wParam AND &HFF ' Extract the key code
            PRINT "Last key pressed: 0x"; HEX(wkeystate)
           
        pCOGL->ProcessKeystrokes uMsg, wParam, lParam
        EXIT FUNCTION

      CASE WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE
        ' // Process mouse movements
        pCOGL->ProcessMouse uMsg, wParam, LOWORD(lParam), HIWORD(lParam)
        EXIT FUNCTION

  END SELECT

  ' // Default processing of Windows messages
  FUNCTION = DefWindowProcW(hwnd, uMsg, wParam, lParam)

END FUNCTION
' ========================================================================================

Frank Bruebach

#4
Here's one more with keycode to ascii Convert and to unicodechar
Same example AS above


CASE WM_KEYDOWN
        ' // Process keystrokes
          ' shows all keyboard codes :-)
            wkeystate = wParam AND &HFF ' Extract the key code
           
          print "1) Last key pressed: 0x"; HEX(wkeystate)

            'convert the keycode to ASCII
            dim keyAscii as integer = Asc(chr(wkeystate))
            'convert ascii to hex value
            dim keyhex as string = Hex$(keyAscii)
            'print hex value
           
            print "2) last character hex value: 0x";keyHex
     
    case WM_CHAR
        dim uniCodeChar as integer
        unicodechar = wParam
        dim keyhex as string = hex$(unicodechar)
       
          print "3) Unicode: Last character hex value: 0x";keyhex