home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / PCWSAMPO.ZIP / PCWDEMO.C < prev    next >
C/C++ Source or Header  |  1989-04-07  |  52KB  |  1,902 lines

  1. /*
  2.  * pcwdemo.c:    Dimostrativo della libreria PcWindow
  3.  *
  4.  *        (c) 1989 - Pasquale Cantiello
  5.  *
  6.  *
  7.  *        Allegato alla versione 1.31 di PcWindow
  8.  *
  9.  *
  10.  *        Questo programma e' stato scritto con lo scopo di dimostrare
  11.  *        l'uso e le funzioni di PcWindow e pertanto si e' cercato
  12.  *        di adoperare uno stile di scrittura che fosse quanto di
  13.  *        piu' chiaro possibile, anche a discapito di qualche ottimiz-
  14.  *        zazione.
  15.  *
  16.  *        In alcuni casi sono stati usati dei cast e delle definizioni
  17.  *        che potrebbero sembrare superflue, ma si e' voluto fare in modo
  18.  *        che anche con il livello di warning al massimo il compilatore
  19.  *        non segnalasse alcun errore.
  20.  *
  21.  */
  22.  
  23.  
  24.  
  25. #include <pcw.h>
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <conio.h>
  29. #include <string.h>
  30.  
  31.  
  32.  
  33. /* Definizioni globali            */
  34.  
  35. #define MAX_WINDOWS        4
  36. #define MAX_OPEN_WINDOWS    3
  37. #define MAX_MENU        1
  38. #define MAX_BUF_SIZE        80*25
  39. #define STDATT            attrib(WHITE,NORMAL,BLACK,STEADY)
  40.  
  41.  
  42. #define DESC_25 "Premere ALT + la lettera maiuscola nel nome, oppure F1 per l'Help"
  43. #define ATTR_25 attrib(WHITE,NORMAL,BLUE,STEADY)
  44.  
  45.  
  46.  
  47. /* Definizioni per l'unico menu adottato            */
  48.  
  49. #define MENU_ID      0
  50. #define MENU_LEN     80
  51. #define MENU_SUBNUM     5
  52. #define MENU_ITNUM     7
  53. #define MENU_WSIZE     7
  54. #define MENU_ATT     attrib(BLACK,NORMAL,CYAN,STEADY)
  55. #define MENU_SELSUBATT     attrib(YELLOW,HILIGHT,MAGENTA,STEADY)
  56. #define MENU_SUBATT     attrib(BLACK,NORMAL,WHITE,STEADY)
  57. #define MENU_SELITATT     attrib(WHITE,HILIGHT,BLACK,STEADY)
  58. #define MENU_BORDATT     attrib(CYAN,NORMAL,BLUE,STEADY)
  59. #define MENU_BORDSUATT     attrib(CYAN,NORMAL,BLUE,STEADY)
  60. #define MENU_TYPE     ONELINE
  61. #define MENU_LINETYPE     LT_SINGLE
  62. #define MENU_SUBLINETYPE LT_DOUBLE
  63. #define MENU_EXTDATT     attrib(WHITE,NORMAL,BLUE,STEADY)
  64.  
  65. static char *menu_desc[] = {
  66.     "Generali",
  67.     "Help", "Informazioni", "Registrazione", "Uscita", "", "", "",
  68.     "Window",
  69.     "Note", "Apertura", "Chiusura", "Movimento", "Scrolling", "Viewing", "siZeing",
  70.     "Input",
  71.     "Note", "Tipi", "Select", "", "", "", "",
  72.     "Menu",
  73.     "Note", "Descrizioni", "Abilitazione", "Lunghezza", "", "", "",
  74.     "Varie",
  75.     "Note", "Interrogazioni", "Velocita'", "Suoni", "Cursore", "Opzioni", "Attributi"
  76. };
  77.  
  78. #define MENU_DESC menu_desc
  79.  
  80.  
  81.  
  82. /* Codifica dei valori di uscita del menu    */
  83.  
  84. #define MC_HELP     0x0100
  85. #define MC_INFO     0x0101
  86. #define MC_REG        0x0102
  87. #define MC_OUT        0x0103
  88.  
  89. #define MC_WIN_INFO    0x0200
  90. #define MC_WIN_OPEN    0x0201
  91. #define MC_WIN_CLOSE    0x0202
  92. #define MC_WIN_MOVE    0x0203
  93. #define MC_WIN_SCROLL    0x0204
  94. #define MC_WIN_VIEW    0x0205
  95. #define MC_WIN_SIZE    0x0206
  96.  
  97. #define MC_INP_INFO    0x0300
  98. #define MC_INP_TYPE    0x0301
  99. #define MC_INP_SELECT    0x0302
  100.  
  101. #define MC_MENU_INFO    0x0400
  102. #define MC_MENU_DESC    0x0401
  103. #define MC_MENU_ENABLE    0x0402
  104. #define MC_MENU_LEN    0x0403
  105.  
  106. #define MC_VAR_INFO    0x0500
  107. #define MC_VAR_QUERY    0x0501
  108. #define MC_VAR_SPEED    0x0502
  109. #define MC_VAR_SOUND    0x0503
  110. #define MC_VAR_CURSOR    0x0504
  111. #define MC_VAR_OPTION    0x0505
  112. #define MC_VAR_ATTR    0x0506
  113.  
  114.  
  115.  
  116.  
  117. /* Descrizioni aggiuntive che compaiono in 25esima riga         */
  118.  
  119.  
  120. static char *menu_extdesc[] = {
  121.     "Aiuto generale", "Informazioni su PcWindow", "Come registrarsi a PcWindow",
  122.     "Uscita dal demo e ritorno al Dos", "", "", "",
  123.     "Informazioni sulla gestione delle Window", "Modi possibili di apertura",
  124.     "Modi possibili di chiusura", "Tipi di movimento delle finestre",
  125.     "Scorrimento del testo all'interno delle finestre",
  126.     "Modifica del punto di vista", "Modifica delle dimensioni",
  127.     "Informazioni sull'input controllato", "Tipi di input possibili",
  128.     "Selezione di elementi da una lista", "", "", "", "",
  129.     "Informazioni sulla gestione dei menu pull-down", "Descrizioni aggiuntive",
  130.     "Abilitazione e disabilitzione di elementi", "Lunghezza sub-menu",
  131.     "", "", "",
  132.     "Informazioni sulle funzioni ausiliarie", "Funzioni di interrogazione",
  133.     "Tipi di velocita' possibili", "Gestione dei suoni",
  134.     "Gestione del cursore", "Opzioni modificabili", "Attributi Video"
  135. };
  136.  
  137. #define MENU_EXTDESC menu_extdesc
  138.  
  139.  
  140.  
  141. /*
  142.  * Definizioni dei parametri delle varie finestre adottate: prima le finestre
  143.  * temporanee che quindi non richiedono un identificatore in quanto viene
  144.  * ricavato di volta in volta.
  145.  *
  146.  * Per tutte le finestre che mostrano solo una pagina di informazioni, e'
  147.  * stata usata una definizione globale dei parametri, particolarizzando
  148.  * solo le dimensioni, il titolo e il testo.
  149.  *
  150.  */
  151.  
  152. /* Definizioni globali per tutte le finestre con una pagina di testo    */
  153.  
  154. #define W_GLOB_LINTYP    LT_DOUBLE
  155. #define W_GLOB_BORDATT    attrib(GREEN,NORMAL,BLUE,STEADY)
  156. #define W_GLOB_WNDATT    attrib(YELLOW,HILIGHT,BLUE,STEADY)
  157. #define W_GLOB_TTLATT    attrib(RED,HILIGHT,BLUE,STEADY)
  158. #define W_GLOB_BNATT    attrib(YELLOW,HILIGHT,BLUE,BLINK)
  159. #define W_GLOB_EVATT    attrib(CYAN,HILIGHT,BLUE,STEADY)
  160.  
  161.  
  162.  
  163.  
  164. /* Finestra per mostrare le informazioni generiche sul programma    */
  165. /* Non segue la regola generale     */
  166.  
  167.  
  168. #define W_INFO_XWID    48
  169. #define W_INFO_YWID    18
  170. #define W_INFO_TITLE    ""
  171.  
  172.  
  173.  
  174.  
  175. /* Finestra con note sulla registrazione  */
  176.  
  177. #define W_REG_XWID     70
  178. #define W_REG_YWID     20
  179. #define W_REG_TITLE    "Registrazione all'uso di PcWindow"
  180.  
  181. static char *reg_body_text[] = {
  182.     "Tutti coloro che hanno la libreria PcWindow e hanno intenzione di",
  183.     "usarla sono tenuti ad effettuare la registrazione.",
  184.     "Per le persone che hanno la versione commerciale della libreria, la",
  185.     "registrazione e' fondamentale perche' e' condizione indispensabile per",
  186.     "poter ricevere gli eventuali aggiornamenti alle condizioni previste",
  187.     "dal contratto di licenza.",
  188.     "Per coloro che invece hanno la versione di pubblico dominio, la regi-",
  189.     "strazione serve per un'indagine statistica e inoltre e' l'unico modo",
  190.     "per poter ricevere la comunicazione di eventuali modifiche o segnala-",
  191.     "zioni di errore.",
  192.     "Gli utenti registrati hanno inoltre diritto di accesso ad un'apposita",
  193.     "area file contenuta su S.Maria C.V. BBS contenente esempi e applica-",
  194.     "zioni per PcWindow.",
  195.     " ",
  196.     "La registrazione all'uso di PcWindow e' completamente gratuita e non",
  197.     "costituisce impegno alcuno per il mittente",
  198.     "Per registrarsi compilare il modulo CARD.PCW contenuto nel pacchetto",
  199.     "e seguire le istruzioni previste nel manuale.",
  200.     " ",
  201.     "Premere un tasto qualsiasi per continuare"
  202. };
  203.  
  204. #define W_REG_BODY reg_body_text
  205.  
  206.  
  207.  
  208. /* Finestra con note sulla gestione Window  */
  209.  
  210. #define W_WIN_INFO_XWID     70
  211. #define W_WIN_INFO_YWID     9
  212. #define W_WIN_INFO_TITLE    "Gestione Window"
  213.  
  214. static char *win_info_body_text[] = {
  215.     "La parte principale del programma PcWindow e' costituita dalla fun-",
  216.     "zioni che gestiscono una finestra.",
  217.     "Lasciando in ogni caso al manuale il compito di documentare tutte le",
  218.     "funzioni relative alle Window nelle scelte di questo stesso submenu",
  219.     "sono riportate le funzioni piu' significative.",
  220.     "",
  221.     "Viene usata la finestra dell'Help come esempio.",
  222.     " ",
  223.     "Premere un tasto qualsiasi per continuare"
  224. };
  225.  
  226. #define W_WIN_INFO_BODY    win_info_body_text
  227.  
  228.  
  229.  
  230. /* Finestra per l'esempio degli effetti di apertura  */
  231.  
  232. #define W_WIN_OPEN_XWID     67
  233. #define W_WIN_OPEN_YWID     6
  234. #define W_WIN_OPEN_TITLE    "Effetti di apertura"
  235.  
  236. static char *win_open_body_text[] = {
  237.     "Adesso potremo osservare tutti gli effetti con i quali e' possibile",
  238.     "aprire una Window.",
  239.     "Ci serviamo della finestra di Help come campione."
  240. };
  241.  
  242. #define W_WIN_OPEN_BODY    win_open_body_text
  243. #define W_WIN_OPEN_BODYLEN 3
  244.  
  245.  
  246.  
  247. /* Finestra per l'esempio degli effetti di chiusura  */
  248.  
  249. #define W_WIN_CLOSE_XWID     67
  250. #define W_WIN_CLOSE_YWID     6
  251. #define W_WIN_CLOSE_TITLE    "Effetti di chiusura"
  252.  
  253. static char *win_close_body_text[] = {
  254.     "Adesso potremo osservare tutti gli effetti con i quali e' possibile",
  255.     "chiudere una Window.",
  256.     "Ci serviamo della finestra di Help come campione."
  257. };
  258.  
  259. #define W_WIN_CLOSE_BODY    win_close_body_text
  260. #define W_WIN_CLOSE_BODYLEN 3
  261.  
  262.  
  263.  
  264. /* Finestra con note sulla gestione dell'input  */
  265.  
  266. #define W_INP_INFO_XWID     70
  267. #define W_INP_INFO_YWID     5
  268. #define W_INP_INFO_TITLE    "Input Controllato"
  269.  
  270. static char *inp_info_body_text[] = {
  271.     "Sotto la voce Input Controllato rientrano un insieme di funzioni che",
  272.     "consentono al programmatore di richiedere dei dati all'interno del",
  273.     "programma con la sicurezza che l'utente dia solo risposte sensate.",
  274.     " ",
  275.     "Premere un tasto qualsiasi per continuare"
  276. };
  277.  
  278. #define W_INP_INFO_BODY    inp_info_body_text
  279.  
  280.  
  281.  
  282.  
  283. /* Finestra per l'esempio dei tipi di input  */
  284.  
  285. #define W_INP_TYPE_XWID     70
  286. #define W_INP_TYPE_YWID     20
  287. #define W_INP_TYPE_TITLE    "Tipi di input possibili"
  288.  
  289. static char *inp_type_body_text[] = {
  290.     "Qui di seguito un esempio con i possibili tipi di input ammessi",
  291.     "da PcWindow. E' possibile passare da un campo all'altro con i",
  292.     "tasti cursore.",
  293.     "",
  294.     "--Nome--      --Descrizione input--                        --Input--"
  295. };
  296.  
  297. #define W_INP_TYPE_BODY    inp_type_body_text
  298. #define W_INP_TYPE_BODYLEN 5
  299.  
  300. #define MAXTYPE 14
  301.  
  302. static char input_data[MAXTYPE][11];    /* Dati in uscita da input  */
  303.  
  304. static char *input_type_desc[] = {    /* Descrizione dei vari tipi */
  305.     "IT_ALFANUM    Tutti i caratteri Ascii .................. :",
  306.     "IT_ALFANUPP   Come ALFANUM, ma con conversione maiuscole :",
  307.     "IT_ALFAB      Solo i caratteri alfabetici .............. :",
  308.     "IT_ALFABUPP   Come ALFAB, ma con conversione maiuscole.. :",
  309.     "IT_INTEGER    Solo numeri interi ....................... :",
  310.     "IT_CODE       Come INTEGER ma con fill di 0 ............ :",
  311.     "IT_FIXED1     Virgola fissa 1 decimale ................. :",
  312.     "IT_FIXED2     Virgola fissa 2 decimali ................. :",
  313.     "IT_FIXED3     Virgola fissa 3 decimali ................. :",
  314.     "IT_REAL       Virgola mobile ........................... :",
  315.     "IT_DATE       Giorno/Mese/Anno ......................... :",
  316.     "IT_HOUR       Ore:Minuti ............................... :",
  317.     "IT_HEX        Numero esadecimale ....................... :",
  318.     "IT_LOGICAL    S oppure N ............................... :"
  319. };
  320.  
  321. static unsigned int input_type[] = {    /* Tipi di input    */
  322.     IT_ALFANUM, IT_ALFANUPP, IT_ALFAB, IT_ALFABUPP, IT_INTEGER, IT_CODE,
  323.     IT_FIXED1, IT_FIXED2, IT_FIXED3, IT_REAL, IT_DATE, IT_HOUR, IT_HEX,
  324.     IT_LOGICAL
  325. };
  326.  
  327. static unsigned int input_len[] = {    /* Lunghezze dei campi    */
  328.     10, 10, 10, 10, 6, 6, 8, 8, 8, 9, 8, 5, 4, 1
  329. };
  330.  
  331.  
  332.  
  333.  
  334. /* Finestra per l'esempio della funzione select  */
  335.  
  336. #define W_INP_SELECT_XWID     66
  337. #define W_INP_SELECT_YWID     10
  338. #define W_INP_SELECT_LINTYP   LT_DOUBLE
  339. #define W_INP_SELECT_BORDATT  attrib(BLUE,NORMAL,RED,STEADY)
  340. #define W_INP_SELECT_WNDATT   attrib(YELLOW,HILIGHT,MAGENTA,STEADY)
  341. #define W_INP_SELECT_TTLATT   attrib(RED,HILIGHT,BLUE,STEADY)
  342. #define W_INP_SELECT_XLIM     W_INP_SELECT_XWID
  343. #define W_INP_SELECT_YLIM     W_INP_SELECT_YWID
  344. #define W_INP_SELECT_TITLE    "Funzione select"
  345. #define W_INP_SELECT_BNATT    attrib(YELLOW,HILIGHT,MAGENTA,BLINK)
  346. #define W_INP_SELECT_EVATT    attrib(CYAN,HILIGHT,MAGENTA,STEADY)
  347.  
  348. static char *inp_select_body_text[] = {
  349.     "Un esempio della funzione Pcw_select che consente di selezionare",
  350.     "un elemento da un insieme di lunghezza finita.",
  351.     "L'insieme puo' essere piu' lungo della finestra visualizzata.",
  352.     "Esiste una variante di Pcw_select chiamata Pcw_ext_sel che puo'",
  353.     "essere usata quando non e' noto a run-time il numero di elementi",
  354.     "nella lista (esempio: ricerca di un nome in un archivio)."
  355. };
  356.  
  357. #define W_INP_SELECT_BODY    inp_select_body_text
  358. #define W_INP_SELECT_BODYLEN 6
  359.  
  360. /* Valori su cui e' possibile effettuare la scelta  */
  361.  
  362. static char *scelte[] = {
  363.     "la Stampatrice", "il Monitore", "il Modulo", "le Diskette",
  364.     "il Minidisco", "l'Adattatore telematico", "il tasto Immis",
  365.     "l'Unita' di puntamento", "Che belle traduzioni!",
  366.     "Fine delle risate"
  367. };
  368.  
  369. #define MAX_SCELTE 10
  370.  
  371. #define W_SELECT_YWID      5
  372. #define W_SELECT_COUNT      MAX_SCELTE
  373. #define W_SELECT_LINTYP   LT_SINGLE
  374. #define W_SELECT_WNDATT   attrib(WHITE,HILIGHT,BLUE,STEADY)
  375. #define W_SELECT_BORDATT  attrib(RED,NORMAL,BLUE,STEADY)
  376. #define W_SELECT_EVATT      reverse(W_SELECT_WNDATT)
  377.  
  378.  
  379.  
  380. /* Finestra per l'esempio delle possibilita' di movimento  */
  381.  
  382. #define W_WIN_MOVE_XWID     66
  383. #define W_WIN_MOVE_YWID     8
  384. #define W_WIN_MOVE_TITLE    "Movimento finestre"
  385.  
  386. static char *win_move_body_text[] = {
  387.     "PcWindow consente di muovere una finestra lungo lo schermo.",
  388.     "Esistono due funzioni di spostamento: una in coordinate assolute",
  389.     "e un'altra in coordinate relative. Per entrambe lo spostamento",
  390.     "puo' essere istantaneo o graduale ed e' possibile specificare il",
  391.     "verso principale di movimento."
  392. };
  393.  
  394. #define W_WIN_MOVE_BODY    win_move_body_text
  395. #define W_WIN_MOVE_BODYLEN 5
  396.  
  397.  
  398.  
  399. /* Finestra per l'esempio delle possibilita' di scrolling  */
  400.  
  401. #define W_WIN_SCROLL_XWID     68
  402. #define W_WIN_SCROLL_YWID     6
  403. #define W_WIN_SCROLL_TITLE    "Scrolling del testo finestre"
  404.  
  405. static char *win_scroll_body_text[] = {
  406.     "PcWindow consente lo scrolling del testo all'interno delle finestre.",
  407.     "Lo scrolling puo' essere istantaneo o graduale in tutte e quattro le",
  408.     "direzioni."
  409. };
  410.  
  411. #define W_WIN_SCROLL_BODY    win_scroll_body_text
  412. #define W_WIN_SCROLL_BODYLEN 3
  413.  
  414.  
  415.  
  416.  
  417. /* Finestra per l'esempio delle possibilita' di Viewing  */
  418.  
  419. #define W_WIN_VIEW_XWID     68
  420. #define W_WIN_VIEW_YWID     6
  421. #define W_WIN_VIEW_TITLE    "Modifica del punto di vista"
  422.  
  423. static char *win_view_body_text[] = {
  424.     "E' possibile cambiare la regione di testo visibile quando la fine-",
  425.     "stra e' piu' grande delle dimensioni dell'area visualizzata.",
  426.     " "
  427. };
  428.  
  429. #define W_WIN_VIEW_BODY    win_view_body_text
  430. #define W_WIN_VIEW_BODYLEN 3
  431.  
  432.  
  433.  
  434.  
  435.  
  436. /* Finestra per l'esempio delle possibilita' di sizeing  */
  437.  
  438. #define W_WIN_SIZE_XWID     68
  439. #define W_WIN_SIZE_YWID     6
  440. #define W_WIN_SIZE_TITLE    "Modifica delle dimensioni della finestra"
  441.  
  442. static char *win_size_body_text[] = {
  443.     "E' possibile modificare dinamicamente le dimensioni di una window.",
  444.     "La modifica puo' essere istantanea o graduale in tutte e quattro",
  445.     "le direzioni."
  446. };
  447.  
  448. #define W_WIN_SIZE_BODY    win_size_body_text
  449. #define W_WIN_SIZE_BODYLEN 3
  450.  
  451.  
  452.  
  453.  
  454. /* Finestra con note sui menu pull-down  */
  455.  
  456. #define W_MENU_INFO_XWID     70
  457. #define W_MENU_INFO_YWID     8
  458. #define W_MENU_INFO_TITLE    "Menu pull-down"
  459.  
  460. static char *menu_info_body_text[] = {
  461.     "Un gruppo di funzioni all'interno di PcWindow riguarda la gestione",
  462.     "dei menu pull-down.",
  463.     "I menu, come e' possibile osservare, sono a due livelli:",
  464.     "uno orizzontale sempre visibile e l'altro verticale con finestre",
  465.     "che si aprono in corrispondenza delle scelte effettuate sul primo",
  466.     "livello.",
  467.     "",
  468.     "Premere un tasto qualsiasi per continuare"
  469. };
  470.  
  471. #define W_MENU_INFO_BODY    menu_info_body_text
  472.  
  473.  
  474.  
  475.  
  476. /* Finestra con note sulle descrizioni aggiuntive */
  477.  
  478. #define W_MENU_DESC_XWID     70
  479. #define W_MENU_DESC_YWID     8
  480. #define W_MENU_DESC_TITLE    "Descrizioni aggiuntive"
  481.  
  482. static char *menu_desc_body_text[] = {
  483.     "E' possibile agganciare un'insieme di descrizioni aggiuntive al menu",
  484.     "pull down da far comparire in 25esima riga durante la selezione.",
  485.     "Questa caratteristica e' utile per evitare di avere menu troppo",
  486.     "larghi e per poter fornire all'utente una descrizione piu' detta-",
  487.     "gliata di quello che sta per scegliere.",
  488.     "Questa funzione e' utilizzata anche in questo esempio.",
  489.     "",
  490.     "Premere un tasto qualsiasi per continuare"
  491. };
  492.  
  493. #define W_MENU_DESC_BODY    menu_desc_body_text
  494.  
  495.  
  496.  
  497.  
  498. /* Finestra con note sulle funzioni di abilitrazione */
  499.  
  500. #define W_MENU_ENABLE_XWID     70
  501. #define W_MENU_ENABLE_YWID     11
  502. #define W_MENU_ENABLE_TITLE    "Abilitazione e disabilitazione"
  503.  
  504. static char *menu_enable_body_text[] = {
  505.     "E' possibile, durante il funzionamento del programma, abilitare e",
  506.     "disabilitare qualche scelta all'interno dei vari sub-menu in modo",
  507.     "evitare all'utente scelte che sono prive di significato in un",
  508.     "determinato istante.",
  509.     "Come e' possibile osservare, al fianco di ognuna delle scelte e'",
  510.     "presente un simbolo che indica che la scelta e' possibile.",
  511.     "L'assenza di questo simbolo non consente all'utente di effettuare",
  512.     "la selezione. E' possibile inoltre cambiare questo simbolo con uno",
  513.     "qualunque dei caratteri del set IBM",
  514.     "",
  515.     "Premere un tasto qualsiasi per continuare"
  516. };
  517.  
  518. #define W_MENU_ENABLE_BODY    menu_enable_body_text
  519.  
  520.  
  521.  
  522.  
  523. /* Finestra con note sulla lunghezza dei menu */
  524.  
  525. #define W_MENU_LEN_XWID     70
  526. #define W_MENU_LEN_YWID     11
  527. #define W_MENU_LEN_TITLE    "Lunghezza dei sub-menu"
  528.  
  529. static char *menu_len_body_text[] = {
  530.     "Come si puo' osservare dal menu di questo esempio, non tutti i",
  531.     "sub-menu hanno la stessa lunghezza e questo e' abbastanza ovvio.",
  532.     "Un'altra cosa che invece e' possibile fare durante la definizione",
  533.     "di un menu e' quella di avere un sub-menu con un numero di ele-",
  534.     "menti maggiore dell'ampiezza della finestra relativa.",
  535.     "In tal caso, nella finestra saranno visualizzati solo nel numero",
  536.     "quelli che vi entrano. Gli altri saranno accessibili mediante",
  537.     "pressione dei tasti cursore in basso e in alto con conseguente",
  538.     "scrolling all'interno della finestra.",
  539.     "",
  540.     "Premere un tasto qualsiasi per continuare"
  541. };
  542.  
  543. #define W_MENU_LEN_BODY    menu_len_body_text
  544.  
  545.  
  546.  
  547. /* Finestra con informazioni sulle funzioni varie */
  548.  
  549. #define W_VAR_INFO_XWID     60
  550. #define W_VAR_INFO_YWID     7
  551. #define W_VAR_INFO_TITLE    "Funzioni varie"
  552.  
  553. static char *var_info_body_text[] = {
  554.     "Esistono un insieme di funzioni di supporto in PcWindow che",
  555.     "consentono di modificare parametri globali, leggere stati e",
  556.     "parametri del sistema, agire sul cursore, sul suono e tante",
  557.     "altre cose, come mostrato dalle prossime voci di questo",
  558.     "sub-menu.",
  559.     "",
  560.     "Premere un tasto qualsiasi per continuare"
  561. };
  562.  
  563. #define W_VAR_INFO_BODY    var_info_body_text
  564.  
  565.  
  566.  
  567. /* Finestra per le funzioni di interrogazione */
  568.  
  569. #define W_VAR_QUERY_XWID     65
  570. #define W_VAR_QUERY_YWID     14
  571. #define W_VAR_QUERY_TITLE    "Funzioni di interrogazione"
  572.  
  573. static char *var_query_body_text[] = {
  574.     "Con queste funzioni e' possibile avere a run-time le seguenti",
  575.     "informazioni:",
  576.     "",
  577.     "- Data e ora correnti",
  578.     "- CPU presente nel sistema",
  579.     "- Scheda video presente nel sistema",
  580.     "- Numero di finestre attive",
  581.     "- Numero della finestra corrente",
  582.     "- Dimensioni attuali di una finestra",
  583.     "- Stato corrente di una finestra",
  584.     "- Versione di PcWindow in uso",
  585.     "- Posizione attuale di una finestra",
  586.     "",
  587.     "Premere un tasto qualsiasi per continuare"
  588. };
  589.  
  590. #define W_VAR_QUERY_BODY    var_query_body_text
  591.  
  592.  
  593.  
  594. /* Finestra per le velocita'  */
  595.  
  596. #define W_VAR_SPEED_XWID     65
  597. #define W_VAR_SPEED_YWID     13
  598. #define W_VAR_SPEED_TITLE    "Velocita' degli effetti"
  599.  
  600. static char *var_speed_body_text[] = {
  601.     "Tutte le funzioni che comportano movimento (open, move, size,",
  602.     "scroll, close, etc.. consentono la scelta fra vari effetti di",
  603.     "dissolvenza. E' possibile, tramite una funzione di PcWindow,",
  604.     "scegliere la velocita' con cui avvengono queste operazioni tra",
  605.     "quattro possibili velocita':",
  606.     "SLOW, FAST, VERYFAST, NOSYNC",
  607.     "",
  608.     "La cosa importante e' che la velocita' scelta e' indipendente",
  609.     "dal calcolatore utilizzato per cui il programma si comportera'",
  610.     "allo stesso modo sia un PC a 4.77 MHz che su un 386 a 25 Mhz,",
  611.     "tranne che per la modalita' NOSYNC.",
  612.     "",
  613.     "Premere un tasto qualsiasi per continuare"
  614. };
  615.  
  616. #define W_VAR_SPEED_BODY    var_speed_body_text
  617.  
  618.  
  619.  
  620.  
  621. /* Finestra per il suono */
  622.  
  623. #define W_VAR_SOUND_XWID     65
  624. #define W_VAR_SOUND_YWID     11
  625. #define W_VAR_SOUND_TITLE    "Gestione del suono"
  626.  
  627. static char *var_sound_body_text[] = {
  628.     "Esistono due funzioni in PcWindow che consentono la generazione",
  629.     "di suoni.",
  630.     "La prima e' la funzione Pcw_beep() che come dice il nome genera",
  631.     "un beep diverso da quello che si potrebbe ottenere normalmente",
  632.     "in quanto e' piu' corto di durata e piu' acuto di tonalita'.",
  633.     "",
  634.     "La seconda funzione e' Pcw_tone(freq, dur) che consente di gene-",
  635.     "rare un suono di frequenza e durata scelte a piacere. In tal",
  636.     "modo si possono anche generare delle semplici musichette.",
  637.     "",
  638.     "Premere un tasto qualsiasi per continuare"
  639. };
  640.  
  641. #define W_VAR_SOUND_BODY    var_sound_body_text
  642.  
  643.  
  644.  
  645.  
  646. /* Finestra per il cursore */
  647.  
  648. #define W_VAR_CURSOR_XWID     60
  649. #define W_VAR_CURSOR_YWID     8
  650. #define W_VAR_CURSOR_TITLE    "Gestione del cursore"
  651.  
  652. static char *var_cursor_body_text[] = {
  653.     "Per quanto riguarda la manipolazione del cursore nell'ambito",
  654.     "di PcWindow e' possibile fare le seguenti cose:",
  655.     "",
  656.     "- Disabilitarne la visualizzazione",
  657.     "- Abilitarne la visualizzazione",
  658.     "- Scegliere tra cursore sottolineato o cursore pieno",
  659.     "",
  660.     "Premere un tasto qualsiasi per continuare"
  661. };
  662.  
  663. #define W_VAR_CURSOR_BODY    var_cursor_body_text
  664.  
  665.  
  666.  
  667. /* Finestra per la funzione option */
  668.  
  669. #define W_VAR_OPTION_XWID     60
  670. #define W_VAR_OPTION_YWID     11
  671. #define W_VAR_OPTION_TITLE    "Gestione delle opzioni"
  672.  
  673. static char *var_option_body_text[] = {
  674.     "Una funzione in PcWindow consente la modifica di una serie",
  675.     "di paramtri e di opzioni e precisamente:",
  676.     "",
  677.     "- Se il sistema deve eseguire un beep in caso di errore",
  678.     "- Se i valori in uscita dall'input devono essere riempiti",
  679.     "  di blank quando la loro lunghezza e' minore del massimo",
  680.     "- Caratteri da usare come delimitatori del titolo",
  681.     "- Carattere da usare come separatore per i decimali",
  682.     "- Carattere da usare come indicatore di enable per i menu",
  683.     "",
  684.     "Premere un tasto qualsiasi per continuare"
  685. };
  686.  
  687. #define W_VAR_OPTION_BODY    var_option_body_text
  688.  
  689.  
  690.  
  691. /* Finestra per gli attributi */
  692.  
  693. #define W_VAR_ATTR_XWID     60
  694. #define W_VAR_ATTR_YWID     13
  695. #define W_VAR_ATTR_TITLE    "Attributi video"
  696.  
  697. static char *var_attr_body_text[] = {
  698.     "E' possibile una gestione completa degli attributi video e",
  699.     "a tal proposito esiste la macro attrib(FORE,HIL,BACK,BLI)",
  700.     "che consente di ottenere il codice di attributo a partire",
  701.     "da:",
  702.     "- Colore di FOREGROUND",
  703.     "- Eventuale DOPPIA INTENSITA'",
  704.     "- Colore di BACKGROUND",
  705.     "- Eventuale LAMPEGGIO",
  706.     "",
  707.     "Esiste inoltre la macro reverse(ATTR) che a partire da un",
  708.     "codice di attributo genera il relativo REVERSE",
  709.     "",
  710.     "Premere un tasto qualsiasi per continuare"
  711. };
  712.  
  713. #define W_VAR_ATTR_BODY    var_attr_body_text
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721. /* Finestra di aiuto al programma  [ID = 0]    */
  722.  
  723. #define W_HELP_ID    0
  724. #define W_HELP_XWID    68
  725. #define W_HELP_YWID    14
  726. #define W_HELP_LINTYP    LT_SINGLE
  727. #define W_HELP_BORDATT    attrib(BLUE,NORMAL,RED,STEADY)
  728. #define W_HELP_WNDATT    attrib(YELLOW,HILIGHT,MAGENTA,STEADY)
  729. #define W_HELP_TTLATT    attrib(RED,HILIGHT,BLUE,STEADY)
  730. #define W_HELP_XLIM    W_HELP_XWID
  731. #define W_HELP_YLIM    W_HELP_YWID
  732. #define W_HELP_TITLE    "Spiegazioni per l'uso"
  733. #define W_HELP_BNATT    attrib(YELLOW,HILIGHT,MAGENTA,BLINK)
  734. #define W_HELP_EVATT    attrib(CYAN,HILIGHT,MAGENTA,STEADY)
  735.  
  736. static char *help_body_text[] = {
  737.     "Questo dimostrativo consente di valutare e verificare le prestazioni",
  738.     "della libreria PcWindow. E' fondamentale pero' analizzare anche il",
  739.     "listato per poter capire come sono state realizzate le cose che qui",
  740.     "si vedono.",
  741.     "All'interno del menu' e' possibile effettuare le proprie scelte ser-",
  742.     "vendosi dei quattro tasti cursore, oppure mediante pressione della",
  743.     "lettera maiuscola presente nel nome. Dopo aver evidenziato la fun-",
  744.     "zione desiderata, basta premere RETURN per selezionarla, oppure ESC",
  745.     "per annullare la selezione.",
  746.     "Questo demo e' organizzato in modo da presentare la maggior parte",
  747.     "delle funzioni disponibili in PcWindow raggruppate opportunamente.",
  748.     "In ogni caso conviene consultare sempre il manuale.",
  749.     " ",
  750.     "Premere un tasto qualsiasi per continuare"
  751. };
  752.  
  753. #define W_HELP_BODY help_body_text
  754. #define W_HELP_BODYLEN 14
  755.  
  756.  
  757.  
  758.  
  759.  
  760. /* Effetti possibili: nomi e simboli    */
  761.  
  762. static char *effect_name[] = {
  763.     "ISTANT", "FADEUP", "FADEDOWN", "FADELEFT", "FADERIGHT", "FADEHORIZ",
  764.     "FADEVERT" };
  765.  
  766. static unsigned int effect[] = {
  767.     ISTANT, FADEUP, FADEDOWN, FADELEFT, FADERIGHT, FADEHORIZ, FADEVERT };
  768.  
  769. #define MAX_EFFECT 7
  770.  
  771.  
  772. /* Macro di uso generale        */
  773.  
  774.  
  775. #define WAIT_FOR_A_KEY while(kbhit())getch();getch();while(kbhit())getch();
  776.  
  777. /* Prototipi delle funzioni chiamate dal main    */
  778.  
  779. void define_all(void);
  780. void set_default(void);
  781. void display_info(void);
  782. void display_help(void);
  783. void demo_open(void);
  784. void demo_close(void);
  785. void demo_inp_type(void);
  786. void demo_select(void);
  787. void demo_move(void);
  788. void demo_scroll(void);
  789. void demo_view(void);
  790. void demo_size(void);
  791.  
  792. void show_info(unsigned int, unsigned int, char *, char **);
  793.  
  794.  
  795.  
  796. /*
  797.  *  Qui inizia il main program del dimostrativo.
  798.  *
  799.  */
  800.  
  801.  
  802. void main(void)
  803. {
  804.  
  805.     BOOLEAN fine;
  806.     int     scelta;
  807.  
  808.  
  809.  
  810.     /* Inizializzazione del toolkit */
  811.  
  812.     if (Pcw_init(MAX_WINDOWS, MAX_OPEN_WINDOWS, MAX_BUF_SIZE) != OK) {
  813.     printf("\n\n\nErrore nell'inizializzazione toolkit !!\n\n");
  814.     exit (1);
  815.     }
  816.  
  817.  
  818.     /* Controllo versione PcWindow: da eseguire sempre! */
  819.  
  820.     if (Pcw_version() < __PCW__) {
  821.     printf("\n\n\nErrore:  E' richiesta almeno la versione %d.%02d !!\n\n",
  822.         __PCW__/100,__PCW__%100);
  823.     exit (1);
  824.     }
  825.  
  826.  
  827.     /* Inizializzazione gestore menu */
  828.  
  829.     if (Pcm_init(MAX_MENU) != OK) {
  830.     printf("\n\n\nErrore inizializzazione menu !!\n\n");
  831.     exit (1);
  832.     }
  833.  
  834.  
  835.     /* Tutte le chiamate alle funzioni in questo demo sono effettuate senza
  836.      * controllare i valori di ritorno. E' opportuno controllarli in fase di
  837.      * debugging dei propri programmi.
  838.      */
  839.  
  840.     Pcw_clear_screen(STDATT);    /* Cancella schermo        */
  841.  
  842.     define_all();        /* Definisce menu e Windows    */
  843.  
  844.     set_default();        /* Stabilisce valori di default */
  845.  
  846.  
  847.     Pcm_open(MENU_ID);        /* Visualizza menu        */
  848.  
  849.  
  850.  
  851.  
  852.     /* Di seguito il ciclo principale: Si entra nel menu e si effettua una
  853.      * scelta. In conseguenza della scelta si attiva la funzione apposita.
  854.      */
  855.  
  856.     fine = FALSE;
  857.  
  858.     while (! fine) {
  859.  
  860.     Pcw_write_25(DESC_25, ATTR_25);     /* Aiuto in 25esima linea    */
  861.  
  862.     scelta = Pcm_enter_menu(NOCHAR, FKEYS);
  863.  
  864.     Pcw_clear_25();
  865.  
  866.     switch (scelta) {
  867.  
  868.     case 0 :        /* Tasto ESC        */
  869.         break;
  870.  
  871.     case -(IN_FKEY + 1) :    /* Tasto F1        */
  872.     case MC_HELP :        /* Finestra di aiuto    */
  873.         display_help();
  874.         break;
  875.  
  876.     case MC_OUT :        /* Fine dimostrativo */
  877.         fine = TRUE;
  878.         break;
  879.  
  880.     case MC_INFO :        /* Informazioni su PcWindow */
  881.         display_info();
  882.         break;
  883.  
  884.     case MC_REG :        /* Registrazione a PcWindow */
  885.         show_info(W_REG_XWID, W_REG_YWID, W_REG_TITLE, W_REG_BODY);
  886.         break;
  887.  
  888.     case MC_WIN_INFO :    /* Informazioni sulla gestione delle Window */
  889.         show_info(W_WIN_INFO_XWID, W_WIN_INFO_YWID, W_WIN_INFO_TITLE,
  890.         W_WIN_INFO_BODY);
  891.         break;
  892.  
  893.     case MC_WIN_OPEN :    /* Effetti di apertura        */
  894.         demo_open();
  895.         break;
  896.  
  897.     case MC_WIN_CLOSE :    /* Effetti di chiusura       */
  898.         demo_close();
  899.         break;
  900.  
  901.     case MC_WIN_MOVE :    /* Effetti di movimento     */
  902.         demo_move();
  903.         break;
  904.  
  905.     case MC_WIN_SCROLL :
  906.         demo_scroll();    /* Effetti di scrolling     */
  907.         break;
  908.  
  909.     case MC_WIN_VIEW :    /* Effetti di Viewing        */
  910.         demo_view();
  911.         break;
  912.  
  913.     case MC_WIN_SIZE :    /* Effetti di Sizeing        */
  914.         demo_size();
  915.         break;
  916.  
  917.     case MC_INP_INFO :    /* Informazioni sull'input controllato  */
  918.         show_info(W_INP_INFO_XWID, W_INP_INFO_YWID, W_INP_INFO_TITLE,
  919.         W_INP_INFO_BODY);
  920.         break;
  921.  
  922.     case MC_INP_TYPE :    /* Dimostrativo tipi di input        */
  923.         demo_inp_type();
  924.         break;
  925.  
  926.     case MC_INP_SELECT :
  927.         demo_select();    /* Dimostrativo funzione select     */
  928.         break;
  929.  
  930.     case MC_MENU_INFO :    /* Informazioni sui menu pull down    */
  931.         show_info(W_MENU_INFO_XWID, W_MENU_INFO_YWID, W_MENU_INFO_TITLE,
  932.         W_MENU_INFO_BODY);
  933.         break;
  934.  
  935.     case MC_MENU_DESC :    /* Informazioni sulle descrizioni aggiuntive */
  936.         show_info(W_MENU_DESC_XWID, W_MENU_DESC_YWID, W_MENU_DESC_TITLE,
  937.         W_MENU_DESC_BODY);
  938.         break;
  939.  
  940.     case MC_MENU_ENABLE :    /* Informazioni sulle funzioni di abilitazione*/
  941.         show_info(W_MENU_ENABLE_XWID, W_MENU_ENABLE_YWID, W_MENU_ENABLE_TITLE,
  942.         W_MENU_ENABLE_BODY);
  943.         break;
  944.  
  945.     case MC_MENU_LEN :    /* Informazioni sulla lunghezza dei menu    */
  946.         show_info(W_MENU_LEN_XWID, W_MENU_LEN_YWID, W_MENU_LEN_TITLE,
  947.         W_MENU_LEN_BODY);
  948.         break;
  949.  
  950.     case MC_VAR_INFO :    /* Informazioni sulle funzioni varie        */
  951.         show_info(W_VAR_INFO_XWID, W_VAR_INFO_YWID, W_VAR_INFO_TITLE,
  952.         W_VAR_INFO_BODY);
  953.         break;
  954.  
  955.     case MC_VAR_QUERY :    /* Funzioni di interrogazione    */
  956.         show_info(W_VAR_QUERY_XWID, W_VAR_QUERY_YWID, W_VAR_QUERY_TITLE,
  957.         W_VAR_QUERY_BODY);
  958.         break;
  959.  
  960.     case MC_VAR_SPEED :    /* Velocita' degli effetti  */
  961.         show_info(W_VAR_SPEED_XWID, W_VAR_SPEED_YWID, W_VAR_SPEED_TITLE,
  962.         W_VAR_SPEED_BODY);
  963.         break;
  964.  
  965.     case MC_VAR_SOUND :    /* Funzioni per la gestione del suono */
  966.         show_info(W_VAR_SOUND_XWID, W_VAR_SOUND_YWID, W_VAR_SOUND_TITLE,
  967.         W_VAR_SOUND_BODY);
  968.         break;
  969.  
  970.     case MC_VAR_CURSOR :    /* Funzioni per la gestione del cursore */
  971.         show_info(W_VAR_CURSOR_XWID, W_VAR_CURSOR_YWID, W_VAR_CURSOR_TITLE,
  972.         W_VAR_CURSOR_BODY);
  973.         break;
  974.  
  975.     case MC_VAR_OPTION :    /* Funzioni per la funzione option    */
  976.         show_info(W_VAR_OPTION_XWID, W_VAR_OPTION_YWID, W_VAR_OPTION_TITLE,
  977.         W_VAR_OPTION_BODY);
  978.         break;
  979.  
  980.     case MC_VAR_ATTR :    /* Gestione degli attributi        */
  981.         show_info(W_VAR_ATTR_XWID, W_VAR_ATTR_YWID, W_VAR_ATTR_TITLE,
  982.         W_VAR_ATTR_BODY);
  983.         break;
  984.  
  985.     }
  986.  
  987.     }
  988.  
  989.  
  990.  
  991.     Pcm_close();        /* Chiude il menu        */
  992.  
  993.     exit (0);            /* Terminare sempre con exit !! */
  994. }
  995.  
  996.  
  997.  
  998.  
  999.  
  1000. /*
  1001.  *  Funzione define_all:    Definisce il menu e le finestre statiche usate nel
  1002.  *                programma.
  1003.  */
  1004.  
  1005. void define_all(void)
  1006. {
  1007.  
  1008.     register i;
  1009.  
  1010.     /* Definizione dell'unico menu utilizzato. Le varie costanti utilizzate
  1011.      * sono definite in testa al programma.
  1012.      */
  1013.  
  1014.     Pcm_define(MENU_ID, MENU_LEN, MENU_SUBNUM, MENU_ITNUM, MENU_WSIZE,
  1015.     MENU_ATT, MENU_SELSUBATT, MENU_SUBATT, MENU_SELITATT, MENU_BORDATT,
  1016.     MENU_BORDSUATT, MENU_DESC, MENU_TYPE, MENU_LINETYPE, MENU_SUBLINETYPE,
  1017.     FALSE);
  1018.  
  1019.  
  1020.     /* Adesso viene agganciato al menu l'insieme delle descrizioni
  1021.      * aggiuntive utili per spiegare le varie funzioni in fase di scelta.
  1022.      */
  1023.  
  1024.     Pcm_ext_desc(MENU_ID, MENU_EXTDATT, MENU_EXTDESC);
  1025.  
  1026.  
  1027.  
  1028.     /* Qui viene definita la finestra contenente il test di Help visualizzato
  1029.      * mediante l'apposita funzione del menu o in taluni casi mediante F1
  1030.      */
  1031.  
  1032.     Pcw_define(W_HELP_ID, W_HELP_XWID, W_HELP_YWID, W_HELP_LINTYP,
  1033.     W_HELP_BORDATT, W_HELP_WNDATT, W_HELP_TTLATT, W_HELP_XLIM,
  1034.     W_HELP_YLIM, W_HELP_TITLE);
  1035.  
  1036.     i = 0;
  1037.     while (i < W_HELP_BODYLEN) {
  1038.     Pcw_sprintat(W_HELP_ID, 0, i, W_HELP_BODY[i], W_HELP_WNDATT);
  1039.     ++i;
  1040.     }
  1041.  
  1042. }
  1043.  
  1044.  
  1045.  
  1046.  
  1047. /*
  1048.  *  Funzione set_default:   Stabilisce i vari valori di default
  1049.  */
  1050.  
  1051. void set_default(void)
  1052. {
  1053.  
  1054.  
  1055.     Pcw_no_flick();        /* Disabilitazione dei flicker: questa funzione
  1056.                  * andrebbe invocata solo se la scheda lo richiede.
  1057.                  * Nel nostro caso viene invocato comunque, in
  1058.                  * quanto non pregiudica in modo osservabile le
  1059.                  * prestazioni del programma
  1060.                  */
  1061.  
  1062.  
  1063.  
  1064.  
  1065.     /* Di seguito viene usata la funzione Pcw_set_option per abilitare il
  1066.      * segnalatore acustico degli errori. Altre opzioni sono discusse a
  1067.      * parte.
  1068.      */
  1069.  
  1070.     Pcw_set_option("BEEP_ON_ERROR=YES");
  1071.  
  1072.  
  1073.     /* Adesso viene scelta la velocita' piu' alta possibile per gli effetti.
  1074.      * Questa e' valida solo in macchine dotate di CPU 80286 o 80386.
  1075.      * Se la macchina ospite non possiede uno di questi due processori,
  1076.      * il toolkit provvede ad abbassare la velocita' a FAST.
  1077.      */
  1078.  
  1079.     Pcw_set_speed(VERYFAST);
  1080.  
  1081.  
  1082. }
  1083.  
  1084.  
  1085.  
  1086.  
  1087. /*
  1088.  *  Funzione display_info:  Mostra le informazioni base su PcWindow.
  1089.  *
  1090.  *        La funzione ottiene un numero di finestra disponibile.
  1091.  *        Esegue poi la definizione e la scrittura e quindi mostra la
  1092.  *        finestra con le informazioni richieste.
  1093.  *        Dopodiche' alla pressione di un tasto la finestra viene chiusa
  1094.  *        e viene liberato il numero.
  1095.  *
  1096.  *        Anche in questo caso occorrerebbe controllare i valori in uscita
  1097.  *        dalle varie funzioni e in special modo dalla funzione
  1098.  *        Pcw_first_free. Nel nostro caso per come e' fatto il programma
  1099.  *        siamo sicuri che esiste una finestra libera.
  1100.  *
  1101.  */
  1102.  
  1103.  
  1104. void display_info(void)
  1105. {
  1106.  
  1107.     int temp_window;
  1108.     register i;
  1109.  
  1110.     char temp_string[20];
  1111.  
  1112.     temp_window = Pcw_first_free();        /* Ottiene un numero libero */
  1113.  
  1114.  
  1115.     /* Definizione finestra:    tutti i nomi sono definiti in testa al prog.*/
  1116.  
  1117.     Pcw_define(temp_window, W_INFO_XWID, W_INFO_YWID, W_GLOB_LINTYP,
  1118.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_INFO_XWID,
  1119.     W_INFO_YWID, W_INFO_TITLE);
  1120.  
  1121.  
  1122.     /* Scrittura del testo    */
  1123.  
  1124.     Pcw_sprintat(temp_window, ALIGN_CENTER, 0, "PcWindow", W_GLOB_BNATT);
  1125.     Pcw_sprintat(temp_window, ALIGN_CENTER, 1,
  1126.     "Personal Computer Window Management Tool", W_GLOB_WNDATT);
  1127.     Pcw_sprintat(temp_window, ALIGN_CENTER, 2,
  1128.     "(c) 1989  by  Pasquale Cantiello", W_GLOB_WNDATT);
  1129.  
  1130.     Pcw_sprintat(temp_window, 1, 4, "Versione :", W_GLOB_WNDATT);
  1131.  
  1132.  
  1133.     /* Legge il numero della versione nella stringa destinazione */
  1134.  
  1135.     itoa(Pcw_version(), temp_string+1, 10);
  1136.     temp_string[0] = temp_string[1];
  1137.     temp_string[1] = '.';
  1138.  
  1139.     Pcw_sprintat(temp_window, 12, 4, temp_string, W_GLOB_EVATT);
  1140.  
  1141.  
  1142.     /* Legge data e ora e le visualizza     */
  1143.  
  1144.     Pcw_sprintat(temp_window,  1, 6, "Data odierna :", W_GLOB_WNDATT);
  1145.     Pcw_sprintat(temp_window, 27, 6, "Ore :", W_GLOB_WNDATT);
  1146.     Pcw_get_date(temp_string);
  1147.     Pcw_sprintat(temp_window, 16, 6, temp_string, W_GLOB_EVATT);
  1148.     Pcw_get_time(temp_string);
  1149.     Pcw_sprintat(temp_window, 33, 6, temp_string, W_GLOB_EVATT);
  1150.  
  1151.  
  1152.     /* Legge il tipo di CPU        */
  1153.  
  1154.     Pcw_sprintat(temp_window,  1, 7, "CPU presente :", W_GLOB_WNDATT);
  1155.  
  1156.     switch(Pcw_cpu_type()) {
  1157.  
  1158.     case CPU_8088 :
  1159.     strcpy(temp_string, "Intel 8088");
  1160.     break;
  1161.     case CPU_8086 :
  1162.     strcpy(temp_string, "Intel 8086");
  1163.     break;
  1164.     case CPU_80188 :
  1165.     strcpy(temp_string, "Intel 80188");
  1166.     break;
  1167.     case CPU_80186 :
  1168.     strcpy(temp_string, "Intel 80186");
  1169.     break;
  1170.     case CPU_V20 :
  1171.     strcpy(temp_string, "Nec V20");
  1172.     break;
  1173.     case CPU_V30 :
  1174.     strcpy(temp_string, "Nec V30");
  1175.     break;
  1176.     case CPU_80286 :
  1177.     strcpy(temp_string, "Intel 80286");
  1178.     break;
  1179.     case CPU_80386 :
  1180.     strcpy(temp_string, "Intel 80386");
  1181.     break;
  1182.     default :
  1183.     strcpy(temp_string, "sconosciuta");
  1184.     break;
  1185.     }
  1186.  
  1187.     Pcw_sprintat(temp_window,  16, 7, temp_string, W_GLOB_EVATT);
  1188.  
  1189.  
  1190.     /* Legge il tipo di scheda video e lo visualizza    */
  1191.  
  1192.     Pcw_sprintat(temp_window,  1, 8, "Scheda video :", W_GLOB_WNDATT);
  1193.  
  1194.     switch(Pcw_video_card()) {
  1195.  
  1196.     case VIDEO_MONO :
  1197.     strcpy(temp_string, "MDA");
  1198.     break;
  1199.     case VIDEO_HERC :
  1200.     strcpy(temp_string, "Hercules");
  1201.     break;
  1202.     case VIDEO_CGA :
  1203.     strcpy(temp_string, "CGA");
  1204.     break;
  1205.     case VIDEO_EGA :
  1206.     strcpy(temp_string, "EGA");
  1207.     break;
  1208.     case VIDEO_MCGA :
  1209.     strcpy(temp_string, "MCGA");
  1210.     break;
  1211.     case VIDEO_VGA :
  1212.     strcpy(temp_string, "VGA");
  1213.     break;
  1214.     default :
  1215.     strcpy(temp_string, "sconosciuta");
  1216.     break;
  1217.     }
  1218.  
  1219.     Pcw_sprintat(temp_window, 16, 8, temp_string, W_GLOB_EVATT);
  1220.  
  1221.  
  1222.     Pcw_sprintat(temp_window, 1, 10, "Pasquale Cantiello      S.M.C.V. BBS", W_GLOB_WNDATT);
  1223.     Pcw_sprintat(temp_window, 1, 11, "c/o I.D.M. srl          FidoNet 2:335/2", W_GLOB_WNDATT);
  1224.     Pcw_sprintat(temp_window, 1, 12, "Viale Kennedy, 33       300/1200/2400 baud", W_GLOB_WNDATT);
  1225.     Pcw_sprintat(temp_window, 1, 13, "81055 S.Maria C.V. (CE) Tel. (0823) - 812533", W_GLOB_WNDATT);
  1226.     Pcw_sprintat(temp_window, 1, 14, "Tel. (0823) - 812533    Feriali: 20:00 - 08:00", W_GLOB_WNDATT);
  1227.     Pcw_sprintat(temp_window, 25, 15, "Sabato : dalle 14:00", W_GLOB_WNDATT);
  1228.     Pcw_sprintat(temp_window, 25, 16, "Festivi: 24 ore", W_GLOB_WNDATT);
  1229.  
  1230.     Pcw_printat(temp_window,  0,  9, 218, W_GLOB_EVATT,  1);
  1231.     Pcw_printat(temp_window,  1,  9, 196, W_GLOB_EVATT, 48);
  1232.     Pcw_printat(temp_window, 24,  9, 194, W_GLOB_EVATT,  1);
  1233.     Pcw_printat(temp_window, 47,  9, 191, W_GLOB_EVATT,  1);
  1234.  
  1235.     for (i = 0; i < 7; i++) {
  1236.     Pcw_printat(temp_window,  0, 10+i, 179, W_GLOB_EVATT,  1);
  1237.     Pcw_printat(temp_window, 24, 10+i, 179, W_GLOB_EVATT,  1);
  1238.     Pcw_printat(temp_window, 47, 10+i, 179, W_GLOB_EVATT,  1);
  1239.     }
  1240.  
  1241.     Pcw_printat(temp_window,  0, 17, 192, W_GLOB_EVATT,  1);
  1242.     Pcw_printat(temp_window,  1, 17, 196, W_GLOB_EVATT, 48);
  1243.     Pcw_printat(temp_window, 24, 17, 193, W_GLOB_EVATT,  1);
  1244.     Pcw_printat(temp_window, 47, 17, 217, W_GLOB_EVATT,  1);
  1245.  
  1246.  
  1247.  
  1248.  
  1249.     /* Viene aperta la finestra centrata in orizzontale rispetto al video */
  1250.  
  1251.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1252.  
  1253.  
  1254.  
  1255.     /* Aspetta la pressione di un tasto     */
  1256.  
  1257.     WAIT_FOR_A_KEY;
  1258.  
  1259.  
  1260.  
  1261.     /* Chiude la finestra */
  1262.  
  1263.     Pcw_close(FADEHORIZ);
  1264.  
  1265.  
  1266.     /* Libera il numero di finestra    */
  1267.  
  1268.     Pcw_undef(temp_window);
  1269.  
  1270. }
  1271.  
  1272.  
  1273.  
  1274. /*
  1275.  *  Funzione display_help:  Mostra una paginetta di aiuto.
  1276.  *
  1277.  *        In questo caso viene sfruttata una finestra predefinita e infatti
  1278.  *        occorre conoscere l'ID della finestra.
  1279.  */
  1280.  
  1281.  
  1282. void display_help(void)
  1283. {
  1284.  
  1285.     Pcw_open_pos(W_HELP_ID, ISTANT, ALIGN_CENTER, ALIGN_CENTER);
  1286.  
  1287.     WAIT_FOR_A_KEY;
  1288.  
  1289.     Pcw_close(ISTANT);
  1290.  
  1291. }
  1292.  
  1293.  
  1294.  
  1295.  
  1296. /*
  1297.  *  Funzione display_reg:  Mostra le informazioni sulla registrazione a PcW.
  1298.  *
  1299.  */
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308. /* Funzione demo_open:    dimostrativo dei possibili effetti di apertura    */
  1309.  
  1310. void demo_open(void)
  1311. {
  1312.  
  1313.     register i;
  1314.     int temp_window;
  1315.  
  1316.     temp_window = Pcw_first_free();
  1317.  
  1318.     Pcw_define(temp_window, W_WIN_OPEN_XWID, W_WIN_OPEN_YWID, W_GLOB_LINTYP,
  1319.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_OPEN_XWID,
  1320.     W_WIN_OPEN_YWID, W_WIN_OPEN_TITLE);
  1321.  
  1322.     i = 0;
  1323.     while (i < W_WIN_OPEN_BODYLEN) {
  1324.     Pcw_sprintat(temp_window, 0, i, W_WIN_OPEN_BODY[i], W_GLOB_WNDATT);
  1325.     ++i;
  1326.     }
  1327.  
  1328.  
  1329.  
  1330.     Pcw_open_pos(temp_window, ISTANT, ALIGN_BEGIN, ALIGN_END);
  1331.  
  1332.  
  1333.     /* Adesso mostra uno per uno i vari effetti     */
  1334.  
  1335.     for (i = 0; i < MAX_EFFECT; i ++) {
  1336.  
  1337.     Pcw_sprintat(temp_window, 0, 4, "Effetto :", W_GLOB_WNDATT);
  1338.     Pcw_sprintat(temp_window, 10, 4, effect_name[i], W_GLOB_EVATT);
  1339.     Pcw_sprintat(temp_window, 0, 5, "Premi un tasto", W_GLOB_WNDATT);
  1340.     WAIT_FOR_A_KEY;
  1341.     Pcw_printat(temp_window, 0, 5, ' ', W_GLOB_WNDATT, W_WIN_OPEN_XWID);
  1342.  
  1343.     Pcw_open_pos(W_HELP_ID, effect[i], ALIGN_END, 4);
  1344.     Pcw_sprintat(temp_window, 0, 5, "Premi un tasto", W_GLOB_WNDATT);
  1345.     WAIT_FOR_A_KEY;
  1346.     Pcw_printat(temp_window, 0, 5, ' ', W_GLOB_WNDATT, W_WIN_OPEN_XWID);
  1347.     Pcw_close(ISTANT);
  1348.     Pcw_printat(temp_window, 0, 4, ' ', W_GLOB_WNDATT, W_WIN_OPEN_XWID);
  1349.  
  1350.     }
  1351.  
  1352.     WAIT_FOR_A_KEY;
  1353.  
  1354.     Pcw_close(ISTANT);
  1355.  
  1356.     Pcw_undef(temp_window);
  1357.  
  1358. }
  1359.  
  1360.  
  1361.  
  1362.  
  1363. /* Funzione demo_close:  dimostrativo dei possibili effetti di chiusura  */
  1364.  
  1365. void demo_close(void)
  1366. {
  1367.  
  1368.     register i;
  1369.     int temp_window;
  1370.  
  1371.     temp_window = Pcw_first_free();
  1372.  
  1373.     Pcw_define(temp_window, W_WIN_CLOSE_XWID, W_WIN_CLOSE_YWID, W_GLOB_LINTYP,
  1374.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_CLOSE_XWID,
  1375.     W_WIN_CLOSE_YWID, W_WIN_CLOSE_TITLE);
  1376.  
  1377.     i = 0;
  1378.     while (i < W_WIN_CLOSE_BODYLEN) {
  1379.     Pcw_sprintat(temp_window, 0, i, W_WIN_CLOSE_BODY[i], W_GLOB_WNDATT);
  1380.     ++i;
  1381.     }
  1382.  
  1383.  
  1384.  
  1385.     Pcw_open_pos(temp_window, ISTANT, ALIGN_BEGIN, ALIGN_END);
  1386.  
  1387.  
  1388.     /* Adesso mostra uno per uno i vari effetti     */
  1389.  
  1390.     for (i = 0; i < MAX_EFFECT; i ++) {
  1391.  
  1392.     Pcw_sprintat(temp_window, 0, 4, "Effetto :", W_GLOB_WNDATT);
  1393.     Pcw_sprintat(temp_window, 10, 4, effect_name[i], W_GLOB_EVATT);
  1394.     Pcw_sprintat(temp_window, 0, 5, "Premi un tasto", W_GLOB_WNDATT);
  1395.     WAIT_FOR_A_KEY;
  1396.     Pcw_printat(temp_window, 0, 5, ' ', W_GLOB_WNDATT, W_WIN_CLOSE_XWID);
  1397.  
  1398.     Pcw_open_pos(W_HELP_ID, ISTANT, ALIGN_END, 4);
  1399.     Pcw_sprintat(temp_window, 0, 5, "Premi un tasto", W_GLOB_WNDATT);
  1400.     WAIT_FOR_A_KEY;
  1401.     Pcw_printat(temp_window, 0, 5, ' ', W_GLOB_WNDATT, W_WIN_CLOSE_XWID);
  1402.     Pcw_close(effect[i]);
  1403.     Pcw_printat(temp_window, 0, 4, ' ', W_GLOB_WNDATT, W_WIN_CLOSE_XWID);
  1404.  
  1405.     }
  1406.  
  1407.     WAIT_FOR_A_KEY;
  1408.  
  1409.     Pcw_close(ISTANT);
  1410.  
  1411.     Pcw_undef(temp_window);
  1412.  
  1413. }
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420. /* Funzione demo_inp_type: Mostra i possibili tipi di input */
  1421.  
  1422. void demo_inp_type(void)
  1423. {
  1424.  
  1425.     register i;
  1426.     int temp_window, result;
  1427.  
  1428.     temp_window = Pcw_first_free();
  1429.  
  1430.     Pcw_define(temp_window, W_INP_TYPE_XWID, W_INP_TYPE_YWID, W_GLOB_LINTYP,
  1431.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_INP_TYPE_XWID,
  1432.     W_INP_TYPE_YWID, W_INP_TYPE_TITLE);
  1433.  
  1434.     i = 0;
  1435.     while (i < W_INP_TYPE_BODYLEN) {
  1436.     Pcw_sprintat(temp_window, 0, i, W_INP_TYPE_BODY[i], W_GLOB_WNDATT);
  1437.     ++i;
  1438.     }
  1439.  
  1440.  
  1441.  
  1442.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1443.  
  1444.     /* Azzeramento valori di default        */
  1445.  
  1446.     for (i = 0; i < MAXTYPE; i++) {
  1447.     input_data[i][0] = '\0';
  1448.     Pcw_sprintat(temp_window, 0, i+5, input_type_desc[i], W_GLOB_WNDATT);
  1449.  
  1450.     }
  1451.  
  1452.     i = 0;
  1453.  
  1454.     /* Setta il modo di input        */
  1455.  
  1456.     Pcw_set_input_mode(BLANK, reverse(W_GLOB_EVATT), W_GLOB_EVATT, CURS);
  1457.  
  1458.     /* Sceglie il tipo di input     */
  1459.  
  1460.     Pcw_set_input_flag(INP);
  1461.  
  1462.  
  1463.     while (i < MAXTYPE) {
  1464.  
  1465.     result = Pcw_input(input_type[i], 59, i+5, input_len[i], input_data[i], input_data[i]);
  1466.  
  1467.     switch(result) {
  1468.  
  1469.     case OK :
  1470.     case IN_CRD :
  1471.         ++i;
  1472.         break;
  1473.  
  1474.     case IN_CRU :
  1475.         if (i)
  1476.         --i;
  1477.         break;
  1478.  
  1479.  
  1480.     }
  1481.     }
  1482.  
  1483.     WAIT_FOR_A_KEY;
  1484.  
  1485.     Pcw_close(FADEHORIZ);
  1486.  
  1487.     Pcw_undef(temp_window);
  1488.  
  1489. }
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495. /* Funzione demo_select: Mostra la funzione select */
  1496.  
  1497. void demo_select(void)
  1498. {
  1499.  
  1500.     register i;
  1501.     int temp_window, result;
  1502.  
  1503.     temp_window = Pcw_first_free();
  1504.  
  1505.     Pcw_define(temp_window, W_INP_SELECT_XWID, W_INP_SELECT_YWID, W_INP_SELECT_LINTYP,
  1506.     W_INP_SELECT_BORDATT, W_INP_SELECT_WNDATT, W_INP_SELECT_TTLATT, W_INP_SELECT_XLIM,
  1507.     W_INP_SELECT_YLIM, W_INP_SELECT_TITLE);
  1508.  
  1509.     i = 0;
  1510.     while (i < W_INP_SELECT_BODYLEN) {
  1511.     Pcw_sprintat(temp_window, 0, i, W_INP_SELECT_BODY[i], W_INP_SELECT_WNDATT);
  1512.     ++i;
  1513.     }
  1514.  
  1515.  
  1516.  
  1517.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1518.  
  1519.     result = 0;
  1520.  
  1521.     do {
  1522.  
  1523.     result = Pcw_select(10, 13, W_SELECT_YWID, result, MAX_SCELTE, scelte,
  1524.         W_SELECT_LINTYP, W_SELECT_BORDATT, W_SELECT_WNDATT, W_SELECT_EVATT,
  1525.         ISTANT);
  1526.  
  1527.     Pcw_sprintat(temp_window, 0, 8, "Hai scelto : ", W_INP_SELECT_WNDATT);
  1528.     Pcw_sprintat(temp_window, 0, 9, "Premi un tasto per continuare", W_INP_SELECT_WNDATT);
  1529.     Pcw_sprintat(temp_window, 13, 8, scelte[result], W_INP_SELECT_EVATT);
  1530.  
  1531.     WAIT_FOR_A_KEY;
  1532.  
  1533.     Pcw_printat(temp_window, 0, 8, ' ', W_INP_SELECT_WNDATT, W_INP_SELECT_XLIM);
  1534.     Pcw_printat(temp_window, 0, 9, ' ', W_INP_SELECT_WNDATT, W_INP_SELECT_XLIM);
  1535.  
  1536.  
  1537.     } while (result != MAX_SCELTE-1);
  1538.  
  1539.     Pcw_close(FADEHORIZ);
  1540.  
  1541.     Pcw_undef(temp_window);
  1542.  
  1543. }
  1544.  
  1545.  
  1546.  
  1547.  
  1548. /* Funzione demo_move:    Mostra i possibili movimenti della finestra */
  1549.  
  1550. void demo_move(void)
  1551. {
  1552.  
  1553.     register i;
  1554.     int temp_window;
  1555.  
  1556.     temp_window = Pcw_first_free();
  1557.  
  1558.     Pcw_define(temp_window, W_WIN_MOVE_XWID, W_WIN_MOVE_YWID, W_GLOB_LINTYP,
  1559.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_MOVE_XWID,
  1560.     W_WIN_MOVE_YWID, W_WIN_MOVE_TITLE);
  1561.  
  1562.     i = 0;
  1563.     while (i < W_WIN_MOVE_BODYLEN) {
  1564.     Pcw_sprintat(temp_window, 0, i, W_WIN_MOVE_BODY[i], W_GLOB_WNDATT);
  1565.     ++i;
  1566.     }
  1567.  
  1568.  
  1569.     Pcw_sprintat(temp_window, 0, W_WIN_MOVE_BODYLEN + 1,
  1570.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1571.  
  1572.  
  1573.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1574.  
  1575.     WAIT_FOR_A_KEY;
  1576.  
  1577.     Pcw_printat(temp_window, 0, W_WIN_MOVE_BODYLEN + 1, ' ', W_GLOB_WNDATT, W_WIN_MOVE_XWID);
  1578.  
  1579.  
  1580.     /* Usa la finestra di help ma ristretta    */
  1581.  
  1582.     Pcw_size(W_HELP_ID, RESTRICT, RIGHT, 30, ISTANT);
  1583.     Pcw_size(W_HELP_ID, RESTRICT, DOWN, 5, ISTANT);
  1584.  
  1585.  
  1586.     Pcw_open_pos(W_HELP_ID, ISTANT, 0, 0);
  1587.  
  1588.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_END_VIEW, ISTANT);
  1589.     Pcw_move_abs(ALIGN_BEGIN_VIEW, ALIGN_BEGIN_VIEW, ISTANT);
  1590.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_END_VIEW, FADEHORIZ);
  1591.     Pcw_move_abs(ALIGN_BEGIN_VIEW, ALIGN_BEGIN_VIEW, FADEHORIZ);
  1592.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_END_VIEW, FADEVERT);
  1593.     Pcw_move_abs(ALIGN_BEGIN_VIEW, ALIGN_BEGIN_VIEW, FADEVERT);
  1594.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_BEGIN_VIEW, FADEHORIZ);
  1595.     Pcw_move_abs(ALIGN_CENTER_VIEW, ALIGN_BEGIN_VIEW, FADEHORIZ);
  1596.     Pcw_move_abs(ALIGN_CENTER_VIEW, ALIGN_END_VIEW, FADEVERT);
  1597.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_BEGIN_VIEW, FADEVERT);
  1598.     Pcw_move_abs(ALIGN_END_VIEW, ALIGN_END_VIEW, FADEVERT);
  1599.  
  1600.  
  1601.     Pcw_sprintat(temp_window, 0, W_WIN_MOVE_BODYLEN + 1,
  1602.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1603.  
  1604.  
  1605.     WAIT_FOR_A_KEY;
  1606.  
  1607.  
  1608.  
  1609.     /* Rimette a posto la finestra    */
  1610.  
  1611.     Pcw_set_view(W_HELP_ID, 0, 0);
  1612.     Pcw_move_abs(0, 0, ISTANT);
  1613.     Pcw_close(ISTANT);
  1614.     Pcw_size(W_HELP_ID, ENLARGE, RIGHT, 30, ISTANT);
  1615.     Pcw_size(W_HELP_ID, ENLARGE, DOWN, 5, ISTANT);
  1616.  
  1617.     Pcw_close(FADEHORIZ);
  1618.  
  1619.     Pcw_undef(temp_window);
  1620.  
  1621. }
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627. /* Funzione demo_scroll:  Mostra lo scrolling nella window */
  1628.  
  1629. void demo_scroll(void)
  1630. {
  1631.  
  1632.     register i;
  1633.     int temp_window;
  1634.  
  1635.     temp_window = Pcw_first_free();
  1636.  
  1637.     Pcw_define(temp_window, W_WIN_SCROLL_XWID, W_WIN_SCROLL_YWID, W_GLOB_LINTYP,
  1638.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_SCROLL_XWID,
  1639.     W_WIN_SCROLL_YWID, W_WIN_SCROLL_TITLE);
  1640.  
  1641.     i = 0;
  1642.     while (i < W_WIN_SCROLL_BODYLEN) {
  1643.     Pcw_sprintat(temp_window, 0, i, W_WIN_SCROLL_BODY[i], W_GLOB_WNDATT);
  1644.     ++i;
  1645.     }
  1646.  
  1647.  
  1648.     Pcw_sprintat(temp_window, 0, W_WIN_SCROLL_BODYLEN + 1,
  1649.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1650.  
  1651.  
  1652.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1653.  
  1654.     WAIT_FOR_A_KEY;
  1655.  
  1656.     Pcw_printat(temp_window, 0, W_WIN_SCROLL_BODYLEN + 1, ' ', W_GLOB_WNDATT, W_WIN_SCROLL_XWID);
  1657.  
  1658.  
  1659.     /* Usa la finestra di help ma ristretta    */
  1660.  
  1661.     Pcw_size(W_HELP_ID, RESTRICT, RIGHT, 30, ISTANT);
  1662.     Pcw_size(W_HELP_ID, RESTRICT, DOWN, 5, ISTANT);
  1663.  
  1664.  
  1665.     Pcw_open_pos(W_HELP_ID, ISTANT, ALIGN_CENTER_VIEW, ALIGN_CENTER_VIEW);
  1666.  
  1667.     Pcw_scroll(W_HELP_ID, RIGHT, 10, FADE);
  1668.     Pcw_scroll(W_HELP_ID, LEFT, 10, FADE);
  1669.     Pcw_scroll(W_HELP_ID, DOWN, 5, FADE);
  1670.     Pcw_scroll(W_HELP_ID, UP, 5, FADE);
  1671.     Pcw_scroll(W_HELP_ID, RIGHT, 10, FADE);
  1672.     Pcw_scroll(W_HELP_ID, LEFT, 10, FADE);
  1673.     Pcw_scroll(W_HELP_ID, DOWN, 5, FADE);
  1674.     Pcw_scroll(W_HELP_ID, UP, 5, FADE);
  1675.  
  1676.  
  1677.     Pcw_sprintat(temp_window, 0, W_WIN_SCROLL_BODYLEN + 1,
  1678.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1679.  
  1680.  
  1681.     WAIT_FOR_A_KEY;
  1682.  
  1683.  
  1684.  
  1685.  
  1686.     /* Rimette a posto la finestra    */
  1687.  
  1688.     Pcw_set_view(W_HELP_ID, 0, 0);
  1689.     Pcw_move_abs(0, 0, ISTANT);
  1690.     Pcw_close(ISTANT);
  1691.     Pcw_size(W_HELP_ID, ENLARGE, RIGHT, 30, ISTANT);
  1692.     Pcw_size(W_HELP_ID, ENLARGE, DOWN, 5, ISTANT);
  1693.  
  1694.     Pcw_close(FADEHORIZ);
  1695.  
  1696.     Pcw_undef(temp_window);
  1697.  
  1698. }
  1699.  
  1700.  
  1701.  
  1702.  
  1703. /* Funzione demo_view:    Mostra effetti di viewing */
  1704.  
  1705. void demo_view(void)
  1706. {
  1707.  
  1708.     register i;
  1709.     int temp_window;
  1710.  
  1711.     temp_window = Pcw_first_free();
  1712.  
  1713.     Pcw_define(temp_window, W_WIN_VIEW_XWID, W_WIN_VIEW_YWID, W_GLOB_LINTYP,
  1714.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_VIEW_XWID,
  1715.     W_WIN_VIEW_YWID, W_WIN_VIEW_TITLE);
  1716.  
  1717.     i = 0;
  1718.     while (i < W_WIN_VIEW_BODYLEN) {
  1719.     Pcw_sprintat(temp_window, 0, i, W_WIN_VIEW_BODY[i], W_GLOB_WNDATT);
  1720.     ++i;
  1721.     }
  1722.  
  1723.  
  1724.     Pcw_sprintat(temp_window, 0, W_WIN_VIEW_BODYLEN + 1,
  1725.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1726.  
  1727.  
  1728.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1729.  
  1730.     WAIT_FOR_A_KEY;
  1731.  
  1732.     Pcw_printat(temp_window, 0, W_WIN_VIEW_BODYLEN + 1, ' ', W_GLOB_WNDATT, W_WIN_VIEW_XWID);
  1733.  
  1734.  
  1735.     /* Usa la finestra di help ma ristretta    */
  1736.  
  1737.     Pcw_size(W_HELP_ID, RESTRICT, RIGHT, 30, ISTANT);
  1738.     Pcw_size(W_HELP_ID, RESTRICT, DOWN, 5, ISTANT);
  1739.  
  1740.  
  1741.     Pcw_open_pos(W_HELP_ID, ISTANT, ALIGN_CENTER_VIEW, ALIGN_CENTER_VIEW);
  1742.  
  1743.     Pcw_set_view(W_HELP_ID, 10, 4);
  1744.  
  1745.     WAIT_FOR_A_KEY;
  1746.  
  1747.     Pcw_set_view(W_HELP_ID, 10, 0);
  1748.  
  1749.     WAIT_FOR_A_KEY;
  1750.  
  1751.     Pcw_set_view(W_HELP_ID, 0, 4);
  1752.  
  1753.     WAIT_FOR_A_KEY;
  1754.  
  1755.     Pcw_sprintat(temp_window, 0, W_WIN_VIEW_BODYLEN + 1,
  1756.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1757.  
  1758.  
  1759.     WAIT_FOR_A_KEY;
  1760.  
  1761.  
  1762.  
  1763.  
  1764.     /* Rimette a posto la finestra    */
  1765.  
  1766.     Pcw_set_view(W_HELP_ID, 0, 0);
  1767.     Pcw_move_abs(0, 0, ISTANT);
  1768.     Pcw_close(ISTANT);
  1769.  
  1770.     Pcw_size(W_HELP_ID, ENLARGE, RIGHT, 30, ISTANT);
  1771.     Pcw_size(W_HELP_ID, ENLARGE, DOWN, 5, ISTANT);
  1772.  
  1773.     Pcw_close(FADEHORIZ);
  1774.     Pcw_undef(temp_window);
  1775.  
  1776.  
  1777. }
  1778.  
  1779.  
  1780.  
  1781.  
  1782.  
  1783.  
  1784. /* Funzione demo_size:    Mostra effetti di sizeing */
  1785.  
  1786. void demo_size(void)
  1787. {
  1788.  
  1789.     register i;
  1790.     int temp_window;
  1791.  
  1792.     temp_window = Pcw_first_free();
  1793.  
  1794.     Pcw_define(temp_window, W_WIN_SIZE_XWID, W_WIN_SIZE_YWID, W_GLOB_LINTYP,
  1795.     W_GLOB_BORDATT, W_GLOB_WNDATT, W_GLOB_TTLATT, W_WIN_SIZE_XWID,
  1796.     W_WIN_SIZE_YWID, W_WIN_SIZE_TITLE);
  1797.  
  1798.     i = 0;
  1799.     while (i < W_WIN_SIZE_BODYLEN) {
  1800.     Pcw_sprintat(temp_window, 0, i, W_WIN_SIZE_BODY[i], W_GLOB_WNDATT);
  1801.     ++i;
  1802.     }
  1803.  
  1804.  
  1805.     Pcw_sprintat(temp_window, 0, W_WIN_SIZE_BODYLEN + 1,
  1806.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1807.  
  1808.  
  1809.     Pcw_open_pos(temp_window, FADEHORIZ, ALIGN_CENTER, ALIGN_CENTER);
  1810.  
  1811.     WAIT_FOR_A_KEY;
  1812.  
  1813.     Pcw_printat(temp_window, 0, W_WIN_SIZE_BODYLEN + 1, ' ', W_GLOB_WNDATT, W_WIN_SIZE_XWID);
  1814.  
  1815.  
  1816.  
  1817.     Pcw_open_pos(W_HELP_ID, ISTANT, ALIGN_CENTER_VIEW, ALIGN_CENTER_VIEW);
  1818.  
  1819.     Pcw_size(W_HELP_ID, RESTRICT, RIGHT, 30, FADE);
  1820.     Pcw_size(W_HELP_ID, ENLARGE, RIGHT, 30, FADE);
  1821.  
  1822.     Pcw_size(W_HELP_ID, RESTRICT, DOWN, 5, FADE);
  1823.     Pcw_size(W_HELP_ID, ENLARGE, DOWN, 5, FADE);
  1824.  
  1825.     Pcw_size(W_HELP_ID, RESTRICT, LEFT, 30, FADE);
  1826.     Pcw_size(W_HELP_ID, ENLARGE, LEFT, 30, FADE);
  1827.  
  1828.     Pcw_size(W_HELP_ID, RESTRICT, UP, 5, FADE);
  1829.     Pcw_size(W_HELP_ID, ENLARGE, UP, 5, FADE);
  1830.  
  1831.     Pcw_size(W_HELP_ID, RESTRICT, HORIZ, 20, FADE);
  1832.     Pcw_size(W_HELP_ID, ENLARGE, HORIZ, 20, FADE);
  1833.  
  1834.     Pcw_size(W_HELP_ID, RESTRICT, VERT, 5, FADE);
  1835.     Pcw_size(W_HELP_ID, ENLARGE, VERT, 5, FADE);
  1836.  
  1837.     Pcw_size(W_HELP_ID, RESTRICT, BOTH, 5, FADE);
  1838.     Pcw_size(W_HELP_ID, ENLARGE, BOTH, 5, FADE);
  1839.  
  1840.  
  1841.  
  1842.     Pcw_sprintat(temp_window, 0, W_WIN_SIZE_BODYLEN + 1,
  1843.     "Premi un tasto per continuare", W_GLOB_WNDATT);
  1844.  
  1845.  
  1846.     WAIT_FOR_A_KEY;
  1847.  
  1848.  
  1849.     Pcw_close(ISTANT);
  1850.  
  1851.  
  1852.     Pcw_close(FADEHORIZ);
  1853.  
  1854.     Pcw_undef(temp_window);
  1855.  
  1856. }
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  
  1866.  
  1867.  
  1868. /* Funzione show_info: Mostra informazioni generiche */
  1869.  
  1870. void show_info(xwid, ywid, title, text)
  1871. unsigned int xwid;            /* Dimensione lungo X della window    */
  1872. unsigned int ywid;            /* Dimensione lungo Y della window    */
  1873. char *title;                /* Titolo della window        */
  1874. char **text;                /* Testo da visualizzare        */
  1875. {
  1876.  
  1877.     register i;
  1878.     int temp_window;
  1879.  
  1880.     temp_window = Pcw_first_free();
  1881.  
  1882.     Pcw_define(temp_window, xwid, ywid, W_GLOB_LINTYP, W_GLOB_BORDATT,
  1883.     W_GLOB_WNDATT, W_GLOB_TTLATT, xwid, ywid, title);
  1884.  
  1885.     i = 0;
  1886.     while (i < ywid) {
  1887.     Pcw_sprintat(temp_window, 0, i, text[i], W_GLOB_WNDATT);
  1888.     ++i;
  1889.     }
  1890.  
  1891.  
  1892.  
  1893.     Pcw_open_pos(temp_window, ISTANT, ALIGN_CENTER, ALIGN_CENTER);
  1894.  
  1895.     WAIT_FOR_A_KEY;
  1896.  
  1897.     Pcw_close(ISTANT);
  1898.  
  1899.     Pcw_undef(temp_window);
  1900.  
  1901. }
  1902.