由于 AutoDesk 已经将其大部分产品的底层架构统一了,所以 Kean Walmsley (译者注:AutoCAD二次开发博主 Through the Interface) 对 AutoCAD 界面定制的研究对于 Revit 同样有效。本文从定制 Tooltip 入手,介绍如何利用 AdWindows.dll 定制化翻译 Revit 的 Tooltip 文本。
AdWindows.dll 提供的命名空间 Autodesk.Windows 中提供了部分 Ribbon 用户界面的定制接口。为了捕获 Revit 显示的 Tooltip,需要注册针对所有 Tooltip 都会触发的
Autodesk.Windows.ComponentManager.TooltipOpened 事件。
当然,仅仅是实现设置 Tooltip 的语言,我们也可以使用独立应用程序调用 AdWindows.dll 的方式来实现。但是显然使用 Revit Add-in 的方式会更加直观(译者注:因为我目前项目要求将一个数字平台与 Revit 环境无缝绑定,所以插件形式是必选。而且通过 AdWindows.dll,我可以实现将 Revit 环境标志位我自己的数字平台的效果)。
下面这段代码展示的是主要逻辑:
Autodesk.Windows.ComponentManager.ToolTipOpened += ( s, e ) =>
{
Autodesk.Internal.Windows.ToolTip tt = s as Autodesk.Internal.Windows.ToolTip;
if (tt != null)
{
if (tt.Content is RibbonToolTip)
{
RibbonToolTip rtt = (RibbonToolTip)tt.Content;
if (rtt.Content == null && rtt.ExpandedContent == null)
{
// 防止关闭 Revit 中的浏览器控件 Tooltip
if (!rtt.Title.Contains(" : "))
{
CloseAndReshowTooltip(tt);
}
}
else
{
rtt.Content =TranslateIfString(rtt.Content, GetId(rtt));
TranslateObjectContent(rtt.Content, GetId(rtt));
// 翻译扩展内容(添加ID到结尾来将其与基本内容区分开)
rtt.ExpandedContent = TranslateIfString(rtt.ExpandedContent, GetExpandedId(GetId(rtt)));
TranslateObjectContent(rtt.ExpandedContent, GetExpandedId(GetId(rtt)));
// 强制为特定控件显示 Tooltip(目前是硬编码位移,更好的方式是基于当前鼠标的尺寸)
tt.Show(System.Windows.Forms.Cursor.Position.X, System.Windows.Forms.Cursor.Position.Y + 16);
}
}
else if (tt.Content is UriKey)
{
// 针对需要系统解析的 Tooltip 将显示交给系统延时处理
CloseAndReshowTooltip(tt);
}
else
{
// 基本的只包含文本的 Tooltip
tt.Content = TranslateIfString(tt.Content, null);
}
}
}
请在此处下载完整代码。