按下帮助按钮时显示消息框

Show a MessageBox when the Help Button is pressed

我试图在按下表单的拼贴栏中的上下文帮助按钮时显示 MessageBox(或我可以将文本放入其中的东西)。

这是我想要按下的帮助按钮:

任何帮助都会很棒! :)

您需要连接 HelpRequestedHelpButtonClicked 事件

此外,您需要通过设置

来显示按钮(在表单上默认关闭)
  • HelpButton = true
  • 最小化框 = false
  • 最大化框 = 假

听起来您是 C# 的新手,所以我将通过示例向您介绍最简单的 运行:

在 InitializeComponent() 函数中您需要添加:

HelpRequested += new System.Windows.Forms.HelpEventHandler(this.form_helpRequested);

一旦按下帮助按钮,这将告诉表单 运行 form_helpRequested。然后你可以实现这个事件处理函数:

private void textBox_HelpRequested(object sender, System.Windows.Forms.HelpEventArgs hlpevent)
{
    // Your code here
    // Example of a popup with text:
    MessageBox.Show("This is a help popup");
}

这一切都需要在您的 Form1.cs(或等效的)脚本中。

关于此事件处理程序的参考,我建议阅读这篇文章:https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.helprequested?view=windowsdesktop-6.0

对已发布内容的一些补充。

Help Button 显示在表格的标题中。
要激活它,请设置 HelpButton = trueMinimizeBox = falseMaximizeBox = false.

要显示与控件相关的帮助,您可以订阅提供帮助的每个控件的 HelpRequested 事件,或者您可以只使用表单的所有控件的 HelpRequested 事件。
您需要获取单击鼠标时选择的 child 控件。
我在这里使用 WindowFromPoint() to get the handle of the Control at the position specified by HelpEventArgs.
该函数可以获取嵌套控件的句柄。

A Dictionary<Control, string> 用于存储和检索所有控件的帮助文本,这些控件应提供其功能(或其他任何内容)的描述。
帮助文本当然可以来自本地化的项目资源。

请注意,不会为 ContainerControl(表单本身、Panel、GroupBox 等)生成帮助,并且WindowFromPoint不会获取已禁用控件的句柄。

using System.Runtime.InteropServices;

public partial class SomeForm : Form

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    internal static extern IntPtr WindowFromPoint(Point point);

    Dictionary<Control, string> help = new Dictionary<Control, string>();

    public SomeForm() {
        InitializeComponent();
        help.Add(someButton, "Help on someButton");
        help.Add(someTextBox, "someTextBox gets help");
        help.Add(someNestedControl, "someNestedControl needs clarifications");
    }

    private void SomeForm_HelpButtonClicked(object sender, CancelEventArgs e) {
        // The Help Button has been clicked
    }

    private void SomeForm_HelpRequested(object sender, HelpEventArgs e) => ShowHelp(e);

    public void ShowHelp(HelpEventArgs e) {
        e.Handled = true;
        var ctl = FromHandle(WindowFromPoint(e.MousePos));
        if (ctl != null && help.ContainsKey(ctl)) {
            MessageBox.Show(help[ctl]);
        }
        else {
            MessageBox.Show("No help for this Control");
        }
    }
}