gpt4 book ai didi

winforms - 如何在 Winforms 中制作 "popup"(提示、下拉、弹出)窗口?

转载 作者:行者123 更新时间:2023-12-04 15:03:01 24 4
gpt4 key购买 nike

我怎样才能在 WinForms 中创建一个“弹出”窗口?

由于我使用了我自己编造的词“popup”,让我举例说明这个所谓的“popup”窗口:

  • 工具提示窗口 (可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,也不会窃取焦点):

    enter image description here
  • 弹出菜单 窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,并且不会窃取焦点):

    enter image description here
  • 下拉窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,也不会窃取焦点):

    enter image description here
  • A 主菜单 窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,并且不会窃取焦点):

    enter image description here
  • 更新 A 弹出 window 不是自己制作的the "active" window当使用鼠标或键盘进行交互时(“所有者”窗口仍然是事件窗口):

  • enter image description here

    我在这个神话般的“弹出窗口”中寻找的属性是:
  • 可以 延长 在其父表单的边界之外(即 is not a child window )
  • 没有出现在 中任务栏 (即 Window 对哪些窗口应该出现的启发式没有启动,也没有 WS_EX_APPWINDOW 扩展窗口样式)
  • 不是 模态 (即 doesn't disable its "owner")
  • 不偷焦点
  • 总是 置顶 它的“所有者”
  • 与(所有者保持事件状态)交互时不会成为“事件”窗口

  • Windows 应用程序已经在设法创建这样的窗口。我如何在 WinForms 应用程序中做到这一点?

    相关问题
  • 我如何在 native 代码中实现上述所有内容?
  • 如何在 Delphi 中创建一个弹出窗口?
  • 我有这个 native 代码来显示一个“弹出”窗口 - 在 .NET 中执行相同的操作需要什么 P/Invokes?
  • 我在 .NET 中有一组 P/Invoke - 我可以重用常规的 WinForm,覆盖某些方法来达到相同的效果吗?
  • 我通过覆盖某些方法将 WinForm 显示为“弹出窗口” - 是否有内置的 Control那可以作为我的弹出窗口吗?
  • How to simulate a drop-down window in WinForms?


  • 尝试#1

    我试过 Show(onwer) + ShowWithoutActivation方法:
    PopupForm dd = new PopupForm ();
    dd.Show(this);

    使用 PopupForm:
    public class PopupForm: Form
    {
    public PopupForm()
    {
    InitilizeComponent();
    }

    private void InitilizeComponent()
    {
    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = false;
    }

    protected override bool ShowWithoutActivation
    { get { return true; } }
    }

    几乎解决了这个问题,但后来我发现提醒了“弹出”窗口的另一个属性:当通过鼠标或键盘进行交互时,它们不会从“所有者”表单中获取焦点。

    最佳答案

    你想要一个拥有的 window 。在您的主要形式中:

    private void showPopup_Click(object sender, EventArgs e)
    {
    PopupForm popupForm = new PopupForm();
    // Make "this" the owner of form2
    popupForm.Show(this);
    }

    PopupForm 应如下所示:
    public partial class PopupForm : Form
    {
    private bool _activating = false;

    public PopupForm()
    {
    InitializeComponent();
    }

    // Ensure the popup isn't activated when it is first shown
    protected override bool ShowWithoutActivation
    {
    get
    {
    return true;
    }
    }

    private const int WM_NCACTIVATE = 0x86;

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    protected override void WndProc(ref Message m)
    {
    // The popup needs to be activated for the user to interact with it,
    // but we want to keep the owner window's appearance the same.
    if ((m.Msg == WM_NCACTIVATE) && !_activating && (m.WParam != IntPtr.Zero))
    {
    // The popup is being activated, ensure parent keeps activated appearance
    _activating = true;
    SendMessage(this.Owner.Handle, WM_NCACTIVATE, (IntPtr) 1, IntPtr.Zero);
    _activating = false;
    // Call base.WndProc here if you want the appearance of the popup to change
    }
    else
    {
    base.WndProc(ref m);
    }
    }
    }

    并确保 PopupForm.ShowInTaskbar = false .

    关于winforms - 如何在 Winforms 中制作 "popup"(提示、下拉、弹出)窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669368/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com