|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2010
Messaggi: 38
|
[C#] Form Personalizzata
Salve a tutti!
Questa è la prima discussione che inserisco in questo forum e ne approfitto per salutare e ringraziare chiunque mi risponderà. Vorrei creare una form con gli angoli smussati...piu o meno come quelli di una tessera...sanitaria...del codice fiscale... So benissimo che non è una cosa facile...ma se fosse possibile avere una breve guida, o un codice gia compilato e funzionate ve ne sarei infinitamente grato... Utilizzo C# e le mie conoscenze sono quelli di un ragazzo di quarta informatici... Vi ringrazio anticipatamente! Aspetto fiducioso... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2000
Messaggi: 886
|
__________________
1986/2008 - 22 anni di rabbia cancellati in un giorno. Adesso passeranno altri 22 anni.. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
"CreateRoundRectRgn" ? E non mi piace nemmeno il consiglio di quel tizio : override di OnPaint ?! Ma no, basta disegnarla una volta sola, la Form, alla sua creazione. Codice:
Io risolverei così :
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Disegna();
}
//Selezione e mouse
private bool selezione = false;
private int eXSel = 0;
private int eYSel = 0;
private void Disegna()
{
int rectArcoWidth = 60;
int rectArcoHeight = 60;
System.Drawing.Drawing2D.GraphicsPath contorno = new System.Drawing.Drawing2D.GraphicsPath();
Graphics G = this.CreateGraphics();
contorno.StartFigure();
contorno.AddLine(rectArcoWidth / 2, 0, this.Width - rectArcoWidth / 2, 0);
contorno.AddArc(this.Width - rectArcoWidth, 0, rectArcoWidth, rectArcoHeight, -90, 90);
contorno.AddLine(this.Width, rectArcoHeight / 2, this.Width, this.Height - rectArcoHeight / 2);
contorno.AddArc(this.Width - rectArcoWidth, this.Height - rectArcoHeight, rectArcoWidth, rectArcoHeight, 0, 90);
contorno.AddLine(this.Width - rectArcoWidth / 2, this.Height, rectArcoWidth / 2, this.Height);
contorno.AddArc(0, this.Height - rectArcoHeight, rectArcoWidth, rectArcoHeight, 90, 90);
contorno.AddLine(0, this.Height - rectArcoHeight / 2, 0, rectArcoHeight / 2);
contorno.AddArc(0, 0, rectArcoWidth, rectArcoHeight, 180, 90);
contorno.CloseFigure();
Region R = new Region (new Rectangle(0, 0, this.Width , this.Height));
R.Intersect(contorno);
this.Region = R;
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
this.selezione = true;
eXSel = e.X;
eYSel = e.Y;
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (this.selezione==true)
{
this.Left -= (this.eXSel - e.X);
this.Top -= (this.eYSel - e.Y);
}
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
this.selezione = false;
}
}
2. C'ho già messo il codice per spostarla con il mouse. 3. A quanto sono bravo. |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Mar 2010
Messaggi: 38
|
No no!
Ma che bravo! Tu sei un grande! Grazie 1000, veramente MarcoGG grazie cosi Chiaramente anche a atragon per la disponibilità! Veramento non potevo chiedere di meglio! |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
nel metodo Disegna() la riga di codice : Codice:
Graphics G = this.CreateGraphics(); |
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Mar 2010
Messaggi: 38
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Sep 2000
Messaggi: 886
|
Quote:
__________________
1986/2008 - 22 anni di rabbia cancellati in un giorno. Adesso passeranno altri 22 anni.. |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
@calo182 : possiamo continuare qui.
Piccola parentesi : ragazzi, lo ripeto per la N-esima volta, non fatemi in pvt richieste che potreste tranquillamente fare in chiaro in un thread... Pulsante ellittico, o comunque diciamo non rettangolare : E' semplice, ad esempio con una Label ( che ha l'evento Click() come il Button, e che può essere perfettamente flat, senza bordi o ombreggiature... ). La label può essere creata e aggiunta alla Form a design. Anche qui, come per il caso precedente, diffidare di tutti quei "tutorial" che raccomandano cose come l'override dell'evento Paint, o peggio ancora l'accesso ad API esterne. Il semplice ridisegno dei controlli va fatto una volta sola, e può essere effettuato nell'evento Load della Form : Codice:
//Ridisegno di label1
System.Drawing.Drawing2D.GraphicsPath contorno = new System.Drawing.Drawing2D.GraphicsPath();
contorno.StartFigure();
contorno.AddEllipse(0, 0, label1.Width, label1.Height);
contorno.CloseFigure();
Region R = new Region(new Rectangle(0, 0, label1.Width, label1.Height));
R.Intersect(contorno);
label1.Region = R;
label1.Cursor = Cursors.Hand;
Basta solo usare l'evento Click() : Codice:
private void label1_Click(object sender, EventArgs e)
{
}
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Mar 2010
Messaggi: 38
|
Grazie 1000 ancora una volta, ma che valori devo cambiare per restringere io allargare il bottone?
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Semplice, vai ad agire da codice su label1.Width e label1.Height. Considera che l'ellisse che in questo caso sarà la Region del controllo, è sempre inscritta nel Rectangle originario del controllo stesso.
|
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Mar 2010
Messaggi: 38
|
èèèèèèèèèèèè gia!
Grazie! |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Sono sicuro che ci troveresti spunti parecchio interessanti.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
A maggior ragione se qualcuno mi chiede un consiglio sullo shaping di Forms e Controlli, preferibilmente senza uscire dal Windows Forms secco, come in questo caso, ci vado a nozze. Il fatto è che, secondo l'idea comune, sembra che GDI+ sia pesante, e lo credo bene, se c'è una marea di gente in giro che consiglia tecniche come quelle. Andare a scrivere nel Paint() può portare una Form ad essere inutilizzabile, e nel 90% dei casi non è affatto necessario. Cmq, prima o poi mi ci butterò, anche su WPF... |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:39.




















