Discussione sull’articolo "Studiare la classe CCanvas. Come disegnare oggetti trasparenti"

 

Il nuovo articolo Studiare la classe CCanvas. Come disegnare oggetti trasparenti è stato pubblicato:

La solida grafica scomoda delle medie mobili non ti va più bene? Vuoi disegnare qualcosa di più bello di un semplice rettangolo riempito di colore nel tuo terminale? Puoi disegnare una grafica più accattivante nel tuo terminale. Questo può essere implementato tramite la classe CСanvas, che viene utilizzata per creare grafiche personalizzate. Con questa classe è possibile implementare la trasparenza, fondere i colori e produrre l'illusione della trasparenza mediante la sovrapposizione e la fusione dei colori.

Viviamo in un mondo tridimensionale e percepiamo tutto ciò che ci circonda in tre dimensioni. Eravamo soliti vedere o persino sentire la tridimensionalità. Nel mondo tridimensionale possiamo capire quale degli oggetti è più vicino a noi.

Alcuni oggetti potrebbero essere traslucidi. Ad esempio, prendi un bicchiere trasparente contenente un liquido traslucido su uno sfondo blu. Lo sfondo blu è visibile attraverso il vetro con il liquido. I dettagli di fondo dipendono dal grado di trasparenza del liquido.


 Fig.1 Visione comune della dimensionalità

Fig. 1 Vista comune della dimensionalità

Autore: Vladimir Karputov

 
Vladimir, non sono bravo con le tele. Ecco una domanda. C'è una tela. C'è un'etichetta di testo su di essa. Perché il terminale vede l'evento del clic sul marchio come un evento del clic sulla tela? È possibile risolvere questo conflitto in qualche modo?
 
denkir:
Vladimir, non sono bravo con le tele. Ecco una domanda. C'è una tela. Su di essa c'è un'etichetta di testo. Perché il terminale vede l'evento del clic sull'etichetta come un evento del clic sulla tela? È possibile risolvere questo conflitto in qualche modo?
Datemi il codice. Diamo un'occhiata.
 
denkir:
...

Esiste una proprietà per impostare la priorità di questo evento:

OBJPROP_ZORDER - Priorità dell'oggetto grafico che riceve l'evento di clic del mouse sul grafico (CHARTEVENT_CLICK). Per impostazione predefinita, il valore è impostato a zero durante la creazione, ma è possibile aumentare la priorità se necessario. Quando oggetti sovrapposti ricevono l'evento CHARTEVENT_CLICK, solo l'oggetto la cui priorità è più alta degli altri lo riceverà.

 

Ti invierò il codice più tardi. OBJPROP_ZORDER - per kanvas non può essere impostato...

Ho trovato la causa dell'elaborazione errata... Ci sono 2 tele, una sovrapposta all'altra. E c'è un'etichetta di testo in cima. Questo è ciò che OnChartEvent() non vede.

 
denkir:

Ti invierò il codice più tardi. OBJPROP_ZORDER - per kanvas non può essere impostato...

Ho trovato la causa dell'elaborazione errata... Ci sono 2 tele, una sovrapposta all'altra. E c'è un'etichetta di testo in cima. Questo è ciò che OnChartEvent() non vede.

Sì, invece. Si tratta di un oggetto normale come OBJ_BITMAP_LABEL o OBJ_BITMAP.

 
tol64:

È possibile. È un oggetto normale come OBJ_BITMAP_LABEL o OBJ_BITMAP.

Giusto. Grazie.

Per farlo, è necessario estrarre il nome dell'oggetto grafico vincolato e dargli priorità.

Ecco come funziona (estratto dal blocco di inizializzazione):

//--- creare la prima tela
   if(!myCanvas1.CreateBitmapLabel("My canvas1",_X,_Y,Width,Height,COLOR_FORMAT_ARGB_RAW)) 
     {
      Print("Error creating base canvas: ",GetLastError());
      return INIT_FAILED;
     }
//--- visualizzazione
   myCanvas1.Erase(XRGB(0x1F,0x1F,0x1F)); 
   myCanvas1.Update();
   string obj_name=myCanvas1.ChartObjectName();
   if(!ObjectSetInteger(0,obj_name,OBJPROP_ZORDER,0))
      return INIT_FAILED;
 

Ciao Vladimir,

Grazie per questo interessante articolo.

Nella tabella 3 c'è un piccolo errore.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 Bianco (sfondo)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Dovrebbe essere :
0000 0000 1111 1111 0000 0000
Verde
 
angevoyageur:

Ciao Vladimir,

Grazie per questo interessante articolo.

Nella tabella 3 c'è un piccolo errore.

С'255,0,255' 0xFF00FF 1111 1111 0000 0000 1111 1111


XOR
C'255,255,255' 0xFFFFFF 1111 1111 1111 1111 1111 1111 Bianco (sfondo)


=
С'0,255,0' 0x00FF00 1111 1111 1111 0000 0000 0000
Dovrebbe essere :
0000 0000 1111 1111 0000 0000
Verde
Спасибо за найденную ошибку.
 

La domanda è questa. Quale potrebbe essere la migliore implementazione per spostare il kanvas all'interno del grafico? Una sorta di metodo:

bool CUserCanvas::Move(int _new_x,int _new_y);
 
denkir:

La domanda è questa. Quale potrebbe essere la migliore implementazione per spostare il kanvas all'interno del grafico? Una sorta di metodo:

Qual è lo scopo dello spostamento? Sarebbe meglio ridisegnare il disegno sul kanvas?