原創|行業資訊|編輯:王香|2016-11-14 10:55:53.000|閱讀 645 次
概述:從版本8.2開始,Add-in Express開始打開其內部基礎架構,允許開發人員自定義高級Excel、Wor、PowerPoint任務窗格和Outlook的某些區域。在新版本中,可以自定義標題、控件以及分隔符和邊框。我們還可以修改最小化區域的外觀,控制標題可見性,更改填充,獲取HitTest信息等。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在嵌入表單中以Office和.net為基礎結構實現的Add-in Express,對于所有Office應用程序都是相同的(區別僅在于類名),以Excel任務窗格為例,檢查其主要元素,看看怎么根據自己的喜好自定義它們。例如,采用高級Excel任務窗格的默認設計:
..并把它變成這一個:
簡單地更改表單顏色,即將BackColor設置為綠色,并將UseOfficeThemeForBackGround屬性設置為false將不夠,因為這將只繪制所需顏色的窗體,而窗格的其他部分將根據Excel的顏色主題繪制:
為了理解下一步做什么,我使用了一個圖形編輯器,并概述了組成窗格的區域。
上面的屏幕截圖顯示了展開狀態下的窗格,它由三個主要區域組成:窗體、標題和分割區。為了更好的感知,我們管這些區域從窗格的邊緣偏移距離叫填充。表單區域沒有什么特別的意義,因為它可以適應設計創建的內容。但是Header和Splitter以及Padding區域一樣可以改變成你想要的方式。
什么是高級任務窗格?
在加載項Express中,任務窗格是您的窗體所在的特定控件(ADXContainerControl)。當窗格上有多個窗體時,它們將它們存儲在列表中。
重新繪制任務窗格時,首先以某種顏色繪制其背景,然后繪制標題和分割符。窗體下面的區域沒有標識,當用戶懸停在標題或分割器上的某個按鈕上時,窗格將會被完全重繪。
如何修改任務窗格外觀?
Add-in Express在AddinExpress.Extensions.ADXContainerControl類中可以實現任務窗格的基本功能。從該類繼承以下類:ADXContainerControlOL,ADXContainerControlXL,ADXContainerControlPP,ADXContainerControlWD,它們分別支持Outlook,Excel,Power Point和Word特有的行為和繪圖。
要更改任務窗格的標準設計時,我們需要創建一個可以繼承上述類之一的新類,并覆蓋所需的虛擬方法和屬性。在本例中,我們繼承了ADXContainerControlXL類。
public class MyContainerControl : ADXContainerControlXL { }
此外,我們需要指定應使用新類而不是默認類,所有需要覆蓋ADXExcelTaskPane類中的GetContainerControlType方法,并返回新類的類型。
protected override Type GetContainerControlType() { return typeof(MyContainerControl); }
現在,我們需要覆蓋并實現新的MyContainerControl類的屬性和方法。 在這里,我將只描述最重要的,但是我們也可以通過以下鏈接下載這個例子的完整代碼。如果要使用所需的顏色填充任務窗格的整個繪圖區域,請覆蓋BackColor屬性:
public override Color BackColor { get { return Color.FromArgb(0x21, 0x73, 0x46); } }
對于窗格邊框的內部間距,我們也可以覆蓋Padding屬性以調整Header、Splitter和Form區域例如:
public override Padding Padding { get { Padding offsets = base.Padding; if (owner.RegionState == AddinExpress.XL.ADXRegionState.Hidden) offsets = new Padding(1, 2, 1, 2); return offsets; } }
想要正確地繪制按鈕上的圖標,我們需要知道窗格的布局和位置(垂直或水平)。因此我們可以使用覆蓋OnInitialized方法并將這些值存儲在內部變量中。該方法將在窗格初始化時被調用,比如在顯示窗格、更改其布局或切換到另一個Office主題之后。
protected override void OnInitialized() { base.OnInitialized(); owner = Owner as ExcelTaskPane1; layout = owner.Item.Position; isVertical = false; switch (layout) { case AddinExpress.XL.ADXExcelTaskPanePosition.Left: case AddinExpress.XL.ADXExcelTaskPanePosition.Right: isVertical = true; break; } }
下面為大家介紹在繪制各種窗格控件時直接涉及的方法。考慮到背景是較暗的,我們使用白色文字顏色:
protected override void OnDrawText(DrawTextArgs e) { e.ForeColor = Color.White; base.OnDrawText(e); } protected override void OnDrawHeader(DrawArgs e) { //base.OnDrawHeader(e); e.DrawControls(); }
請注意,對于OnDrawHeader方法,我們只繪制子控件(通過調用e.DrawControls()方法),不需要調用基本方法,因為選擇了任務:在自定義背景上繪制子控件,調用基本方法一般使用在一些Excel版本中的漸變繪制背景(例如Excel 2010)。
我們要覆蓋的下一個方法是OnDrawControl(DrawControlArgs e),當顯示ADXDrawControlType中列出的任何控件時,將調用此方法。
protected override void OnDrawControl(DrawControlArgs e) { if (e.ControlType == ADXDrawControlType.Separator) // Excel 2010 and below return; // Draw any control except for splitter button if (e.ControlType != ADXDrawControlType.Splitter) { // Determine whether the button is available or not. bool disabled = false; switch (e.ControlType) { case ADXDrawControlType.Previous: disabled = !IsScrollButtonPresent(false); break; case ADXDrawControlType.Next: disabled = !IsScrollButtonPresent(true); break; } // If the button is available and has been clicked, or the mouse cursor hovers // over it, fill the background color corresponding to the button state. if (!disabled && e.State != ADXDrawControlState.Up) { SolidBrush br = new SolidBrush(e.State == ADXDrawControlState.Focused ? btnBackColor : btnPressedColor); e.Graphics.FillRectangle(br, e.Bounds); br.Dispose(); } // Take the button image from the resources // and draw it using the DrawImage method. Image image = GetSkinImage(e.ControlType); if (image != null) { Size imgSize = image.Size; Rectangle destRect = new Rectangle( e.Bounds.Left + (e.Bounds.Width - imgSize.Width) / 2, e.Bounds.Top + (e.Bounds.Height - imgSize.Height) / 2, imgSize.Width, imgSize.Height); // If the button is disabled, draw it with 50% transparency. float alpha = disabled ? 0.5f : 1.0f; DrawImage(e.Graphics, image, destRect, new Rectangle(Point.Empty, imgSize), alpha); } e.DrawControls(); } else base.OnDrawControl(e); }
本文翻譯自://www.add-in-express.com/
轉載請注明慧都控件網
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn