C# - Lavorare con i form
C#
Tips vari
- Per avere un form di tipo MDI:
Impostare la proprietà 'IsMdiContainer = True'.
- Uscire dal programma:
this.Close();
- Larghezza della barra di scorrimento:
int i = System.Windows.Forms.SystemInformation.VerticalScrollBarWidth;
- Leggere la risoluzione dello schermo:
int Width = Screen.PrimaryScreen.Bounds.Width;
int Height = Screen.PrimaryScreen.Bounds.Height;
int Height = Screen.PrimaryScreen.Bounds.Height;
Aprire un form figlio di un form MDI
- Impostare nel form MDI la proprietà 'IsMdiContainer = true'.
- Disegnare e salvare il form, per esempio 'Form1'.
- Dichiarare una variabile a livello del form MDI:
Form1 f1;
- Aggiungere il codice seguente all'evento desiderato, per esempio al click di un bottone.
- Il codice seguente permette di ottenere un'unica istanza del form.
- Al primo click, il form è Null; perciò il programma entra nell'if e viene istanziato un nuovo oggetto form.
- Appena il form viene chiuso, non è Null ma è Disposed. Perciò il programma entra nell'if tramite la seconda condizione.
if (f1 == null || f1.IsDisposed)
{
f1 = new Form1();
f1.MdiParent = this;
f1.StartPosition = FormStartPosition.Manual;
f1.Location = new Point(0, 0);
f1.Show();
}
else
f1.Focus();
{
f1 = new Form1();
f1.MdiParent = this;
f1.StartPosition = FormStartPosition.Manual;
f1.Location = new Point(0, 0);
f1.Show();
}
else
f1.Focus();
- Il codice precedente funzione purché sia eseguito dal form MDI principale; infatti nella proprietà "MdiParent" è indicata l'istanza della MDI form.
- Se si ha la necessità di aprire un form figlio della form MDI a partire da un altro form, si può utilizzare il seguente codice.
Form1 f1 = new Form1();
f1.MdiParent = Application.OpenForms.OfType<frmMain>().FirstOrDefault();
f1.Show();
Aprire un form modale
- Disegnare e salvare il form, per esempio 'frmSiNo'.
frmSiNo frmMessaggio = new frmSiNo();
frmMessaggio.ShowDialog();
frmMessaggio.ShowDialog();
Impostare il BackColor in un form MDI
- Non è sufficiente (ma è necessario) impostare la proprietà BackColor del Form in fase di progettazione.
- Occorre anche aggiungere il seguente codice, per esempio nell'evento Load del form.
MdiClient ctlMDI;
foreach (Control ctl in this.Controls)
{
try
{
// Attempt to cast the control to type MdiClient.
ctlMDI = (MdiClient) ctl;
// Set the BackColor of the MdiClient control.
ctlMDI.BackColor = this.BackColor;
}
catch (InvalidCastException exc)
{
// Catch and ignore the error if casting failed.
}
}
Ciclare tra tutti i form aperti
- Per ciclare tra tutti gli oggetti di tipo form, aperti dal programma, utilizzare il foreach seguente.
{
MessageBox.Show(f.Name);
}
Cambiare form di avvio di un programma
- Aprire il file 'Program.cs'.
- Modificare la riga seguente impostando il form desiderato.
- Se il form si trova in una cartella, essa va indicata.
Application.Run(new Cartella.frmNuova());
Intercettare la pressione dei tasti dal form
- Spesso è utile intercettare alcuni tasti premuti da un utente, ad esempio per abilitare o disabilitare certi menu o certe funzioni.
- La prima cosa da fare è far sì che i tasti premuti siano elaborati prima dalla form anziché dal controllo che ha il focus. Per ottenere questo, impostare la seguente proprietà (in progettazione o nel Form_Load(), è lo stesso).
KeyPreview = true;
- Poi bisogna aggiungere l'evento Form_KeyDown() e intercettare uno o più tasti con eventuali 'modificatori', quali ad esempio i tasti 'Control', 'Alt' e 'Shift'.
- Nell'esempio seguente viene intercettata la pressione di 'Control + U'.
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.U)
{
if (ModifierKeys.HasFlag(Keys.Control))
{
MessageBox.Show("Hai premuto Control-U!");
}
}
}
Annullare la chiusura di un form
- In alcune situazioni è utile controllare che un utente non chiuda il form cliccando sulla 'X' nell'angolo in alto a destra.
- Per annullare la chiusura del form è sufficiente aggiungere una riga di codice nell'evento Form_FormClosing().
- Nell'esempio seguente, viene annullata la chiusura del form se il valore di una CheckBox è Checked.
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (checkBox1.Checked)
{
e.Cancel = true;
}
}
Il problema dei form e dei font sfocati
- Sviluppando applicazioni Windows Form per Windows 10, spesso ci si imbatte nel problema che i form in esecuzione, "sembrano" diversi da come sono stati creati nell'ambiente di progettazione.
- Un esame più accurato misurando le dimensioni dei controlli impostate nell'ambiente di progettazione e le dimensioni degli stessi controlli quando il programma è in esecuzione, mostra che possono esserci notevoli differenze sia per quello che riguarda la dimensione di controlli che per quello che riguarda la sfocatura dei controlli e delle scritte (Labels).
- Ecco un esempio.
- L'immagine seguente rappresenta un form così come lo si vede in ambiente di progettazione.
- Quando si va in esecuzione, quello che si vede è l'immagine seguente.
- Si nota abbastanza chiaramente che le due Label appaiono molto sfocate. In molti casi inoltre la form assume delle dimensioni di molto superiori a quello che ci aspetta.
- Per risolvere il problema, ho trovato nella rete questa soluzione.
- Prima di tutto, impostare per tutt i form la seguente proprietà:
AutoScaleMode = Dpi
- Poi, modificare il Program.cs, aggiungendo le poche righe di codice indicate nei commenti.
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// Per non sfocare i caratteri del progetto. Parte 1/2.
if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
// Per non sfocare i caratteri del progetto. Parte 2/2.
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
}
- Il risultato che si ottiene è ora esattamente quello che ci si aspetta.