Oppure

Loading
03/08/09 7:57
giulioscatto
Cavolo il mio primo post! :rofl:
Ciao a tutti!
Ho un piccolo, ma fastidioso problema: vorrei memorizzare la schermata di output
fatta con il graph per utilizzarla in seguito, durante il programma.
Questa mia necessità deriva dal fatto che, volendo simulare un pseudo-Windows, ho dovuto creare il mouse.
Praticamente funziona così:
1- Disegna se stesso;
[Il cursore reale si sposta]
2- Cancella se stesso;
3- Disegna se stesso sulla nuova posizione;
...
Questa era la mia idea... Il problema è che quando si cancella deve disegnare ciò che stava coprendo... (chiedo scusa se fin'ora, ma anche dopo, sarò impreciso ma sono abbastanza confuso di mio! 8-|).
Per memorizzare una finta schermata avevo pensato di usare un pointer type, o come cavolo si chiamano :blush:, usando le procedure getimage,getmem,putimage... (tutto visto su internet :heehee: ).
Avevo provato a fargli copiare l'intera schermata (480x640) ma TP si bloccava...
Allora ho provato dividendo la schermata in 12 parti (4x3) ma, praticamente, ora me ne ritorna solo 9!
Non so qual'è il problema... vi chiedo un grande HELP! :hail:

Ecco il codice (ci sono molte cose che non c'entrano, ho cercato di toglierle ma non so se le ho tolte tutte..):
uses crt,graph;

type part_sf = array[0..4,0..3] of pointer;

var gm,gd,m,n:integer;
size:word;
schermo:part_sf;

begin
initgraph(gm,gd,'');
setcolor(11);      
line(0,0,69,479);
setcolor(14);
rectangle(10,10,50,30);
rectangle(10,110,150,30);
rectangle(10,210,350,30);
circle(500,400,50);
circle(500,0,50);
readln;

for m:=0 to 3 do
begin
for n:=0 to 2 do
begin
rectangle(m*160,n*160,m*160+160,n*160+160);
size:=imagesize(m*160,n*160,m*160+160,n*160+160);
getmem(schermo[m,n],size);
getimage(m*160,n*160,m*160+160,n*160+160,schermo[m,n]^);
end;
end;

readln;
clearviewport;
readln;

for m:=0 to 3 do
for n:=0 to 2 do
putimage(m*160,n*160,schermo[m,n]^,0);

for m:=0 to 3 do
begin
for n:=0 to 2 do
begin
size:=imagesize(m*160,n*160,m*160+160,n*160+160);
freemem(schermo[m,n],size);
end;
end;

readln;
closegraph;

end.


Grazie in anticipo.
Ultima modifica effettuata da giulioscatto 03/08/09 7:58
aaa
03/08/09 10:24
gigisoft
Postato originariamente da giulioscatto:

Cavolo il mio primo post! :rofl:
Ciao a tutti!
Ho un piccolo, ma fastidioso problema: vorrei memorizzare la schermata di output
fatta con il graph per utilizzarla in seguito, durante il programma.
Questa mia necessità deriva dal fatto che, volendo simulare un pseudo-Windows, ho dovuto creare il mouse.
Praticamente funziona così:
1- Disegna se stesso;
[Il cursore reale si sposta]
2- Cancella se stesso;
3- Disegna se stesso sulla nuova posizione;
...
Questa era la mia idea... Il problema è che quando si cancella deve disegnare ciò che stava coprendo... (chiedo scusa se fin'ora, ma anche dopo, sarò impreciso ma sono abbastanza confuso di mio! 8-|).
Per memorizzare una finta schermata avevo pensato di usare un pointer type, o come cavolo si chiamano :blush:, usando le procedure getimage,getmem,putimage... (tutto visto su internet :heehee: ).
Avevo provato a fargli copiare l'intera schermata (480x640) ma TP si bloccava...
Allora ho provato dividendo la schermata in 12 parti (4x3) ma, praticamente, ora me ne ritorna solo 9!
Non so qual'è il problema... vi chiedo un grande HELP! :hail:

[...]


Salve,
se il tuo problema e' solo la gestione del mouse, puoi risolverlo con l'utilizzo della struttura TEvent e la funzione GetMouseEvent


Ev: TEvent;

[...]

Ev.What := EvNothing;
InitEvents;
ShowMouse;

[...]

GetMouseEvent(Ev);

Case Ev.What of
     evMouseDown: Write('MouseDown ');
     evMouseUp  : Write('MouseUp ');
     evMouseMove: Write('MouseMove ');
     evMouseAuto: Write('MouseAuto ');
    end;

ShowMouse;

[...]



puo' essere usata anche per gli eventi di tastiera, purtroppo i codici degli eventi non li ricordo, ma su internet dovresti trovare qualcosa.

Se invece vuoi gestire lo spostamento di un oggetto qualsiasi, va bene usare getimage e putimage, ma ti consiglio di non usarle per l'intera schermata, si potrebbero avere problemi con la gestione di grosse quantita' di memoria.

Infine se vuoi gestire il cambio dell'intera schermata, sappi che TP puo' gestire diverse schermate ( 256 se non ricordo male ) per cui puoi disegnare in background un'altra schermata ( con la funzione setactivepage ) e mostrarla con la funzione setvisualpage;
tra l'altro l'uso delle diverse schermate e' utile anche per evitare sfarfallii nello spostamento di un'oggetto sullo schermo.

Grazie in anticipo.


Prego, spero di essere stato abbastanza chiaro.

Ciao. :k:

Luigi
Ultima modifica effettuata da gigisoft 03/08/09 10:38
aaa
03/08/09 12:17
giulioscatto
Postato originariamente da gigisoft:

Postato originariamente da giulioscatto:

Cavolo il mio primo post! :rofl:
Ciao a tutti!
Ho un piccolo, ma fastidioso problema: vorrei memorizzare la schermata di output
fatta con il graph per utilizzarla in seguito, durante il programma.
Questa mia necessità deriva dal fatto che, volendo simulare un pseudo-Windows, ho dovuto creare il mouse.
Praticamente funziona così:
1- Disegna se stesso;
[Il cursore reale si sposta]
2- Cancella se stesso;
3- Disegna se stesso sulla nuova posizione;
...
Questa era la mia idea... Il problema è che quando si cancella deve disegnare ciò che stava coprendo... (chiedo scusa se fin'ora, ma anche dopo, sarò impreciso ma sono abbastanza confuso di mio! 8-|).
Per memorizzare una finta schermata avevo pensato di usare un pointer type, o come cavolo si chiamano :blush:, usando le procedure getimage,getmem,putimage... (tutto visto su internet :heehee: ).
Avevo provato a fargli copiare l'intera schermata (480x640) ma TP si bloccava...
Allora ho provato dividendo la schermata in 12 parti (4x3) ma, praticamente, ora me ne ritorna solo 9!
Non so qual'è il problema... vi chiedo un grande HELP! :hail:

[...]


Salve,
se il tuo problema e' solo la gestione del mouse, puoi risolverlo con l'utilizzo della struttura TEvent e la funzione GetMouseEvent


Ev: TEvent;

[...]

Ev.What := EvNothing;
InitEvents;
ShowMouse;

[...]

GetMouseEvent(Ev);

Case Ev.What of
     evMouseDown: Write('MouseDown ');
     evMouseUp  : Write('MouseUp ');
     evMouseMove: Write('MouseMove ');
     evMouseAuto: Write('MouseAuto ');
    end;

ShowMouse;

[...]



puo' essere usata anche per gli eventi di tastiera, purtroppo i codici degli eventi non li ricordo, ma su internet dovresti trovare qualcosa.

Se invece vuoi gestire lo spostamento di un oggetto qualsiasi, va bene usare getimage e putimage, ma ti consiglio di non usarle per l'intera schermata, si potrebbero avere problemi con la gestione di grosse quantita' di memoria.

Infine se vuoi gestire il cambio dell'intera schermata, sappi che TP puo' gestire diverse schermate ( 256 se non ricordo male ) per cui puoi disegnare in background un'altra schermata ( con la funzione setactivepage ) e mostrarla con la funzione setvisualpage;
tra l'altro l'uso delle diverse schermate e' utile anche per evitare sfarfallii nello spostamento di un'oggetto sullo schermo.

Grazie in anticipo.


Prego, spero di essere stato abbastanza chiaro.

Ciao. :k:

Luigi


Grazie ancora Luigi.
Ora vorrei fare un'altra domanda: esiste un modo migliore per disegnare il mouse di questo?
Praticamente mette pixel per pixel... Il problema dello sfondo è risolto, almeno!
Grazie ancora per chi mi aiuterà! :hail:

uses graph,crt,mouse;
type icon = array[0..11,0..18] of byte;
var gm,gd,mx,my,oldmx,oldmy:integer;
    oldicon:icon;
const mouse_norm_icon : icon = ((8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,99,99),
                      (99,8,15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,99,99),
                      (99,99,8,15,15,15,15,15,15,15,15,15,15,15,15,8,99,99,99),
                      (99,99,99,8,15,15,15,15,15,15,15,15,15,15,8,99,99,99,99),
                      (99,99,99,99,8,15,15,15,15,15,15,15,15,8,99,99,99,99,99),
                      (99,99,99,99,99,8,15,15,15,15,15,15,15,15,8,8,99,99,99),
                      (99,99,99,99,99,99,8,15,15,15,15,15,15,15,15,15,8,8,99),
                      (99,99,99,99,99,99,99,8,15,15,15,15,8,8,15,15,15,15,8),
                      (99,99,99,99,99,99,99,99,8,15,15,15,8,99,8,8,15,15,8),
                      (99,99,99,99,99,99,99,99,99,8,15,15,8,99,99,99,8,8,99),
                      (99,99,99,99,99,99,99,99,99,99,8,15,8,99,99,99,99,99,99),
                      (99,99,99,99,99,99,99,99,99,99,99,8,8,99,99,99,99,99,99));

Procedure DrawIcon(x,y:integer; var ic : icon);
var i,j: integer;
begin
  for j:=0 to 11 do
    for i:=0 to 18 do
      if ic[j,i] <> 99 then putpixel(x+j,y+i,ic[j,i]);
end;

procedure GetIcon(x,y: integer; var geticon : icon);
var i,j: integer;
begin
  for j:=0 to 11 do
    for i:=0 to 18 do
      geticon[j,i]:= getpixel(x+j,y+i);
end;

procedure RefreshMouse;
begin
drawicon(oldmx,oldmy,oldicon);
oldmx:=mx;
oldmy:=my;
geticon(mx,my,oldicon);
drawicon(mx,my,mouse_norm_icon);
end;

begin
initgraph(gm,gd,'');
rectangle(100,100,500,400);
oldmx:=getmousex;
oldmy:=getmousey;
mx:=oldmx;
my:=oldmy;
repeat
mx:=getmousex;
my:=getmousey;
if (mx <> oldmx) or (my <> oldmy) then Refreshmouse;
oldmx:=mx;
oldmy:=my;
until keypressed;

readln;
closegraph;
end.
aaa
03/08/09 12:46
giulioscatto
Ho risolto il problema! Grazie a tutti! :yup::hail::)
aaa