在Rhino中你可以使用三种形式实现提示的输出。第一种是命令行;第二种是消息窗口;第三种是窗口提示。
一、命令行
前面个文章我们介绍了命令行的提示方法。直接在需要提示的步骤添RhinoApp.WriteLine("提示");代码,实现
命令行提示
二、消息窗口
Rhino可以创建一个消息提示框来输出提示,和上面的方法相同,在需要输出提示的地方插入代码MessageBox.Show(this, "你好 Rhino!", "一个子窗口", MessageBoxButtons.OKCancel);。下面是代码的窗口形式。
命令行提示
三、窗口提示
消息窗口和窗口提示实际上是差不多的东西,只是消息窗口是通过MessageBox.Show()直接弹出一个消息对话框(可以理解为是一个超级简单的Form窗口,你只要定义提示内容,其他的窗口属性都是默认的即可),而窗口提示是通过自定义一个窗口和设置提示框大小、背景、行为等等属性个性化的设置后实现的提示,如果只是进行简单的实现窗口提示,使用MessageBox.Show()就足够了。下面是一个窗口的设置代码:
using Eto.Drawing;
using Eto.Forms;
using Rhino.UI;
using System;
using System.ComponentModel;
namespace CowForRhinoEto.Views
{
/// <summary>
/// 创建一个自定义对话框类。
/// </summary>
class CowForRhinoEtoModalDialog : Dialog<DialogResult>
{
/// <summary>
/// 创建一个自定义对话框方法,该窗口由命令启动。
/// </summary>
public CowForRhinoEtoModalDialog()
{
// Padding:获取或设置面板内容周围的填充。
Padding = new Padding(5);
// Resizable:获取或设置一个值,该值指示此窗口是否可调整大小。
Resizable = false;
// Result:获取或设置对话框的结果。
Result = DialogResult.Cancel;
// Title:获取或设置窗口的标题。
Title = "一个窗口";
// WindowStyle:获取或设置此窗口的样式。
WindowStyle = WindowStyle.Default;
// 设置一个自定义按钮。
var hello_button = new Button { Text = "Hello002" };
hello_button.Click += (sender, e) => OnHelloButton();
// DefaultButton:获取或设置默认按钮。
DefaultButton = new Button { Text = "确定" };
DefaultButton.Click += (sender, e) => Close(DialogResult.Ok); // 关闭具有指定结果的对话框。
// AbortButton:获取或设置中止按钮。
AbortButton = new Button { Text = "取消" };
AbortButton.Click += (sender, e) => Close(DialogResult.Cancel); // 关闭具有指定结果的对话框。
// 初始化TableLayout类的新实例,创建一行位置放置内容。
var button_layout = new TableLayout
{
// 设置按钮的边距:左、上、右、下。
Padding = new Padding(5, 10, 5, 5),
// 获取或设置表中每个单元格之间的水平和垂直间距。
Spacing = new Size(5, 5),
// 设置表中的行集合。
Rows = { new TableRow(null, hello_button, null) }
};
// 初始化TableLayout类的新实例,创建一行位置放置内容。
var defaults_layout = new TableLayout
{
// 设置按钮的边距:左、上、右、下。
Padding = new Padding(5, 10, 5, 5),
// 获取或设置表中每个单元格之间的水平和垂直间距。
Spacing = new Size(5, 5),
// 设置表中的行集合。
Rows = { new TableRow(null, DefaultButton, AbortButton, null) }
};
// Content:获取或设置面板的主要内容。这里将所有内容实现到面板。
Content = new TableLayout
{
// Padding:为所有边初始化具有指定填充的Padding类的新实例
Padding = new Padding(5),
// Spacing:获取或设置表中每个单元格之间的水平和垂直间距。
Spacing = new Size(5, 5),
// 设置表中的行集合。
Rows = { new TableRow(button_layout), new TableRow(defaults_layout) }
};
}
// 引发LoadComplete事件,并递归到此容器的子级。
protected override void OnLoadComplete(EventArgs e)
{
base.OnLoadComplete(e);
this.RestorePosition();
}
// 引发结束事件。
protected override void OnClosing(CancelEventArgs e)
{
this.SavePosition();
base.OnClosing(e);
}
// "Hello002"的Rhino通用消息。
protected void OnHelloButton()
{
MessageBox.Show(this, "你好 Rhino!", "一个子窗口", MessageBoxButtons.OKCancel);
}
}
}
我们创建一个命令“CowForRhinoEtoModalDialog”来启动该提示:
using Rhino;
using Rhino.Commands;
using Rhino.UI;
namespace CowForRhinoEto.Commands
{
public class CowForRhinoEtoModalDialogCommand : Command
{
// 定义一个命令“CowForRhinoEtoModalDialog”,该命令启动一个Rhino消息窗口。
// 定义命令的名称为“CowForRhinoEtoModalDialog”
public override string EnglishName
{
get { return "CowForRhinoEtoModalDialog"; }
}
protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
var rc = Result.Cancel;
if (mode == RunMode.Interactive) // 当命令被输入执行时
{
// 初始化Rhino消息窗口。
var dialog = new Views.CowForRhinoEtoModalDialog();
// 设置以模式显示对话框,阻止当前线程,直到它关闭。
var dialog_rc = dialog.ShowModal(RhinoEtoApp.MainWindow);
// 设置当用户点击“确定”时,关闭消息窗口。
if (dialog_rc == Eto.Forms.DialogResult.Ok)
rc = Result.Success;
}
else // 当命令没有被执行时的消息提示。
{
var msg = string.Format("Scriptable version of {0} command not implemented.", EnglishName);
RhinoApp.WriteLine(msg);
}
return rc;
}
}
}
在rhino中输入命令“CowForRhinoEtoModalDialog”,会出现下面窗口
窗口提示
设置炫酷的提示窗口就需要掌握更多Form窗口知识,许多Form窗口的应用可以参考这里。