天天看點

如何自定義ADD-IN EXPRESS進階任務窗和Outlook區域的外觀

ADD-IN EXPRESS系列産品介紹:

ADD-IN EXPRESS産品是根據Microsoft Office的深度定制的堅實架構,控件産品使用了解決方案模闆、可視化設計群組件來開發适用于所有Office的版本。功能強大,支援的Office擴充、COM附加元件、Outlook插件、RTD伺服器、智能标記、Excel XLL和UDF。

在嵌入表單中以Office和.net為基礎結構實作的Add-in Express,對于所有Office應用程式都是相同的(差別僅在于類名),以Excel任務窗格為例,檢查其主要元素,看看怎麼根據自己的喜好自定義它們。例如,采用進階Excel任務窗格的預設設計:

如何自定義ADD-IN EXPRESS進階任務窗和Outlook區域的外觀

..并把它變成這一個:

如何自定義ADD-IN EXPRESS進階任務窗和Outlook區域的外觀

簡單地更改表單顔色,即将BackColor設定為綠色,并将UseOfficeThemeForBackGround屬性設定為false将不夠,因為這将隻繪制所需顔色的窗體,而窗格的其他部分将根據Excel的顔色主題繪制:

如何自定義ADD-IN EXPRESS進階任務窗和Outlook區域的外觀

為了了解下一步做什麼,我使用了一個圖形編輯器,并概述了組成窗格的區域。

如何自定義ADD-IN EXPRESS進階任務窗和Outlook區域的外觀

上面的螢幕截圖顯示了展開狀态下的窗格,它由三個主要區域組成:窗體、标題和分割區。為了更好的感覺,我們管這些區域從窗格的邊緣偏移距離叫填充。表單區域沒有什麼特别的意義,因為它可以适應設計建立的内容。但是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/

轉載請注明慧都控件網

繼續閱讀