PDA

Visualizza versione completa : [C] Creare un'interfaccia dos


Alhazred
27-10-2007, 17.30.10
Al mio programma che sto scrivendo vorrei dare un aspetto un po' più piacevole creando un'interfaccia che ad esempio per scegliere delle opzioni permetta di selezionarle evidenziandole con le frecce della tastiera invece di dover scrivere il numero corrispondente all'opzione, in pratica alla fine vorrei fare una cosa che somigli a quella dell'immagine qui sotto:
http://screenshots.xnavigation.net/viewimg/161/active/ntfs/reader/for/dos.jpg

Dove posso documentarmi?

LoryOne
27-10-2007, 19.33.07
Che bello, un nostalgico come me.
Bene, come creare i riquadri è semplice.
Cercati una tabella di codici ASCII.
Per quanto riguarda la selezione, a te basta riscrivere l'intera stringa con colore di foreground e background differenti.
A tal proposito ti suggerisco di utilizzare degli array
Lo scrolling della finestra puoi effettuarlo a mano riscrivendo ogni array, oppure facendo ricorso alle funzioni del BIOS.
Non è detto che tu possa accedere a basso livello agli interrupt da richiamare per effettuare l'operazione, quindi ti consiglio di far ricorso alle API messe a disposizione da mamma M$ per quanto riguarda lo scrolling della console (Intera finestra o parte di essa).
C'è da lavorare ... (bei tempi)

Alhazred
27-10-2007, 20.12.28
La grafica so come farla, non è un problema, il mio pensiero è soprattutto rivolto al come far muovere la selezione con le frecce, ma vediamo se ho ben interpretato il tuo messaggio.

Posso fare in modo che appena mostrato il menu, una voce sia evidenziata e fin qui no problem, poi metto uno switch che mi discrimini la pressiione del tasto "freccia su" e del tasto "freccia giù", ignorando ogni altro tasto. Questo penso di saperlo fare, mi basta trovare il codice che invia la pressione di "freccia su" e quello "freccia giù", quindi attivare rispettivamente l'API SetConsoleCursorPosition decrementando di uno la riga nel primo caso e incrementandola di uno nel secondo e quindi cambiare i colori foreground e background per le due righe coinvolte nell'operazione.
Infine, alla pressione di "invio" deve esser presa la riga su cui si trova il cursore, e prevedere un altro switch che attiva la routine che si trova elencata su quella riga in quel momento.
Ci sono oppure ho detto un mare di stupidate? :)

LoryOne
27-10-2007, 20.18.42
Corretto mastro (Y) :)

LoryOne
27-10-2007, 20.30.08
Che ne dici di aggiungere la possibilità di effettuare la selezione attraverso il mouse ?
------------------------------------------------------------------------
API anche per questo, ma è meglio, visto che con il vecchio DOS era necessario un driver per abilitarlo ed ottenere l'interfaccia per definirne dimensione, identificazione del numero di tasti utilizzabili, pressione e rilascio.
Cos'è cambiato con Windows ? Mah.
------------------------------------------------------------------------
Andiamo con ordine e pazienza, intanto produci :D ;)

Alhazred
27-10-2007, 21.29.54
Domani mi metto all'opera.
Grazie :)

Alhazred
28-10-2007, 15.09.52
Non riesco a trovare una API che mi ritorni le coordinate del cursore all'interno della console, non c'è proprio o non la trovo io?

EDIT: ho trovato GetCursorPos, devo passargli un puntatore ad una struttura di tipo point, ma se lo faccio con:

typedef unsigned int UINT;

typedef struct _POINT {
UINT x;
UINT y;
}cursore, *LPPOINT;

mi dice
error C2371: 'LPPOINT' : redefinition; different basic types
:mm:

Alhazred
28-10-2007, 15.40.46
Ho risolto il problema sopra, ma ora mi dice che non ho inizializzato la variabile.
Mi sa che comunque si riferisce al mouse...

LoryOne
29-10-2007, 16.50.51
La struttura POINT è decisamente generica, ma non è da scartare.
(Dalla struttura POINT derivano le coordinate degli estremi dell' area di una qualsiasi finestra, nonchè le coordinate del puntatore del mouse)
Ascolta, cerca di intendere la shell del DOS come una finestra a se, in qualche modo scissa da Windows.
Esistono funzioni API specifiche per la shell del DOS, quinid mamma M$ ha lavorato per te (a dire il vero più per se, ma noi siamo programmatori, non ingegneri :D) .
Cerca documentazione su ReadConsoleInput e vedrai che sarai in grado di gestire li eventi della tastiera, così come quelli del mouse.
La shell del DOS è una finestra a se.

Alhazred
29-10-2007, 23.46.29
Ho trovato molto interessante questo codice (http://damb.dk/snip/menu.html), all'interno sono definiti i vari menu da mostrare secondo la struttura

typedef struct menu_item
{
const char *title;
struct menu_item const *submenu;
void(*function)(void);
}menu_item;

che permette di scrivere i menu in questo modo

menu_item const sub_menu_2[] =
{
{"New SMS", NULL, func_21},
{"List", NULL, func_22},
{"Back", NULL, NULL},
{NULL, NULL, NULL}
};

Mi è praticamente tutto chiaro nel codice, ma non riesco a capire come attivare nei menu le mie funzioni passando anche dei parametri, una cosa del tipo

menu_item const main_menu[] =
{
{"Scrivi nuova email", NULL, ScriviMail(hServer,hClient)},
{"Leggi email ricevute", NULL, LeggiMail(hServer,hClient,2)},
{"Leggi email inviate", NULL, LeggiMail(hServer,hClient,3)},
//ecc...
{NULL, NULL, NULL}
};

Cosa dovrei cambiare nel codice linkato affinché possa fare una cosa del genere?

LoryOne
30-10-2007, 08.05.41
Ma Alh...tu passi dei parametri alle funzioni

Alhazred
30-10-2007, 09.34.58
Si si, lo so che non è fattibile così come è scritto il codice che ho linkato, ma se ci fosse un modo per mettere delle chiamate a funzioni credo che avrei risolto tutti i miei problemi.

LoryOne
10-11-2007, 10.32.45
Allora Alh, prodotto qualcosa o siamo fermi ?
Lo vedo che il codice utilizza array sottoforma di struct e "mal si adatta" al tuo codice che utilizza funzioni parametriche, ma c'è più di un modo per procedere adattando il tuo codice a quello dell' esmpio.
Puoi pensare ad esempio di utilizzare variabili globali la dove utilizzi parametri.