Прозрачное окно (или рисование на экране) без захвата мыши - PullRequest
9 голосов
/ 25 ноября 2008

В приложении, которое я кодирую, я бы хотел, чтобы появилось предупреждающее сообщение, которое отображает большое полупрозрачное предупреждающее сообщение, не влияющее на работу пользователей. По сути, я постепенно добавлю сообщение, но никогда не установлю его непрозрачность на 1, и я хочу, чтобы пользователь мог щелкнуть «через» сообщение, как будто его там нет.

Я начал с использования всегда в верхнем окне, установив стиль окна на none и установив для фона и ключа прозрачности белый цвет. В этом окне есть метка с крупным шрифтом, которая содержит предупреждающее сообщение (позже я, вероятно, переопределю событие рисования и нарисую сообщение, используя GDI). Я использую таймер, чтобы добавить сообщение, набрав его непрозрачность перед тем, как снова вернуть его вниз. Он работает нормально, так как фокус не украден из каких-либо приложений, но прозрачная форма фиксирует события мыши, а не форму под ней (на самом деле большая часть прозрачной формы не захватывает события мыши, только текст метки делает ).

Кроме того, я не уверен, что это оптимальный подход, может быть, мне следует как-то рисовать прямо на экране.

Как мне улучшить вещи.

1 Ответ

10 голосов
/ 25 ноября 2008

Переопределите свойство CreateParams в своем классе Form и убедитесь, что установлен расширенный стиль WS_EX_NOACTIVATE. Моя выглядит так:

protected override CreateParams CreateParams
{
  get
  {
    CreateParams baseParams = base.CreateParams;

    baseParams.ExStyle |= ( int )(
      Win32.ExtendedWindowStyles.WS_EX_LAYERED |
      Win32.ExtendedWindowStyles.WS_EX_TRANSPARENT |
      Win32.ExtendedWindowStyles.WS_EX_NOACTIVATE |
      Win32.ExtendedWindowStyles.WS_EX_TOOLWINDOW );

    return baseParams;
  }
}

Значения для ExtendedWindowStyles, использованные выше:

WS_EX_LAYERED = 0x00080000,
WS_EX_NOACTIVATE = 0x08000000,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_TRANSPARENT = 0x00000020,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...