原創(chuàng)|行業(yè)資訊|編輯:王香|2016-11-14 10:55:53.000|閱讀 645 次
概述:從版本8.2開始,Add-in Express開始打開其內(nèi)部基礎(chǔ)架構(gòu),允許開發(fā)人員自定義高級Excel、Wor、PowerPoint任務(wù)窗格和Outlook的某些區(qū)域。在新版本中,可以自定義標(biāo)題、控件以及分隔符和邊框。我們還可以修改最小化區(qū)域的外觀,控制標(biāo)題可見性,更改填充,獲取HitTest信息等。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在嵌入表單中以O(shè)ffice和.net為基礎(chǔ)結(jié)構(gòu)實(shí)現(xiàn)的Add-in Express,對于所有Office應(yīng)用程序都是相同的(區(qū)別僅在于類名),以Excel任務(wù)窗格為例,檢查其主要元素,看看怎么根據(jù)自己的喜好自定義它們。例如,采用高級Excel任務(wù)窗格的默認(rèn)設(shè)計(jì):
..并把它變成這一個(gè):
簡單地更改表單顏色,即將BackColor設(shè)置為綠色,并將UseOfficeThemeForBackGround屬性設(shè)置為false將不夠,因?yàn)檫@將只繪制所需顏色的窗體,而窗格的其他部分將根據(jù)Excel的顏色主題繪制:
為了理解下一步做什么,我使用了一個(gè)圖形編輯器,并概述了組成窗格的區(qū)域。
上面的屏幕截圖顯示了展開狀態(tài)下的窗格,它由三個(gè)主要區(qū)域組成:窗體、標(biāo)題和分割區(qū)。為了更好的感知,我們管這些區(qū)域從窗格的邊緣偏移距離叫填充。表單區(qū)域沒有什么特別的意義,因?yàn)樗梢赃m應(yīng)設(shè)計(jì)創(chuàng)建的內(nèi)容。但是Header和Splitter以及Padding區(qū)域一樣可以改變成你想要的方式。
什么是高級任務(wù)窗格?
在加載項(xiàng)Express中,任務(wù)窗格是您的窗體所在的特定控件(ADXContainerControl)。當(dāng)窗格上有多個(gè)窗體時(shí),它們將它們存儲在列表中。
重新繪制任務(wù)窗格時(shí),首先以某種顏色繪制其背景,然后繪制標(biāo)題和分割符。窗體下面的區(qū)域沒有標(biāo)識,當(dāng)用戶懸停在標(biāo)題或分割器上的某個(gè)按鈕上時(shí),窗格將會被完全重繪。
如何修改任務(wù)窗格外觀?
Add-in Express在AddinExpress.Extensions.ADXContainerControl類中可以實(shí)現(xiàn)任務(wù)窗格的基本功能。從該類繼承以下類:ADXContainerControlOL,ADXContainerControlXL,ADXContainerControlPP,ADXContainerControlWD,它們分別支持Outlook,Excel,Power Point和Word特有的行為和繪圖。
要更改任務(wù)窗格的標(biāo)準(zhǔn)設(shè)計(jì)時(shí),我們需要創(chuàng)建一個(gè)可以繼承上述類之一的新類,并覆蓋所需的虛擬方法和屬性。在本例中,我們繼承了ADXContainerControlXL類。
public class MyContainerControl : ADXContainerControlXL { }
此外,我們需要指定應(yīng)使用新類而不是默認(rèn)類,所有需要覆蓋ADXExcelTaskPane類中的GetContainerControlType方法,并返回新類的類型。
protected override Type GetContainerControlType() { return typeof(MyContainerControl); }
現(xiàn)在,我們需要覆蓋并實(shí)現(xiàn)新的MyContainerControl類的屬性和方法。 在這里,我將只描述最重要的,但是我們也可以通過以下鏈接下載這個(gè)例子的完整代碼。如果要使用所需的顏色填充任務(wù)窗格的整個(gè)繪圖區(qū)域,請覆蓋BackColor屬性:
public override Color BackColor { get { return Color.FromArgb(0x21, 0x73, 0x46); } }
對于窗格邊框的內(nèi)部間距,我們也可以覆蓋Padding屬性以調(diào)整Header、Splitter和Form區(qū)域例如:
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; } }
想要正確地繪制按鈕上的圖標(biāo),我們需要知道窗格的布局和位置(垂直或水平)。因此我們可以使用覆蓋OnInitialized方法并將這些值存儲在內(nèi)部變量中。該方法將在窗格初始化時(shí)被調(diào)用,比如在顯示窗格、更改其布局或切換到另一個(gè)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; } }
下面為大家介紹在繪制各種窗格控件時(shí)直接涉及的方法。考慮到背景是較暗的,我們使用白色文字顏色:
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方法,我們只繪制子控件(通過調(diào)用e.DrawControls()方法),不需要調(diào)用基本方法,因?yàn)檫x擇了任務(wù):在自定義背景上繪制子控件,調(diào)用基本方法一般使用在一些Excel版本中的漸變繪制背景(例如Excel 2010)。
我們要覆蓋的下一個(gè)方法是OnDrawControl(DrawControlArgs e),當(dāng)顯示ADXDrawControlType中列出的任何控件時(shí),將調(diào)用此方法。
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/
轉(zhuǎn)載請注明慧都控件網(wǎng)
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn