Способ быстро показать / скрыть WinForms GUI C # - PullRequest
3 голосов
/ 30 января 2010

Я создаю приложение с многопоточностью. Я запустил GUI (Announce: Form) как отдельный поток.

Это окно будет очень минималистичным с одним полем ввода и, возможно, кнопкой. В другом потоке будет запущен Tcp Client, и когда он получит информацию от TcpServer, он должен передать то, что он получает в это поле ввода, и показать графический интерфейс (и самые верхние окна). Через пару секунд графический интерфейс должен спрятаться и дождаться следующего сообщения TCP и т. Д.

    public void setTextBox(string varText) {
        if (InvokeRequired) {
            textBox.BeginInvoke(new textBoxCallBack(setTextBox), new object[] {varText});
        } else {
            textBox.Text = varText;
        }
    }

Этот код используется для заполнения textBox из потока Tcp. Единственная проблема теперь - заставить окно показывать и прятаться правильно. Пробовал много решений, и всегда что-то не получалось. Как:

    private void windowStateChange(string varState) {
        if (InvokeRequired) {
            Invoke(new WindowStateChangeCallBack(windowStateChange), new object[] {varState});
        } else {
            if (varState == "Hide") {
                //Hide();
                // TopMost = false;
                //TopMost = varState != FormWindowState.Minimized;
            } else {
                //Show();
                //MessageBox.Show("TEST1");
            }
        }
    }

    public void windowStateChangeDiffrent(FormWindowState varState) {
        if (InvokeRequired) {
            Invoke(new WindowStateChangeCallBack(windowStateChange), new object[] {varState});
        } else {
            WindowState = varState;
           // Hide();
            TopMost = varState != FormWindowState.Minimized;
        }
    }

Что было бы лучше всего сделать для этого (и быстрее всего, если время имеет значение)?

Ответ 1, который, кажется, работает:

    private static void windowStateChange(string varState) {
        if (mainAnnounceWindow.InvokeRequired) {
            mainAnnounceWindow.BeginInvoke(new StateCallBack(windowStateChange), new object[] {varState});
        } else {
            if (varState == "Hide") {
                mainAnnounceWindow.Hide();
                mainAnnounceWindow.TopMost = false;
            } else {
                mainAnnounceWindow.Show();
                mainAnnounceWindow.TopMost = true;
            }
        }
    }

Что-нибудь плохое в этом?

Ответы [ 5 ]

1 голос
/ 30 января 2010

Создание формы скрытия с помощью form.Hide() не должно создавать проблем.

Однако я испытал, что повторение показа формы не всегда работает. Поэтому, если вы столкнулись с той же проблемой, вы можете использовать что-то вроде этого:

string RunningProcess = Process.GetCurrentProcess().ProcessName;
Process[] processes = Process.GetProcessesByName(RunningProcess);

int SW_SHOW = 5, SW_HIDE = 0, SW_RESTORE = 9, SW_SHOWNORMAL = 1;

    for (int a = 0; a < processes.Length; a++)
        {
         IntPtr hWnd = processes[a].MainWindowHandle;

         ShowWindowAsync(hWnd, SW_RESTORE);
         ShowWindowAsync(hWnd, SW_SHOWNORMAL);
         ShowWindowAsync(hWnd, SW_SHOW);
         SetForegroundWindow((int)hWnd);
        }

        //Required Win32 API imports           
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        static extern bool ShowWindowAsync(IntPtr windowHandle, int cmd);

        [System.Runtime.InteropServices.DllImportAttribute("User32.dll")]
        private static extern IntPtr SetForegroundWindow(int hWnd);
1 голос
/ 30 января 2010

вы можете попробовать

form.Hide();

но убедитесь, что вы показываете / скрываете форму от того же потока, который их создал

1 голос
/ 30 января 2010
this.Invoke(new MethodInvoker(this.hide()));
1 голос
/ 30 января 2010

Другим подходом было бы выставить события в вашем объекте потока TCP . Он может определять событие, такое как RecievedData(...), тогда графический интерфейс пользователя может подписаться на это событие и обновляться без необходимости каких-либо проверок InvokeRequired и т. Д.
Обновление: ссылка на учебник по событиям в C #
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

0 голосов
/ 30 января 2010

Form.Hide () - правильный способ скрыть форму. Я помню, что у меня были проблемы с Form.Show (), у меня есть смутная память о необходимости использовать Form.Activate (), а также для правильного восстановления формы.

Вы уже правильно справились с маршалингом потоков (InvokeRequired и Invoke). Вы также можете использовать Form.BeginInvoke (), который является асинхронной версией Form.Invoke. Это может быть быстрее.

...