Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Consiglio Tecnico su ridimensionamento contorolli
Forum - C# / VB.NET - Consiglio Tecnico su ridimensionamento contorolli

Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:04
Giovedì, 07/11/2013
Salve ragazzi.

Durante la progettazione del mio programma ( Intendo lato codice non ide )

sto implementando un sistema per permettere all'utente di ridimensionare i controlli a runtime.

Vi elenco solo i membri necessari al funzionamento.

Codice sorgente - presumibilmente C++

  1. bool c_sel; //Se è selezionato un controllo
  2. bool ready; //Se il cursose si trova nell'area di ridimensionamento
  3. bool resize; //Abilito il ridimensionamento
  4.  
  5. Control SelectedObject; //Oggetto selezionato
  6.  
  7.  
  8.  
  9.  
  10.  private void Form_MouseDown(object sender, MouseEventArgs e)
  11.         {
  12.  
  13.             //Se e selezionato un oggetto
  14.             //Se e possibile ridimensionare l'oggetto
  15.             //Avvia il ridimensionamento
  16.             if (c_sel && ready) { resize = true; }
  17.  
  18.  
  19.         }
  20.  
  21.  
  22.  
  23. private void Form_MouseMove(object sender, MouseEventArgs e)
  24.         {
  25.  
  26.             //Ridimensionare i controlli
  27.             if (c_sel)
  28.             {
  29.                 if (e.X > ((Control)SelectedObject).Location.X - 5 && e.X < ((Control)SelectedObject).Location.X + 5 &&
  30.                     e.Y > ((Control)SelectedObject).Location.Y-5 && e.Y < ((Control)SelectedObject).Location.Y+5)
  31.                 {
  32.                     Cursor = Cursors.SizeNWSE;
  33.                     ready = true; //Abilito la possibilità di ridimensionare
  34.                 }
  35.                 else
  36.                 {
  37.                     Cursor = Cursors.Arrow;
  38.                     ready = false; //disabilito la possibilità di ridimensionare
  39.                 }
  40.             }
  41.  
  42.             //Ridimensionamento
  43.             if (resize)
  44.             {
  45.                 Cursor = Cursors.SizeNWSE;
  46.                 ((Control)SelectedObject).Width = e.X;
  47.                 ((Control)SelectedObject).Height = e.Y;
  48.                 ((Control)SelectedObject).Location = new Point(((Control)SelectedObject).Width, ((Control)SelectedObject).Height);
  49.  
  50.             }
  51.  
  52.         }
  53.  
  54.         private void Form_MouseUp(object sender, MouseEventArgs e)
  55.         {
  56.             resize = false;
  57.         }





Il problema semplice che ho e al void Mouse Move, il tutto funziona regolarmente
ma quello che vorrei ottenere e un effetto tipo Visual Studio.

Se infatti provo a ridimensionare il controllo esso si ridimensiona in entrambi i 4 lati.


Codice sorgente - presumibilmente C# / VB.NET

  1. //Ridimensionamento
  2.             if (resize)
  3.             {
  4.                 Cursor = Cursors.SizeNWSE;
  5.                 ((Control)SelectedObject).Width = e.X;
  6.                 ((Control)SelectedObject).Height = e.Y;
  7.                 ((Control)SelectedObject).Location = new Point(((Control)SelectedObject).Width, ((Control)SelectedObject).Height);
  8.  
  9.             }




A runtime, quando l'oggetto è selezionato appaiono i rettangolini come in visual studio sull'oggetto per permettere appunto di ridimensionare.
Questa porzione dovrebbe ridimensionare il controllo partendo da:

Alto / Sinistra

+-----------
|                |
|_________|

e rimanere fermo in controllo in basso a destra.
ovviamente il mio codice non funziona come dovrebbe, perche vengono ridimensionati tutti e 4 lati.
e di questo sono consapevole.

Conoscete un modo per far questo?
Ovvero ridimensionare partendo da NW ma rimanendo fermo SE.


PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 2:49
Martedì, 12/11/2013
prova a scrivere così nella MouseMove:

Codice sorgente - presumibilmente C++

  1. int DiffX = ((Control)SelectedObject).Location.X - e.X;
  2. int DiffY = ((Control)SelectedObject).Location.Y - e.Y;
  3.  
  4. if ((Abs(DiffX) > 5) && (Abs(DiffX) > 5))
  5.    {
  6.  
  7. [...]
  8.  
  9. if (resize)
  10.    {
  11.      ((Control)SelectedObject).Location.X = e.X;
  12.      ((Control)SelectedObject).Location.Y = e.Y;
  13.      ((Control)SelectedObject).Width += DiffX;
  14.      ((Control)SelectedObject).Height += DiffY;
  15.    }



Ciao. :k:


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:58
Martedì, 12/11/2013
scusami gigi cosa sarebbe Abs?

Per il resto del calcolo funziona benissimo. grazie mille gigi :D

Ultima modifica effettuata da Thejuster il 12/11/2013 alle 11:05


PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 12:19
Martedì, 12/11/2013
Testo quotato

Postato originariamente da Thejuster:

scusami gigi cosa sarebbe Abs?

Per il resto del calcolo funziona benissimo. grazie mille gigi :D



Ma un giro su Google era troppo faticoso?
Comunque Abs() calcola il valore assoluto.

Ciao. :k:


Le cose si fanno per bene o non si fanno affatto
PM Quote