Когда заставить форму мигать и перестать мигать? - PullRequest
1 голос
/ 21 сентября 2009

Я пишу программу для обмена мгновенными сообщениями, и у меня есть способ заставить форму мигать и перестать мигать ... вопрос в том, как ее реализовать?

Когда приходит сообщение, я могу установить мигание окна, но мне нужно убедиться, что оно не сфокусировано. Проверка фокусированного метода всегда возвращает false и поэтому мигает, даже когда форма открыта.

Кроме того, какое событие мне нужно обработать, чтобы оно не мигало? Когда пользователь щелкает форму, чтобы увеличить ее, или переключает фокус на форму, мне нужен способ ее остановки.

Какой лучший способ?

Ответы [ 4 ]

1 голос
/ 21 сентября 2009

Вы можете обрабатывать события Activated и Deactivate вашей формы и использовать их для изменения логического значения уровня формы, которое сообщит вашему коду, имеет ли ваша форма фокус или нет, например:

private bool _IsActivated = false;
private void Form1_Activated(object sender, EventArgs e)
{
    _IsActivated = true;
    // turn off flashing, if necessary
}
private void Form1_Deactivate(object sender, EventArgs e)
{
    _IsActivated = false;
}

Когда приходит сообщение, вы проверяете _IsActivated, чтобы определить, является ли ваша Форма уже активным окном, и включаете мигание, если это не так. В активированном событии вы выключите мигание, если оно включено.

Свойство Focused вашей формы всегда будет возвращать false, если оно имеет какие-либо элементы управления. Это свойство относится к тому, имеет ли рассматриваемый элемент управления (в данном случае к форме) фокус в форме вашего приложения , а не к тому, имеет ли само приложение фокус в Windows.

0 голосов
/ 21 сентября 2009

Есть несколько способов справиться с этим. Вероятно, проще всего было бы установить флаг, который вы устанавливаете всякий раз, когда форма мигает, поэтому его можно сбросить при повторной активации формы, например

Код для базовой формы окна IM

private bool IsFlashing;
....

// Code for IM windows
public void OnActivate(EventArgs e)
{
    if (IsFlashing)
    {
        // stop flash
        IsFlashing = false;
    }
}

public void Flash()
{
    // make flash
    IsFlashing = true;
}

Тогда, куда бы вы ни делали свой код для обработки нового сообщения, вам просто нужно проверить, является ли конкретное окно беседы (если вы обрабатываете несколько сообщений), на которое направлено сообщение, текущим активным:

public void OnNewMessage(AMessage msg)
{
    Form convoWindow = FindConvoWindow(msg.Sender);
    if (Form.ActiveForm == convoWindow)
    {
        // update the conversation text
    }
    else
    {
        convoWindow.Flash();
    }
}
0 голосов
/ 21 сентября 2009

Хорошо Focused должно быть свойство для проверки, поэтому вам нужно попытаться выяснить, почему это всегда возвращает false.

Что касается того, что событие слушать, то, вероятно, событие GotFocus, хотя это может не сработать, пока вы не сможете понять, что не так со свойством Focused.

0 голосов
/ 21 сентября 2009

Проверка, свернута ли форма или нет:

if (this.WindowState == FormWindowState.Minimized)
{
    MakeFormFlash();
}
else
{
    MakeFormStopFlash();
}

Событие, которое запускается при активации формы пользователем или кодом:

this.Activated += new EventHandler(Form_Activated);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...