(*Nome unit: messages*)
(*Versione: o.7-beta*)
(*Licenza: GNU GPL*)
(*Rilascio: 03/09/2010*)
(*Autore: Francesco Marrone (alias Giarados)*)
(*Descrizione: questo modulo contiene una sola procedura che si occupa di visualizzare messaggi a video*)
unit messages;
interface
{la procedura display stampa messaggi a video.
se autoexit è true allora si attende per pause millisecondi
se cover_bk è true allora il resto dello schermo viene offuscato}
procedure display(astring:string; autoexit:boolean; pause:smallint; cover_bk:boolean);
implementation
uses wingraph,wincrt;
{la procedura display stampa messaggi a video.}
procedure display(astring:string; autoexit:boolean; pause:smallint; cover_bk:boolean);
var
bitmap:pointer;
a,b:smallint;
key:char;
begin
{se la stringa non è eccessivamente lunga allora...}
if not (length(astring)*11>getmaxx) then
begin
{fa uno screenshot di tutto lo schermo}
getmem(bitmap,imagesize(0,0,getmaxx,getmaxy));
getimage(0,0,getmaxx,getmaxy,bitmap^);
{se cover_bk è vero allora lo schermo viene offuscato.
i cicli for sottostanti sono di facile comprensione. eviterò di commentarli}
if cover_bk then
for a:=0 to getmaxx do
for b:=0 to getmaxy do
if (a mod 2 = 0) then
begin
if (b mod 2 <> 0) then
begin
if getpixel(a,b)<>black then
putpixel(a,b,black);
end;
end
else begin
if (b mod 2 = 0) then
begin
if getpixel(a,b)<>black then putpixel(a,b,black);
end;
end;
{viene pulito lo schermo nell'area in cui deve comparire il messaggio}
setviewport((getmaxx div 2)-((length(astring) div 2)+1)*11,(getmaxy div 2) - 10,(getmaxx div 2)+((length(astring) div 2)+2)*7,(getmaxy div 2) + 10,true);
clearviewport;
setviewport(0,0,getmaxx,getmaxy,false);
{vengono disegnati 3 rettangoli che fanno da bordo al messaggio}
setcolor(white);
rectangle(-1+(getmaxx div 2)-((length(astring) div 2)+1)*11,(getmaxy div 2) - 11,1+(getmaxx div 2)+((length(astring) div 2)+2)*7,(getmaxy div 2) + 11);
setcolor(red);
rectangle(-2+(getmaxx div 2)-((length(astring) div 2)+1)*11,(getmaxy div 2) - 12,2+(getmaxx div 2)+((length(astring) div 2)+2)*7,(getmaxy div 2) + 12);
setcolor(white);
rectangle(-3+(getmaxx div 2)-((length(astring) div 2)+1)*11,(getmaxy div 2) - 13,3+(getmaxx div 2)+((length(astring) div 2)+2)*7,(getmaxy div 2) + 13);
setcolor(white);
{viene stampato a video il messaggio contenuto in astring}
outtextxy(5+(getmaxx div 2)-(length(astring) div 2)*11,(getmaxy div 2) - 7,astring);
key:=chr(32);
if autoexit then delay(pause) {se autoexit è true allora si attende per pause millisecondi}
else {altrimenti si legge l'input da tastiera sino a quando assume un valore 32 (<>barra_spaziatrice)}
repeat
if keypressed then key:=readkey;
until key<>chr(32);
setcolor(getbkcolor);
putimage(0,0,bitmap^,normalput); {viene ripristinato lo schermo sottostante}
freemem(bitmap);
end
else writeln('Too long string!'); {se la stringa è troppo lunga allora viene restituito questo messaggio}
end;
end.