ADD-IN EXPRESS系列産品介紹:
ADD-IN EXPRESS産品是根據Microsoft Office的深度定制的堅實架構,控件産品使用了解決方案模闆、可視化設計群組件來開發适用于所有Office的版本。功能強大,支援的Office擴充、COM附加元件、Outlook插件、RTD伺服器、智能标記、Excel XLL和UDF。
在嵌入表單中以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);
}
本文翻譯自:https://www.add-in-express.com/
轉載請注明慧都控件網