Windows forms как сделать всплывающее окно

Обновлено: 04.07.2024

Обнаружилась проблема: "Всплывающее окно" не доступно, если сначала оно появилось, а затем была отображена модальная форма.
В примере ниже воспроизводится так:
1) Нажать кнопку "Show Popup!"
2) Нажать кнопку "Show Modal Form"
3) После этого "Всплывающее окно" не доступно

Если же сначала отобразить "Всплывающее окно", а затем модальную форму — то "Всплывающее окно" доступно.

Как сделать правильно всплывающие окна? Может есть другой способ?

Здравствуйте, nikda, Вы писали:

N>Если же сначала отобразить "Всплывающее окно", а затем модальную форму — то "Всплывающее окно" доступно.

Не могу понять как вы это сделали? Быстро нажать "Show popup" и потом "Show1" ? Сценарий не совсем такой как вы описали, т.к. в это случае модальный диалог показывается по сути поверх всплывающего окна.


Если теперь передавать в качестве owner модальное окно, то все должно быть ок.


При показе модального окна и нажатии на нем кнопки — показывается всплывающее окно, в котором можно нажимать крестик и т.д.

П.С.: Удаляйте bin и obj папки перед упаковкой в следующий раз.

Смысл всплывающего окна в том, что бы оно было доступно пользователю всегда, вне зависимости от на наличия или нет модальных окон.
В моём примере — это не получается.

Сделал как у Вы писали.

1) Кнопка "Show Popup!" — просто отображает Popup на несколько секунд (задаётся в поле Delays (ms)): popupNotifier1.Popup(this);
2) Кнопка "Show 1" — просто отображает модальное окно, которое блокирует Popup из первого шага

А нужно что бы Popup был доступен всегда.

Здравствуйте, nikda, Вы писали:

N>А нужно что бы Popup был доступен всегда.

2 решения:
1) уже написал в предущем посте (тестировал, работает) ассоциироваться с Form2 (передавать Popup хендл Form2). Не работает, если Popup начал всплывать, а тут Form2 открыли (Popup будет неактивным).
2) запускайте Popup в другом потоке (погуглите, в интернете полно материала по этому вопросу). В этом случае Popup вообще ничего общего с Form1 или Form2 не имеет.

Как отобразить всплывающую подсказку над кнопкой с помощью Windows Forms ?

ToolTip на самом деле является элементом управления WinForms, который обрабатывает отображение подсказок для нескольких элементов в одной форме.

Скажите, что ваша кнопка называется MyButton.

  1. Добавьте элемент управления ToolTip (в разделе «Общие элементы управления» на панели инструментов Windows Forms) в форму.
  2. Дай ему имя - скажи MyToolTip
  3. Установите для свойства «Подсказка на MyToolTip» MyButton (в разделе «Разное» в сетке свойств кнопки) текст, который должен отображаться при наведении на него курсора.

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

в вашем коде, чтобы показать всплывающую подсказку, и MyToolTip.Hide (MyButton), чтобы она снова исчезла.

хорошо, но вопрос: если у меня есть более одной кнопки в форме, мне нужно больше всплывающей подсказки, или я могу установить несколько описаний и кнопок для одной подсказки? Ваша форма нуждается только в одном элементе управления ToolTip - каждая кнопка может иметь различный текст справки (именно поэтому «Tooltip on MyToolTip» является свойством связанного элемента управления, а не самого элемента управления ToolTip) В простейшем случае лучше всего добавить подсказку в форму. Проблема: во время разработки пользовательского элемента управления у вас нет ссылки на родительскую форму. Решение: создайте объект всплывающей подсказки в элементе управления. Не думайте, что объект ToolTip обязательно прикреплен к форме.

Использование дизайнера форм:

  • Перетащите элемент управления ToolTip из панели инструментов на форму.
  • Выберите свойства элемента управления, на котором должна отображаться подсказка.
  • Найдите свойство ToolTip on toolTip1 (имя может не быть toolTip1, если вы изменили его имя по умолчанию).
  • Установите текст свойства в текст подсказки, который вы хотите отобразить.

Вы также можете установить подсказку программно, используя следующий вызов:

Вы можете использовать класс ToolTip:

Это идеальное решение, поскольку оно напрямую интегрируется с автоматически генерируемым кодом VS. Спасибо :) @DaveK Спасибо. Лучше так, потому что я могу определить все подсказки в одном месте Спасибо. Лучший и самый простой ответ на этот вопрос.

Для всплывающей подсказки по умолчанию это может быть использовано -

Ленивое и компактное хранение текста в свойстве Tag

Если вы немного ленивы и не используете свойство Tag элементов управления для чего-либо еще, вы можете использовать его для хранения текста всплывающей подсказки и назначить обработчики событий MouseHover всем таким элементам управления за один раз:

В этом случае всем кнопкам, имеющим строку в свойстве Tag, назначается событие MouseHover . Чтобы сохранить его компактность, событие MouseHover определяется внутри строки с помощью лямбда-выражения. В случае , если какая - либо кнопка парила будет иметь свой тег текст , назначенный на подсказку и показан на рисунке.

Как я могу сделать, что я вызову, "всплывающее окно" в WinForms?

Так как я использовал свое собственное слово "popup", позвольте мне привести примеры этого так называемого "всплывающего" окна:

a всплывающее окно (может выходить за пределы его родительской формы, не отображается на панели задач, не является модальным и не крадет фокус):

enter image description here

Окно всплывающее меню (может выходить за пределы его родительской формы, не отображается на панели задач, не является модальным и не крадет фокус):

enter image description here

a раскрывающееся окно (может выходить за пределы его родительской формы, не отображается на панели задач, не является модальным и не крадет фокус):

enter image description here

A главное меню (может простираться за пределы его родительской формы, не отображается на панели задач, не является модальным и не крадет фокус):

enter image description here

enter image description here

Атрибуты, которые я ищу в этом мифическом "всплывающем окне", заключаются в следующем:

    может расширять за пределами его родительской формы (т.е. не дочернее окно)
    не отображается в панели задач (т.е. эвристика окна, из которой должны появляться окна, не срабатывает, а также не имеет расширенного стиля окна WS_EX_APPWINDOW)
    не модальный (т.е. не отключает своего "владельца" )
    не крадет фокус
    всегда на вершине этого владельца
    не становится "активным" окном при взаимодействии (владелец остается активным)

Приложения Windows уже создают такие окна. Как я могу сделать это в приложении WinForms?

Связанные вопросы

    Как я могу достичь всего выше в собственном коде?
    Как создать всплывающее окно в Delphi?
    У меня есть этот собственный код, чтобы показать "всплывающее" окно - какие P/Invokes необходимы для выполнения тех же действий в .NET?
    У меня есть набор P/Invoke в .NET. Можно ли повторно использовать обычный WinForm, переопределяя определенные методы, чтобы добиться такого же эффекта?
    У меня есть WinForm, который я показываю как "всплывающее окно", переопределяя определенные методы - есть ли встроенный Control , который может действовать как всплывающее окно для меня?
    Как имитировать раскрывающееся окно в WinForms?

Я попробовал метод Show(onwer) + ShowWithoutActivation :

Совсем почти решена проблема, но затем я обнаружено было напомнено о другом свойстве "всплывающих" окон: они не берут фокус из своей формы "владелец" становятся активен при взаимодействии с мышью или клавиатурой.

спросил(а) 2011-12-29T17:57:00+04:00 9 лет, 10 месяцев назад

Создайте окно "всплывающее окно" в качестве дочернего окна рабочего стола, а затем покажите его, не активируя его.

После этого ваше исходное окно будет активировано, даже если вы нажмете на "всплывающее" окно. Окно "всплывающее окно" может иметь собственные элементы управления детьми. Вы можете нажать кнопку на нем. Но если это элемент управления редактирования, вы не можете его редактировать, я не знаю, почему. Возможно, потому, что курсор в исходном окне уже мигает.

ответил(а) 2016-03-11T18:17:00+03:00 5 лет, 8 месяцев назад

Вы хотите иметь принадлежащее окно. В вашей основной форме:

PopupForm должен выглядеть так:

И убедитесь, что PopupForm.ShowInTaskbar = false .

ответил(а) 2011-12-29T18:51:00+04:00 9 лет, 10 месяцев назад

Мне было любопытно, как работают выпадающие списки combobox и меню, поэтому я сделал еще несколько исследований.

Существует два основных подхода.

Создать всплывающее окно как перекрывающееся окно, принадлежащее главному окну

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

Создать всплывающее окно в качестве дочернего элемента окна рабочего стола

Этот метод используется выпадающими списками combobox и (я думаю), но вы не можете внедрять дочерние элементы управления, чтобы он не был широко применим.

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


Когда я начал изучать программирование WinForm, я задался вопросом было, как создать дополнительные оконные формы в уже существующем проекте Winform. Например, я хотел создать всплывающее окно для редактирования. Я знал, какой код написать, чтобы создать экземпляр новой формы, но не знал, как редактировать эту форму в дизайнере.

В этой статье мы собираемся создать проект Winform с нуля, который будет содержат основную форму, а также одну дополнительную обычную форму, которая будет действовать как всплывающее диалоговое окно с кнопками OK / Отмена . Это всплывающее диалоговое окно отображается при нажатии кнопки в основной форме. Когда всплывающее окно закрывается, основная форма проверяет, какая кнопка ( ОК или Отмена) была нажата.

Готовый проект будет выглядеть примерно так:


Примечание. В реальном приложении вы, скорее всего, не создадите эти простые диалоговые окна, как показано здесь, но вместо этого будут просто вызывать статический метод MessageBox.Show.

Итак, приступим. Выполните следующие действия:

  1. Запустите Visual Studio и создайте новый проект WinForms. Если вы не знаете, как это сделать, или у вас возникли проблемы с поиском шаблона WinForms, ознакомьтесь с подробностями в статье Как создать проект WinForms с помощью Visual Studio.
  2. Перетащите элемент управления Button из ToolBox ( View> Toolbox ).

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


Щелкните изображение, чтобы увеличить

  • В Text тип свойства OK
  • В DialogResult появится раскрывающееся меню. Выберите OK , как показано на изображении выше.
Примечание: DialogResult будет обсуждаться позже, когда мы будем изучать код построчно
  • В типе свойства ТекстОтмена
  • В свойстве DialogResult будет показано раскрывающееся меню. Здесь также выберите Отменить

Построчное объяснение кода

Теперь давайте рассмотрим приведенный выше код более внимательно, сосредоточив внимание на выделенных строках 3, 4, 5 и 13:

Здесь мы создаем экземпляр класса PopupForm . Этот класс был создан на шагах 3 и 4, когда мы выбрали Add> Window Form и назвали его PopupForm .

Для этого кода вы необходимо знать следующее:

  1. ShowDialog откроет форму как модальное диалоговое окно. Это в основном означает, что пользователь не сможет взаимодействовать с основной формой, пока PopupForm не будет закрыт..
  2. Еще одна особенность модальных форм состоит в том, что код после метода ShowDialog не будет выполняться, как вы догадались, до тех пор, пока всплывающая форма не будет закрыта.

Примечание. На самом деле форма только скрывается и может быть отображена снова без создания нового экземпляра формы.


  • Если была нажата кнопка X, форма будет вернуть значение DialogResult.Cancel
    Кнопка X
  • Если для свойства кнопки DialogResult установлено значение DialogResult.N один , форма не закроется.

Когда нам больше не нужна всплывающая форма, мы избавляемся от нее, вызывая метод Dispose . Причина вызова метода Dispose заключается в том, что при нажатии кнопки OK или Close (кнопка X) всплывающая форма будет только скрыт и не закрыт. Без Dispose () мы бы создавали дополнительные экземпляры при каждом нажатии кнопки в основной форме.

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

Читайте также: