自定义消息框






3.46/5 (39投票s)
本文介绍如何在 C# 中开发自定义消息框。
- 下载源代码 - 62.1 KB (版本 1)
- 下载演示 - 22.7 KB (版本 2)
对于您访问到无效链接,我深表歉意。我有一段时间未访问 CodeProject 并且也未进行个人项目。我没有续订网站,因此失去了所有权。我再次为那些访问了直接链接的读者表示歉意。我真的感到非常抱歉。
版本 1
版本 2
更新
本文介绍了版本 1 的开发过程。此后,我已更新了示例项目。新更新版本包含以下功能:
- 消息框图标。
- 可展开的窗体,以适应更长的文本。
- 三种动画样式(
SlideDown
、FadeIn
和ZoomIn
)。 - 消息框哔哔声。
- 单击按钮时返回
DialogResult
对象。 - 新界面。
引言
Windows 消息框是向用户显示消息的充分手段。对于许多应用程序来说,消息框都能正常工作,但有时消息框的功能会受到限制。例如,假设您想显示大量文本,因此需要一个用户可以调整大小甚至可滚动的消息框。有时,您可能会开发一个具有出色用户界面的应用程序,但由于单调的 Windows 消息框而大打折扣。
幸运的是,C# 开发人员可以非常轻松地开发自己的自定义消息框并将其集成到他们的应用程序中。在本文中,我将解释如何创建一个简单的“确定/取消”消息框。我还将提供一些关于如何通过添加计时器功能来改进消息框的建议。
现在您将创建一个自定义消息框。创建一个新的 Windows 应用程序,标题为 **MyMessageBox**。使用下表设置窗体的属性。
属性 | 值 |
大小 | 400,150 |
FormBorderStyle | FixedToolWindow |
ShowInTaskBar | 假 |
StartPosition | CenterScreen |
在窗体上放置两个按钮。使用下表设置 `button1` 的属性。
属性 | 值 |
名称 | btnOk |
Location | 217, 86 |
大小 | 84,27 |
文本 | 好的 |
现在使用下表设置 `button2` 的属性。
属性 | 值 |
名称 | btnCancel |
Location | 307, 86 |
大小 | 84,27 |
文本 | 取消 |
最后,在窗体上放置一个 `Label`。使用下表设置 `label1` 的属性。
属性 | 值 |
名称 | lblMessage |
Location | 9,7 |
代码
自定义消息框的代码非常简单。首先,我们需要声明一个名为 `Button_id` 的变量,该变量将保存数字 1 或 2。如果用户单击“确定”按钮,则此变量将设置为 1;如果用户单击“取消”按钮,则设置为 2。此变量将用于确定单击了哪个按钮。该变量声明为 `string` 类型,并且是 **静态变量**。
我们还需要定义一个 `MyMessageBox` 对象,该对象也定义为静态。这两个变量都应声明在 `public partial class...` 正下方。
static MyMessageBox newMessageBox;
static string Button_id;
Windows C# `MessageBox` 类有一个 `Show()` 方法。对于我们的自定义消息框,我们将创建一个 `ShowBox()` 方法,它将是一个重载方法。此重载方法将接受一个或两个参数。此方法还将用作*访问器*。这意味着我们不仅可以使用此方法设置消息框上的消息,还可以获取返回值,即用户单击了哪个按钮(确定/取消)。下面是 **`ShowBox()`** 方法的代码。
public static string ShowBox(string txtMessage)
{
newMessageBox = new MyMessageBox();
newMessageBox.label1.Text = txtMessage;
newMessageBox.ShowDialog();
return Button_id;
}
上面是 `ShowBox()` 的两个重载方法中的第一个。它接受一个参数,该参数是要显示在消息框上的消息。我们之前从 `MyMessageBox` 类中定义了一个 `newMessageBox` 对象,现在在 `ShowBox()` 方法中,我们使用 `new` 关键字实例化了该对象。
现在已创建 `MyMessageBox` 类的对象,我们可以设置消息框的标签。设置完消息后,我们需要显示消息框,我们使用 **`ShowDialog()`** 方法将消息框显示为对话框。这意味着当显示我们的消息框时,用户将无法与创建消息框的窗体进行交互,直到用户做出选择(确定、取消或单击 X 关闭按钮)。
最后,我们使用 return 语句将值返回给调用方法。如上所述,该值是 1、2,或者如果单击了 X 按钮,则为 null。
**`ShowBox()`** 方法的第二个重载方法接受两个参数。第一个是消息,第二个是标题。标题用于设置消息框的标题。如果 `ShowBox()` 方法仅使用一个参数,则消息框的标题将是类名,除非另行更改。
最后,我们需要编写“确定”和“取消”按钮的代码。这两个按钮的后台代码非常简单。两个按钮都需要释放消息框,但在释放消息框之前,它们都需要将值存储在 `Button_id` 变量中。将值存储到变量后,消息框将被释放,并且执行将返回到调用方法。变量 `Button_id` 中存储的值也会被返回。这将允许用户执行一些处理。下面是完整的代码。
static MyMessageBox newMessageBox;
static string Button_id;
public static string ShowBox(string txtMessage)
{
newMessageBox = new MyMessageBox();
newMessageBox.label1.Text = txtMessage;
newMessageBox.ShowDialog();
return Button_id;
}
public static string ShowBox(string txtMessage, string txtTitle)
{
newMessageBox = new MyMessageBox();
newMessageBox.label1.Text = txtMessage;
newMessageBox.Text = txtTitle;
newMessageBox.ShowDialog();
return Button_id;
}
private void btnOk_Click(object sender, EventArgs e)
{
Button_id = "1";
newMessageBox.Dispose();
}
private void btnCancel_Click(object sender, EventArgs e)
{
newMessageBox.Dispose();
Button_id = "2";
}
如何使用消息框
下面是使用自定义消息框的示例。
示例 1
MyMessageBox.ShowBox("Do you want to exit?");
示例 2
MyMessageBox.ShowBox("Do you want to exit?", "Exit");
示例 3
string btnClicked = MyMessageBox.ShowBox("Do you want to exit");
if (btnClicked == "1")
{
//User clicked OK button. Do some processing
}
else
{
//User clicked Cancel button. Do some processing.
}
请注意,在上面的示例中,您无需创建消息框类的实例。这已在 `ShowBox()` 方法中完成。在本文中,我解释了如何制作一个简单的“确定/取消”消息框,但是 C# `MessageBox` 类有许多重载的 `Show()` 方法和许多类型的消息框,例如“是/否”,您还可以设置消息框图标。通过添加一些额外的重载 `ShowBox()` 方法,您还可以处理“是/否”或“确定/取消”等消息框类型,甚至可以添加消息框图标,但这在本文中未涵盖。请记住,这只是一个简单的示例,旨在让您了解如何创建自定义消息框。
添加计时器功能
我们可以通过添加一个计时器来扩展我们的自定义消息框,该计时器将从一个值开始倒计时,然后在用户未做出选择的情况下释放消息框。为此,我们需要一个变量来存储值,并创建一个计时器来递减变量中的值。让我们先在消息框中添加一个标签,该标签将显示递减的计时器值。在窗体上放置一个新的标签,并使用下表设置 **label2** 的属性。
属性 | 值 |
名称 | lblTimer |
Location | 9, 100 |
我们需要声明一个新的变量来存储递减的计时器值,该变量应为 int 类型。请参见下面的代码片段。
static MyMessageBox newMessageBox;
static string Button_id;
int disposeFormTimer;
下一步是创建一个计时器。我们不使用工具箱中的计时器,而是自己创建一个新的计时器对象。计时器对象应在 `MyMessageBox_load` 事件中创建。请参见下面的代码片段。
private void MyMessageBox_Load(object sender, EventArgs e)
{
disposeFormTimer = 30;
Timer msgTimer = new Timer();
msgTimer.Interval = 1000;
msgTimer.Enabled = true;
msgTimer.Start();
msgTimer.Tick += new System.EventHandler(this.timer_tick);
}
上面的代码很简单。我们将值 30 存储在变量 **`disposeFormTimer`** 中。然后,计时器对象将从此值开始递减。我们向 **`msgTimer`** 计时器对象添加了一个 **`Tick`** 事件。此事件的名称是 **`timer_tick`**,该事件每秒触发一次。最后,我们需要编写 `timer_tick` 事件的代码。此事件将简单地从存储在 **`disposeFormTimer`** 变量中的值递减,并将 `lblTimer` 标签更新为递减的值。下面是 `timer_tick` 事件的代码片段。
private void timer_tick(object sender, EventArgs e)
{
disposeFormTimer--;
if (disposeFormTimer >= 0)
{
newMessageBox.lblTimer.Text = disposeFormTimer.ToString();
}
else
{
newMessageBox.Dispose();
}
}
**if 语句** 检查 **`disposeFormTimer`** 变量的值。如果它大于或等于零,则 `lblTimer` 标签将更新为存储在 **`disposeFormTimer`** 中的新值。一旦 **`disposeFormTimer`** 变量中的值低于零,消息框将使用 `dispose()` 方法关闭。
通过向我们的消息框添加计时器,我们为其增加了一个 C# `MessageBox` 类所不具备的额外功能。请记住,制作自定义消息框的目的是添加新功能或改进消息框的用户界面。