Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Memorizzazione della finestra di output usando graph
Forum - Pascal - Memorizzazione della finestra di output usando graph

Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 9:57
Lunedì, 03/08/2009
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..):
Codice sorgente - presumibilmente Delphi

  1. uses crt,graph;
  2.  
  3. type part_sf = array[0..4,0..3] of pointer;
  4.  
  5. var gm,gd,m,n:integer;
  6. size:word;
  7. schermo:part_sf;
  8.  
  9. begin
  10. initgraph(gm,gd,'');
  11. setcolor(11);      
  12. line(0,0,69,479);
  13. setcolor(14);
  14. rectangle(10,10,50,30);
  15. rectangle(10,110,150,30);
  16. rectangle(10,210,350,30);
  17. circle(500,400,50);
  18. circle(500,0,50);
  19. readln;
  20.  
  21. for m:=0 to 3 do
  22. begin
  23. for n:=0 to 2 do
  24. begin
  25. rectangle(m*160,n*160,m*160+160,n*160+160);
  26. size:=imagesize(m*160,n*160,m*160+160,n*160+160);
  27. getmem(schermo[m,n],size);
  28. getimage(m*160,n*160,m*160+160,n*160+160,schermo[m,n]^);
  29. end;
  30. end;
  31.  
  32. readln;
  33. clearviewport;
  34. readln;
  35.  
  36. for m:=0 to 3 do
  37. for n:=0 to 2 do
  38. putimage(m*160,n*160,schermo[m,n]^,0);
  39.  
  40. for m:=0 to 3 do
  41. begin
  42. for n:=0 to 2 do
  43. begin
  44. size:=imagesize(m*160,n*160,m*160+160,n*160+160);
  45. freemem(schermo[m,n],size);
  46. end;
  47. end;
  48.  
  49. readln;
  50. closegraph;
  51.  
  52. end.



Grazie in anticipo.

Ultima modifica effettuata da giulioscatto il 03/08/2009 alle 9:58
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:24
Lunedì, 03/08/2009
Testo quotato

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

Codice sorgente - presumibilmente Pascal

  1. Ev: TEvent;
  2.  
  3. [...]
  4.  
  5. Ev.What := EvNothing;
  6. InitEvents;
  7. ShowMouse;
  8.  
  9. [...]
  10.  
  11. GetMouseEvent(Ev);
  12.  
  13. Case Ev.What of
  14.      evMouseDown: Write('MouseDown ');
  15.      evMouseUp  : Write('MouseUp ');
  16.      evMouseMove: Write('MouseMove ');
  17.      evMouseAuto: Write('MouseAuto ');
  18.     end;
  19.  
  20. ShowMouse;
  21.  
  22. [...]



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.

Testo quotato



Grazie in anticipo.



Prego, spero di essere stato abbastanza chiaro.

Ciao. :k:

Luigi

Ultima modifica effettuata da gigisoft il 03/08/2009 alle 12:38
PM Quote
Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 14:17
Lunedì, 03/08/2009
Testo quotato

Postato originariamente da gigisoft:

Testo quotato

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

Codice sorgente - presumibilmente Pascal

  1. Ev: TEvent;
  2.  
  3. [...]
  4.  
  5. Ev.What := EvNothing;
  6. InitEvents;
  7. ShowMouse;
  8.  
  9. [...]
  10.  
  11. GetMouseEvent(Ev);
  12.  
  13. Case Ev.What of
  14.      evMouseDown: Write('MouseDown ');
  15.      evMouseUp  : Write('MouseUp ');
  16.      evMouseMove: Write('MouseMove ');
  17.      evMouseAuto: Write('MouseAuto ');
  18.     end;
  19.  
  20. ShowMouse;
  21.  
  22. [...]



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.

Testo quotato



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:

Codice sorgente - presumibilmente Delphi

  1. uses graph,crt,mouse;
  2. type icon = array[0..11,0..18] of byte;
  3. var gm,gd,mx,my,oldmx,oldmy:integer;
  4.     oldicon:icon;
  5. const mouse_norm_icon : icon = ((8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,99,99),
  6.                       (99,8,15,15,15,15,15,15,15,15,15,15,15,15,15,15,8,99,99),
  7.                       (99,99,8,15,15,15,15,15,15,15,15,15,15,15,15,8,99,99,99),
  8.                       (99,99,99,8,15,15,15,15,15,15,15,15,15,15,8,99,99,99,99),
  9.                       (99,99,99,99,8,15,15,15,15,15,15,15,15,8,99,99,99,99,99),
  10.                       (99,99,99,99,99,8,15,15,15,15,15,15,15,15,8,8,99,99,99),
  11.                       (99,99,99,99,99,99,8,15,15,15,15,15,15,15,15,15,8,8,99),
  12.                       (99,99,99,99,99,99,99,8,15,15,15,15,8,8,15,15,15,15,8),
  13.                       (99,99,99,99,99,99,99,99,8,15,15,15,8,99,8,8,15,15,8),
  14.                       (99,99,99,99,99,99,99,99,99,8,15,15,8,99,99,99,8,8,99),
  15.                       (99,99,99,99,99,99,99,99,99,99,8,15,8,99,99,99,99,99,99),
  16.                       (99,99,99,99,99,99,99,99,99,99,99,8,8,99,99,99,99,99,99));
  17.  
  18. Procedure DrawIcon(x,y:integer; var ic : icon);
  19. var i,j: integer;
  20. begin
  21.   for j:=0 to 11 do
  22.     for i:=0 to 18 do
  23.       if ic[j,i] <> 99 then putpixel(x+j,y+i,ic[j,i]);
  24. end;
  25.  
  26. procedure GetIcon(x,y: integer; var geticon : icon);
  27. var i,j: integer;
  28. begin
  29.   for j:=0 to 11 do
  30.     for i:=0 to 18 do
  31.       geticon[j,i]:= getpixel(x+j,y+i);
  32. end;
  33.  
  34. procedure RefreshMouse;
  35. begin
  36. drawicon(oldmx,oldmy,oldicon);
  37. oldmx:=mx;
  38. oldmy:=my;
  39. geticon(mx,my,oldicon);
  40. drawicon(mx,my,mouse_norm_icon);
  41. end;
  42.  
  43. begin
  44. initgraph(gm,gd,'');
  45. rectangle(100,100,500,400);
  46. oldmx:=getmousex;
  47. oldmy:=getmousey;
  48. mx:=oldmx;
  49. my:=oldmy;
  50. repeat
  51. mx:=getmousex;
  52. my:=getmousey;
  53. if (mx <> oldmx) or (my <> oldmy) then Refreshmouse;
  54. oldmx:=mx;
  55. oldmy:=my;
  56. until keypressed;
  57.  
  58. readln;
  59. closegraph;
  60. end.


PM Quote
Avatar
giulioscatto (Normal User)
Rookie


Messaggi: 37
Iscritto: 03/08/2009

Segnala al moderatore
Postato alle 14:46
Lunedì, 03/08/2009
Ho risolto il problema! Grazie a tutti! :yup::hail::)

PM Quote