Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446

    [c#] windows application_disegnare un rettangolo

    Ho creato un nuovo oggetto nel mio form che sostanzialmente è una specie di righello.
    A fianco ho una listbox con una lista di immagini.
    Sostanzialmente vorrei riuscire con il drag & drop ogni volta che trascino un'immagine nel mio righello che si crei un rettangolo sopra il mio righello.
    Non so dove devo andare a mettere il codice per la creazione del rettangolo, perchè se lo metto come avevo fatto nel codice del drag & drop non riesco a creare niente, e se lo metto nella parte dove ho creato il mio righello usando la funzione


    protected override void OnPaint(PaintEventArgs pe)


    non riesco ad associarlo solo all'avento di drag & drop.
    Qualcuno sa come posso associare ad un evento la creazione di un oggetto???
    Se qualcuno sa darmi una mano gli sarei veramente grata!!!!
    Grazie cmq

  2. #2
    La prima idea che mi viene e' quella di aggiungere nell'esecuzione dell'evento di drag&drop l'invalidate del control.
    Questo dovrebbe forzare il Paint dell'oggetto e quindi di ridisegnare il rettangolo.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Come funzione l'invalidate?
    Cmq quello che vorrei io è che quando trascino un'immagine sul righello, in quel punto esatto, un paio di cm sopra, mi si crea un rettangolo.
    Quindi non devo ridisegnare un rettangolo, devo proprio crearlo ogni volta che faccio un drag & drop.

  4. #4
    Forse, dovresti abilitare l'evento DragOver del control che riceve il Drag&Drop.
    Questo evento viene chiamato quando ti stai muovendo sopra il control mentre stai facendo il drag&drop.
    In questo evento potresti abilitare un flag e chiamare l'invalidate del tuo control ctrl.invalidate() in modo da chiamare la funzione di paint.

    Il paint se ha il flag attivato disegna il rettangolo.

    E' giusto un'idea, bisognerebbe vedere implementato il codice etc. etc.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Si volevo già associarlo al drag over.
    Ma come funziona un flag?E come si abilita.
    Scusami, ma non è molto che sono dietro a ste cose e sono un po' ignorante

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    E quando faccio l'invalidate, mi sparisce il mio righello che ho disegnato prima?
    Perchè io voglio che mi rimanga quel componente.

  7. #7
    Un flag (bandiera ) e' una variabile solitamente booleana che viene posta a true/false a seconda.

    Nel tuo caso, potresti avere una proprieta' di tipo bool (il flag ) del tuo oggetto che viene abilitato a true dal dragEnter e messo a false dal dragLeave.
    Il metodo dragOver chiama l'invalidate.

    Nell'evento OnPaint, testi il flag per sapere se devi disegnare il rettangolo o meno.

    Una traccia di codice potrebbe essere questa.
    Ripeto traccia, perche' la sintassi non e' corretta e non compila !!!!

    codice:
    Class myForm : Form
    {
       [..]
       mycontrol_OnDragEnter(sender, event)
       {
          mycontrol.PaintRectangle = true;
       }
    
       mycontrol_OnDragLeave(sender, event)
       {
          mycontrol.PaintRectangle = false;
       }
    
       mycontrol_OnDragOver(sender,event)
       {
          mycontrol.Invalidate();
       }
      [..]
    }
    
    Public class mycontrol : controldacuideriva
    {
       private bool paintRectangle = false;
    
       public bool PaintRectangle
       {
          set { paintRectangle = value; }
       }
    
       private override OnPaint(...)
       {
           if (paintRectangle) Disegno il Rettangolo;
       }
    }

  8. #8
    Originariamente inviato da 83kiara83
    E quando faccio l'invalidate, mi sparisce il mio righello che ho disegnato prima?
    Perchè io voglio che mi rimanga quel componente.
    Certo perche' l'invalidate ridisegna il control.

    Quindi tu dei fare cosi' :

    codice:
       private override OnPaint(...)
       {
          base.OnPaint(this, e);     <---- Disegna il control
           if (paintRectangle) Disegna_il_Rettangolo();
       }

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    446
    Quindi ogni volta che c'è il drag enter io invalido il mio control e richiamo la funzione OnPaint
    e gli dico di ridisegnarmi il righello e in più di disegnarmi il rettangolo.Giusto?
    Ma non è che quando uso base.OnPaint non mi richiama quella del righello? Perchè io per il righello avevo definito un override void OnPaint(PaintEventArgs pe) e con il base non è che mi richiama l'OnPaint base e non quello del mio righello?

    E poi questa parte qui:

    Public class mycontrol : controldacuideriva
    {
    private bool paintRectangle = false;

    public bool PaintRectangle
    {
    set { paintRectangle = value; }
    }

    private override OnPaint(...)
    {
    if (paintRectangle) Disegno il Rettangolo;
    }
    }


    la posso mettere dopo
    protected override void OnPaint(PaintEventArgs pe)
    cioè dopo la funzione con cui ho creato il mio righello?

  10. #10
    La chiamata base.OnPaint() ridisegna il control.
    Successivamente chiami il tuo disegnarighello che disegna il righello sopra al control.

    Se non vuoi far disegnare la forma originale del control, allora non chiamare la base.OnPaint().

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.