由於 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);
}
}
}
請在此處下載完整代碼。