Frage

Ich habe eine .net MDI-Anwendung in vb.net geschrieben. Ich versuche, eine Form zu programmieren, dass der Benutzer ein Sonderzeichen wählen wie °, μ, ², ³, ɑ und so weiter kann und hat das Zeichen eingefügt in dem, was Steuerung fokussiert war vor ihr das Formular über eine Einführung Hot-Key oder das Hauptmenü in der übergeordneten MDI.

Der einfache Weg, dies zu tun wäre, um herauszufinden, welche Steuerung auf der MDI Child Form fokussiert wurde, wenn das Charakter-Auswahl-Formular aufgerufen wird, aber ich kann keine Informationen finden, wie dies zu tun.

Irgendwelche Ideen?

War es hilfreich?

Lösung 3

einen einfacheren Weg gefunden -

[Parent Form].ActiveMdiChild.ActiveControl

Andere Tipps

Sieht aus wie die WM_SETFOCUS Nachrichten kommen nicht durch .... Meine schlecht. Ich bin mir ziemlich sicher, dass sie in der GetFocus evertime eine Nachricht kam und speichern Sie den Griff der Steuerung, die den Fokus hat.

Der erste Codeabschnitt ist die Filterklasse und der zweite Codeabschnitt ist der Testcode.



    public class LastFocusedControlFilter : IMessageFilter
    {
        [DllImport("user32")]
        private static extern IntPtr GetFocus();

        private IntPtr? _lastCtrl;
        private readonly Control _ctrlToIgnore;

        public LastFocusedControlFilter(Control controlToIgnore)
        {
            _ctrlToIgnore = controlToIgnore;
        }

        public bool PreFilterMessage(ref Message m)
        {
            if (!_ctrlToIgnore.IsHandleCreated || _ctrlToIgnore.Disposing || _ctrlToIgnore.IsDisposed)
            {
                return false;
            }
            IntPtr handle = GetFocus();
            if (handle != _ctrlToIgnore.Handle)
            {
                _lastCtrl = handle;
            }
            return false;
        }

        public Control GetLastFocusedControl()
        {
            return _lastCtrl.HasValue ? Control.FromHandle(_lastCtrl.Value) : null;
        }
    }
static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        using (Form form = new Form())
        {
            Action resetBackColor = null;
            for (int i = 0; i < 10; i++)
            {
                TextBox textBox = new TextBox();
                resetBackColor += delegate { textBox.BackColor = Color.White; };
                textBox.Text = ((char)('a' + i)).ToString();
                textBox.Location = new Point(0, textBox.Height * i);
                form.Controls.Add(textBox);
            }
            Button showTextButton = new Button();
            LastFocusedControlFilter msgFilter = new LastFocusedControlFilter(showTextButton);
            showTextButton.Dock = DockStyle.Bottom;
            showTextButton.Text = "Show text of last selected control";
            showTextButton.Click += delegate(object sender, EventArgs e)
             {
                 resetBackColor();
                 Control lastControl = msgFilter.GetLastFocusedControl();
                 if (lastControl == null)
                 {
                     MessageBox.Show("No control previous had focus.");
                 }
                 else
                 {
                     lastControl.BackColor = Color.Red;
                     MessageBox.Show(string.Format("Control of type {0} had focus with text '{1}'.", lastControl.GetType(), lastControl.Text));
                 }
             };
            form.Controls.Add(showTextButton);

            Application.AddMessageFilter(msgFilter);
            Application.Run(form);
        }
    }
}

Fügen Sie ein IMessageFilter und Monitor für Windows-Nachrichten wie WM_SETFOCUS oder < a href = "http://msdn.microsoft.com/en-us/library/ms646274%28VS.85%29.aspx" rel = "nofollow noreferrer"> WM_ACTIVATE . Sie können verwenden Control.FromHandle IntPtrs zu .NET-Steuerelemente zu konvertieren.

Sie können eine Klasse wie folgt zu Ihrem Projekt hinzufügen:

public class FocusWatcher
{
    private static System.Windows.Forms.Control _focusedControl;
    public static System.Windows.Forms.Control FocusedControl
    {
        get
        {
            return _focusedControl;
        }
    }

    public static void GotFocus(object sender, EventArgs e)
    {
        _focusedControl = (System.Windows.Forms.Control)sender;
    }
}

Dann wird für jede Kontrolle auf jedem Formular, das Sie ein Kandidat für die „zuletzt orientierte Steuerung“ sein wollen, würden Sie dies tun:

textBox1.GotFocus += FocusWatcher.GotFocus;

und dann FocusWatcher.FocusedControl Zugriff auf die zuletzt orientierte Kontrolle zu bekommen. Überwachen von Nachrichten funktioniert, aber Sie müssen Nachrichten ignorieren, die Sie nicht wollen (wie WM_ACTIVATE aus dem MDI-Formular).

Sie können alle Steuerelemente in jeder Form durchlaufen und die Prozedur für das Ereignis GotFocus hinzufügen, aber sicherlich gibt es Kontrollen, die Sie nicht will dies für (wie Tasten, zum Beispiel). Sie könnten stattdessen durchlaufen und nur die Handler für Textfelder hinzuzufügen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top