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 | + | Per poter utilizzare le funzionalità di libcaca, è necessario richiamare la libreria condivisa: "''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. |
+ | Library "libcaca:0.99.19" | ||
+ | |||
Public Struct textentry | Public Struct textentry | ||
buffer[76] As Integer | buffer[76] As Integer | ||
Riga 10: | Riga 12: | ||
changed As Integer | changed As Integer | ||
End Struct | End Struct | ||
− | |||
Private entries[5] As Struct Textentry | Private entries[5] As Struct Textentry | ||
Riga 24: | Riga 25: | ||
Private Const CACA_KEY_RETURN As Integer = 13 | Private Const CACA_KEY_RETURN As Integer = 13 | ||
Private Const CACA_KEY_ESCAPE As Integer = 27 | Private Const CACA_KEY_ESCAPE As Integer = 27 | ||
− | |||
− | |||
− | |||
<FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)'' | <FONT color=gray>' ''caca_canvas_t * caca_create_canvas(int, int)'' | ||
Riga 90: | Riga 88: | ||
Dim i, e, running, j, start, size As Integer | Dim i, e, running, j, start, size As Integer | ||
− | + | cv = caca_create_canvas(0, 0) | |
− | + | If cv == 0 Then Error.Raise("Impossibile creare un supporto grafico 'caca' !") | |
− | |||
− | + | dp = caca_create_display(cv) | |
− | + | If dp == 0 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 | ||
<FONT color=gray>' ''Posiziona il cursore nella Struttura attiva:''</font> | <FONT color=gray>' ''Posiziona il cursore nella Struttura attiva:''</font> | ||
− | + | 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 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<FONT color=gray>' ''Va in chiusura:''</font> | <FONT color=gray>' ''Va in chiusura:''</font> | ||
− | + | caca_free_canvas(dp) | |
− | + | caca_free_canvas(cv) | |
'''End''' | '''End''' |
Versione delle 19:20, 1 dic 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: "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.
Library "libcaca:0.99.19" 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 ' 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 cv == 0 Then Error.Raise("Impossibile creare un supporto grafico 'caca' !") dp = caca_create_display(cv) If dp == 0 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