.NET 的气球窗口






4.50/5 (20投票s)
一个允许在 .NET 中创建气球状窗体的类
引言
这是 Joshua Heyer 的 Balloon Help 的 .NET 版本。最初,我尝试在 Josh 的 C++ 代码之上构建一个 .NET 包装器,但很快我意识到从头用 C# 重写一切有其优势。主要优势是设计器支持——窗体设计器实际上会在窗口中显示气球形状(如下图所示)。
在您的项目中,您可以选择:
- 使用继承自
BalloonWindow
的窗体。如果您想在气球窗口中添加自己的控件,这会很有用。 - 使用
BalloonHelp
类。它提供一个带有标题、内容、图标和关闭按钮的气球。这在功能上与 Josh 的原始气球帮助类似。
使用 BalloonWindow 类
如果您想创建自己的气球状窗口,可以继承此类。在 VS.NET 中,您可以像下面这样向项目中添加一个“继承的窗体”项来实现:
接下来,在 VS.NET 显示的“继承选择器”对话框中,选择 BalloonWindow 作为窗体的基类。
这将在设计器中显示一个气球形状的窗体,现在您可以像设计其他窗体一样设计它。Windows 窗体设计器会实际显示气球窗口。这是在任何设计器中都未曾有过的功能——无论是 VC6 的资源对话框编辑器还是 VB6 的窗体设计器。
BalloonWindow
类中唯一重要的属性是 AnchorPoint
属性。这是气球尾部固定到的点。该点始终以屏幕坐标表示。此属性可以在设计时或运行时,在气球显示之前或之后设置。在气球显示后设置此属性会自动将气球窗口移动到新的锚定点。以下代码片段演示了如何将气球锚定到点 (100, 100):
//My balloon form is a class derived from BallonnWindow
MyBalloonForm form = new MyBalloonForm();
form.AnchorPoint = new Point(100, 100);
form.Show();
提供了一个静态方法 AnchorPointFromControl
,用于计算控件中心点的屏幕坐标。BalloonWindow
类还提供了一个 ShowBalloon
方法,该方法内部使用 AnchorPointFromControl
来显示锚定到控件的气球。例如:
MyBalloonForm form = new MyBalloonForm(); form.ShowBalloon(textbox1); //Balloon will be anchored to textbox1
使用 BalloonHelp 类
BalloonHelp
类提供了 Josh 原始 C++ 气球帮助类的功能。此类具有以下附加属性:
-
Caption:string
这指定了气球标题的文本。这与基类System.Windows.Forms.Control
的 Text 属性相同。 -
CaptionFont:System.Drawing.Font
指定了气球标题的字体。如果未指定,则使用Font
属性的粗体变体。 -
Content:string
指定气球内容的文本。 -
Font:System.Drawing.Font
Font
属性继承自System.Windows.Forms.Control
。它指定用于绘制内容的字体。 -
ShowCloseButton:bool
指示是否在气球的右上角显示关闭按钮。默认值为false
。 -
CloseOnDeactivate:bool
如果将此属性设置为 true,当用户切换到其他应用程序时,气球窗口将关闭。默认值为true
。 -
CloseOnMouseMove:bool
如果将此属性设置为 true,当鼠标移动时,气球窗口将关闭。默认值为false
。 -
CloseOnMouseClick:bool
如果将此属性设置为 true,当单击任何鼠标按钮时,气球窗口将关闭。默认值为true
。 -
CloseOnKeyPress:bool
如果将此属性设置为 true,当在键盘上按下按键时,气球窗口将关闭。默认值为true
。 -
EnableTimeout:bool
有时,可能需要气球在特定间隔后自行关闭。如果将此属性设置为 true,则会发生这种情况。默认值为 false。 -
Timeout:int
这指定了气球自行关闭的间隔(以毫秒为单位)。默认值为 5000。 -
Icon:System.Drawing.Icon
此属性从System.Windows.Forms.Form
继承,指定了要在气球左上角使用的图标。
下面是一些显示 BalloonHelp 窗口的示例代码。
BalloonHelp baloonHelp = new BalloonHelp();
balloonHelp.ShowCloseButton = true;
balloonHelp.Caption = "Sample Caption";
balloonHelp.Content = "A multiline\r\ncontent";
balloonHelp.CloseOnMouseClick = false;
balloonHelp.ShowBallon(textbox1);
结论
还有很多可以改进的地方。我计划添加以下一些功能:
- BallonErrorProvider 组件 - 类似于 .NET 中的标准 ErrorProvider 组件。
- BalloonHelpProvider 组件 - 类似于 .NET 中的标准 HelpProvider 组件。
- 可以在渲染代码上进行一些优化。
- 在设计器中调整大小时,气球会闪烁很多。这需要修复。
最后,感谢 Joshua Heyer 的 C++ 代码,它为本文的代码奠定了基础。