Pagina personale di:
Carlo Vecchio
appunti di C#, R, SQL Server, ASP.NET, algoritmi, numeri
Vai ai contenuti

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;
 
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();

  • 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();
 
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.

   foreach (Form f in Application.OpenForms)
   {
       
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 frmNuova());
   
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.




© 2020 Carlo Vecchio
Torna ai contenuti