[C#] Window maximized event abfangen

Variante 1:

private void Form1_SizeChanged(object sender, EventArgs e)
{
	if (this.WindowState == FormWindowState.Maximized)
	{
		...
	}
}

Variante 2:

protected override void WndProc(ref Message m)
{
	if ((UInt32)m.Msg == Constant.WM_SYSCOMMAND)
	{
		switch ((UInt32)m.WParam)
		{
			case Constant.SC_MAXIMIZE:
                break;
			case Constant.SC_RESTORE:
                break;
			default:
				break;
		}
	}
	base.WndProc(ref m);
}

Universeller Eingabedialog, ähnlich Borland Delphi InputQuery

  • Anwendungsbeispiele
// einfacher string input
string currentvalue = "test";

InputQuery iq = new InputQuery();
if (iq.ShowDlg("Please type something", "Value:", ref currentvalue, false, 32))
{
    string newval = currentvalue;
}

// einfacher floating point input
string currentvalue = "3.14";

InputQuery iq = new InputQuery();
if (iq.ShowDlg("Please type something", "Value:", ref currentvalue, true, -1))
{
    double newval = double.Parse(currentvalue);
}
  • Quellcode des Dialoges:
// Objekte und deren Eigenschaften, die sich auf dem Formular befinden müssen:
//
// lblValue - ein Label, welches vor der TextBox als Bezeichner steht
// tbValue - eine TextBox zur Eingabe
// tbValue.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbValue_KeyPress);
// btnOk - OK-Button
// btnOk.DialogResult = System.Windows.Forms.DialogResult.OK;
// btnCancel - Abbrechen-Button
// btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
// this.AcceptButton = this.btnOk;
// this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
// this.Name = "InputQuery";

using System.Globalization;
using System.Windows.Forms;

/// <summary->
/// freeware helper class for recreating Borland Deplhi InputQuery-Dialog
/// (W) 2011 by admin of codezentrale.6x.to
/// </summary->
public partial class InputQuery : Form
{
    private const int MAX_TEXTBOX_STR_LENGTH = 32767;
    private string ALLOWED_FP_INPUT_CHARS = "0123456789" + NumberFormatInfo.CurrentInfo.NumberDecimalSeparator + "\b";
    private bool _checkdouble = false;

    public InputQuery()
    {
        InitializeComponent();
    }
    /// <summary->
    /// Shows a little input-dialog
    /// </summary->
    /// <param name="dlgcaption"->dialog caption</param->
    /// <param name="lbl"->label text</param->
    /// <param name="value"->input value</param->
    /// <param name="checkdouble"->if input is a floating-point, check for correct format and decimalseparator</param->
    /// <param name="maxstringlength"->if input is a regular string, set maxlenght here, otherwise "-1"</param->
    /// <returns->true if button 'Ok' is pressed</returns->
    public bool ShowDlg(string dlgcaption, string lbl, ref string value, bool checkdouble, int maxstringlength)
    {
        lblValue.Text = lbl;
        this.Text = dlgcaption;
        tbValue.Text = value;
        _checkdouble = checkdouble;
        tbValue.MaxLength = checkdouble ? MAX_TEXTBOX_STR_LENGTH : maxstringlength -> 0 ? maxstringlength : MAX_TEXTBOX_STR_LENGTH;
        tbValue.SelectAll();
        DialogResult blOk = this.ShowDialog();
        value = tbValue.Text;
        return (blOk == DialogResult.OK);
    }

    private void tbValue_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)(int)Keys.Enter)
        {
            this.DialogResult = DialogResult.OK;
        }
        else
            if (_checkdouble)
            {
                if (sender is TextBox)
                {
                    bool bNoDS = true;
                    TextBox tb = sender as TextBox;

                    if (e.KeyChar.ToString() == NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
                    {
                        bNoDS = (tb.Text.IndexOf(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) < 0);
                    }

                    if (bNoDS)
                    {
                        e.Handled = (ALLOWED_FP_INPUT_CHARS.IndexOf(e.KeyChar) < 0);
                    }
                    else
                    {
                        e.Handled = true;
                    }
                }
            }
    }
}

Schließen-Kreuz einer Form deaktivieren

/// <summary->
/// zum deaktivieren des Schließen-Kreuzes CreateParams-Methode der Form überschreiben
/// folgender Code muss in den Code des Formulars kopiert werden
/// </summary->
protected override CreateParams CreateParams
{
    get
    {
        const int CS_NOCLOSE = 0x200;

        CreateParams createParams = base.CreateParams;
        createParams.ClassStyle = createParams.ClassStyle | CS_NOCLOSE;

        return createParams;
    }
}

Mit TextRenderer die Breite eines stringbasierten Textes messen

using System.Windows.Forms;

/// <summary>
/// prüft, ob übergebener Text eine best. Länge in Pixeln nicht Überschreitet
/// </summary>
/// <param name="sText">der zur prüfende Text</param>
/// <param name="iLength">max. Textlänge in Pixeln</param>
/// <param name="ftTextFont">angewendete Schriftart</param>
/// <returns>true, else false</returns>
public bool FitsLength(string sText, int iLength, Font ftTextFont)
{
    return (TextRenderer.MeasureText(sText, ftTextFont).Width <= iLength);
}

Weiterführende Informationen zur Klasse TextRenderer: MSDN

MDIParent (Hauptformular) vom Schließen eines bestimmten MDIChilds benachrichtigen

// Funktion zum Erzeugen/Öffnen neuer MDIChilds vom Typ 'frmMDIChild'
// weißt u.a. Schließen-Eventhandler zu
private void OpenMdiChild_Click(object sender, EventArgs e)
{
    // neues MDI Kindfenster erzeugen
    frmMDIChild child = new frmMDIChild();
    // Parent des MDIChilds ist das Hauptformular
    child.MdiParent = this;
    // dem MDIChild den Eventhandler aus der Mainform (Parent) zuweisen
    child.FormClosed += new FormClosedEventHandler(child_FormClosed);
    // MDIChild anzeigen
    child.Show();
}

// Eventhandler im Hauptformular, wird beim Schließen des MDIChilds aufgerufen
void child_FormClosed(object sender, FormClosedEventArgs e)
{
    // Referenz auf das MDIChild-Fenster holen
    frmMDIChild child = sender as frmMDIChild;
    
    // ist der sender vom Typ frmMDIChild (es können ja bel. MDIChilds offen sein)
    if (child != null)
    {
        // ein wenig Infotext ausgeben
        MessageBox.Show("Folgendes Fenster wurde geschlossen: " + child.Text, "Info", MessageBoxButtons.OK);
    }
}

Tastendruck abfragen (KeyDown, KeyPress)

// KeyDown
private void MyForm_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up: // CRSR hoch
            break;
        case Keys.Down: // CRSR runter
            break;
        case Keys.Delete: // ENTF
            break;
        case Keys.Enter: // Enter
            break;
        case Keys.Escape: // ESC
            break;
        default:
            break;
    }
}

// KeyPress
private void MyForm_KeyPress(object sender, KeyPressEventArgs e)
{
    switch (e.KeyChar)
    {
        case (char)(int)Keys.Up: // CRSR hoch
            break;
        case (char)(int)Keys.Down: // CRSR runter
            break;
        case (char)(int)Keys.Delete: // ENTF
            break;
        case (char)(int)Keys.Enter: // Enter
            break;
        case (char)(int)Keys.Escape: // ESC
            break;
        default:
            break;
    }
}

MDI Basiswissen

MDI Basiswissen

  1. MDI-Mainform
    • Es muß immer ein MDI Hauptformular (MdiContainer) definiert werden
    • dazu muss die Eigenschaft des entsprechende Formulars gesetzt werden: IsMdiContainer = True
  2. MDI-Childs
    • Projektbaum rechtsklicken->Hinzufügen->Windows Form->Windows Form
    • Form nach eingenem Wunsch designen, benennen und speichern
  3. MDI-Childs anzeigen
  4. // Funktion in der MDI-Mainform
    private void miShowMDI_Click(object sender, EventArgs e)
    {
        // Fenster aus designter Fensterklasse erzeugen
        frmMDIForm MDIForm = new frmMDIForm();
        // MdiParent-Zuweisung ist wichtig,
        // da so FObjectTree zu einem MDI-Child wird
        // durch die Zuweisung wird das Child-Formular
        // automatisch im Hauptformular registriert
        MDIForm.MdiParent = this;
        // MDI-Fenster anzeigen
        MDIForm.Show();
    }