Differenze tra le versioni di "Creare una finestra ed inserirvi del testo con le funzioni esterne di Libcaca"

Da Gambas-it.org - Wikipedia.
Riga 1: Riga 1:
 
La libreria libcaca è una libreria grafica, con la quale - fra l'altro - è possibile anche generare finestre testuali e intercettare eventi.
 
La libreria libcaca è una libreria grafica, con la quale - fra l'altro - è possibile anche generare finestre testuali e intercettare eventi.
 
  
 
Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "''libcaca.so.0.99.19''".
 
Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "''libcaca.so.0.99.19''".
 
  
 
Mostriamo di seguito un breve codice esemplificativo, con il quale in ambiente non-grafico viene creata una finestra, nella quale sarà possibile scrivere ed intercettare eventi provenienti dalla pressione dala tastiera.  
 
Mostriamo di seguito un breve codice esemplificativo, con il quale in ambiente non-grafico viene creata una finestra, nella quale sarà possibile scrivere ed intercettare eventi provenienti dalla pressione dala tastiera.  

Versione delle 16:44, 22 ott 2021

La libreria libcaca è una libreria grafica, con la quale - fra l'altro - è possibile anche generare finestre testuali e intercettare eventi.

Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa attualmente: "libcaca.so.0.99.19".

Mostriamo di seguito un breve codice esemplificativo, con il quale in ambiente non-grafico viene creata una finestra, nella quale sarà possibile scrivere ed intercettare eventi provenienti dalla pressione dala tastiera.

Public Struct textentry
  buffer[76] As Integer
  size As Integer
  cursor As Integer
  changed As Integer
End Struct

Private entries[5] As Struct Textentry

Private Const CACA_BLACK As Byte = 0
Private Const CACA_BLUE As Byte = 1
Private Const CACA_LIGHTGRAY As Byte = 7
Private Const CACA_WHITE As Byte = 15
Private Const BUFFER_SIZE As Integer = 75
Private Const TEXT_ENTRIES As Integer = 5
Private Const CACA_EVENT_KEY_PRESS As Integer = 1
Private Const CACA_KEY_BACKSPACE As Integer = 8
Private Const CACA_KEY_TAB As Integer = 9
Private Const CACA_KEY_RETURN As Integer = 13
Private Const CACA_KEY_ESCAPE As Integer = 27


Library "libcaca:0.99.19"

' caca_canvas_t * caca_create_canvas(int, int)
' Initialise a libcaca canvas.
Private Extern caca_create_canvas(ca As Integer, cb As Integer) As Pointer

' caca_display_t * caca_create_display (caca_canvas_t *)
' Attach a caca graphical context to a caca canvas.
Private Extern caca_create_display(caca_canvas_t As Pointer) As Pointer

' int caca_set_cursor (caca_display_t *, int)
' Show or hide the cursor.
Private Extern caca_set_cursor(displ As Pointer, cursI As Integer) As Integer

' int caca_set_color_ansi (caca_canvas_t *, uint8_t, uint8_t)
' Set the default colour pair for text (ANSI version).
Private Extern caca_set_color_ansi(caca_canvas_t As Pointer, col1 As Byte, col2 As Byte) As Integer

' int caca_put_str (caca_canvas_t *, int, int, char const *)
' Print a string.
Private Extern caca_put_str(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, testo As String) As Integer

' int caca_printf (caca_canvas_t *, int, int, char const *,...)
' Print a formated string.
Private Extern caca_printf(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, testo As String, i3 As Integer) As Integer

' int caca_fill_box (caca_canvas_t *, int, int, int, int, uint32_t)
' Fill a box on the canvas using the given character.
Private Extern caca_fill_box(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, i3 As Integer, i4 As Integer, i5 As Integer) As Integer

' int caca_put_char (caca_canvas_t *, int, int, uint32_t)
' Print an ASCII or Unicode character.
Private Extern caca_put_char(caca_canvas_t As Pointer, i1 As Integer, i2 As Integer, i3 As Integer) As Integer

' int caca_gotoxy (caca_canvas_t *, int, int)
' Set cursor position.
Private Extern caca_gotoxy(caca_canvas_t As Pointer, ix As Integer, iy As Integer) As Integer

' int caca_refresh_display (caca_display_t *)
' Flush pending changes and redraw the screen.
Private Extern caca_refresh_display(displ As Pointer) As Integer

' int caca_get_event (caca_display_t *, int, caca_event_t *, int)
' Get the next mouse or keyboard input event.
Private Extern caca_get_event(caca_canvas_t As Pointer, i1 As Integer, caca_event_t As Pointer, i2 As Integer) As Integer

' int caca_get_event_key_ch (caca_event_t const *)
' Return a key press or key release event's value.
Private Extern caca_get_event_key_ch(cev As Pointer) As Integer

' uint32_t caca_get_event_key_utf32 (caca_event_t const *)
' Return a key press or key release event's Unicode value.
Private Extern caca_get_event_key_utf32(cev As Pointer) As Integer

' int caca_free_canvas(caca_canvas_t *)
' Free a libcaca canvas.
Private Extern caca_free_canvas(caca_canvas_t As Pointer) As Integer


Public Sub Main()

 Dim cv, dp, ev As Pointer
 Dim i, e, running, j, start, size As Integer
 

  cv = caca_create_canvas(0, 0)
  If IsNull(cv) Then Error.Raise("Impossibile creare un supporto grafico 'caca' !")
  
  dp = caca_create_display(cv)
  If IsNull(dp) Then Error.Raise("Impossibile creare un display 'caca' !")

  caca_set_cursor(dp, 1)
 
  caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE)

  caca_put_str(cv, 1, 1, "Inserimento del texto - premere il tasto Tab per passare alla riga successiva")

  For i = 0 To TEXT_ENTRIES - 1
    entries[i].buffer[0] = 0
    entries[i].size = 0
    entries[i].cursor = 0
    entries[i].changed = 1
    caca_printf(cv, 3, 3 * i + 4, "[Inserimento ] " & i, i + 1)
  Next
 
  running = 1

  While running

    For i = 0 To TEXT_ENTRIES - 1
      If Not entries[i].changed Then Continue
      caca_set_color_ansi(cv, CACA_BLACK, CACA_LIGHTGRAY)
      caca_fill_box(cv, 2, 3 * i + 5, BUFFER_SIZE + 1, 1, 32)
      start = 0
      size = entries[i].size
      For j = 0 To size - 1
        caca_put_char(cv, 2 + j, 3 * i + 5, entries[i].buffer[start + j])
      Next
      entries[i].changed = 0
    Next

' Posiziona il cursore nella Struttura attiva:
    caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 5)
    caca_refresh_display(dp)
   
    If caca_get_event(dp, CACA_EVENT_KEY_PRESS, VarPtr(ev), -1) = 0 Then Continue

    Select Case caca_get_event_key_ch(VarPtr(ev))
      Case CACA_KEY_TAB
        e = (e + 1) Mod TEXT_ENTRIES
      Case CACA_KEY_RETURN
        e = (e + 1) Mod TEXT_ENTRIES
      Case CACA_KEY_BACKSPACE
        If entries[e].cursor Then
          Dec entries[e].size
          Dec entries[e].cursor
          entries[e].changed = 1
        Endif
      Case CACA_KEY_ESCAPE
        running = 0
      Case Else
        If entries[e].size < BUFFER_SIZE Then
          entries[e].buffer[entries[e].cursor] = caca_get_event_key_utf32(VarPtr(ev))
          Inc entries[e].size
          Inc entries[e].cursor
          entries[e].changed = 1
        Endif
    End Select
    
  Wend

 
' Va in chiusura:
   caca_free_canvas(dp)
   caca_free_canvas(cv)

End


Riferimenti