1. 程式人生 > 實用技巧 >一個簡單的c#滾動AboutBox控制

一個簡單的c#滾動AboutBox控制

介紹 我想有一個滾動的盒子在我的專案可以顯示文字,影象,並自動滾動學分對話方塊。這是一個額外的特性我寧願增加完成我的一些應用程式。花很多時間在網際網路上搜索之後,我找到了一些文章和例子程式碼,特別是在這個網站,我印象深刻的是,以下文章: CCreditsCtrl——一個先進的盒子。 CScrollCtrl: autoscrolling文字控制。 以上都是做得很好,但是他們不是我想要的是什麼。這些專案是在Visual c++ 6.0開發或Visual c++ 7.1 (. net),但使用MFC,因為我不能建立一個c#控制基於他們的模組。我不得不改變他們適合我的工作。 背景 正如前面說的,這些示例程式使用MFC程式設計方便。函式CreateCompatibleDC, CreateCompatibleBitmap SelectObject等。在MFC常見的影象處理方法和操作的裝置上下文視窗。但是,我現在工作在. net框架中,使用VB。淨或c#,所以上面的程式不能幫助我了。 我開始在網上搜索,看在MSDN,知道有一個解決方案在c#中使用舊的Win32 API圖形函式光滑的畫。這個想法是為了讓c#知道你將使用一些從非託管DLL函式,使用DllImport屬性。DllImport的詳細文件可以在。net中找到文件。我是一個新手在c#中,所以這對我來說太難了嘗試解決這個問題。 幸運的是,我們可以達到同樣的目標影象的系統。畫在。net名稱空間。影象呈現在。net MFC相比,簡單而高效得多。有兩個函式圖形類呈現你的影象物件在螢幕上,這些都是DrawImage DrawImageUnscaled。所以,我們會做我們的螢幕繪圖物件在一個影象。之後,我們可以使用這些函式來渲染這個物件直接直流和平滑的動畫效果。 在我的程式碼,我會試著畫中的所有顯示物件OnPaint()事件的控制:隱藏,複製Code

private void ctlScrollAbout_Paint(object sender, 
             System.Windows.Forms.PaintEventArgs e)
{
    using (System.Drawing.Graphics objGraphics = e.Graphics)
    {
        // draw off-screen m_TempDrawing bitmap on control screen
        objGraphics.DrawImage(m_TempDrawing, m_XMargin, m_YMargin, 
                    m_TempDrawing.Width, m_TempDrawing.Height);
    }
}

這並不奇怪,如果你想知道當螢幕。通常,我們稱之為DrawImage前繪製函式。在這種情況下,我們的控制是一個自動滾動aboutbox,所以我們必須有一個計時器操作滾動的速度。可以畫出螢幕計時器tick事件和呼叫OnPaint手動()函式。看看這個:隱藏,複製Code

// timer tick event
private void tmeScrolling_Tick(object sender, System.EventArgs e)
{
    BuildScrollingBitMap();  // build offline screen
    this.Invalidate();        //
call to OnPaint() event }

下次會議將描述如何滾動AboutBox管理它的顯示物件。有兩種顯示物件的控制:一個文字物件和一個影象物件。可以使用的一種常見方法,所有這些物件在一個列表。net支援一些基礎物件集合如ArrayList,雜湊表、佇列、棧,SortedList等,可以輕鬆使用。但是,我們希望我們自己的特定顯示物件列表,所以我們應該繼承從可用的一個新類。我們有clsDisplayList管理顯示物件,如下所示:隱藏,複製Code

// inherits a new custom list object from CollectionBase class 
public class clsDisplayList : System.Collections.CollectionBase
{
    // add new display object to list
    public int Add(clsDisplayObject value)
    {
        return List.Add(value);
    }

    // provide array-index access to display object list
    public clsDisplayObject this[int index]
    {
        get
        {
            return (clsDisplayObject)List[index];
        }
        set
        {
            List[index] = value;
        }
    }
}

顯示物件,它是安裝一個類擁有所有必要的成員變數和相應的屬性。滾動AboutBox將使用這些屬性來繪製在螢幕上正確顯示物件:隱藏,收縮,複製Code

// a instance of the display object 
public class clsDisplayObject
{
    // for text object
    private string _displayText = "";
    // for text object
    private System.Drawing.Font _objFont;
    // for text object
    private System.Drawing.FontStyle _fontStyle = 
                           System.Drawing.FontStyle.Bold;
    // for text object
    private string _fontName = "Tahoma";
    // for text object
    private int _fontSize = 10;
    // for text object
    private System.Drawing.Brush _textColor = 
            System.Drawing.Brushes.White;

    // determine if current display object is bitmap or text
    private bool _isBitMap = false;
    // the height of display object
    private int _displayHeight = 0;
    // offset in vertical of display object
    private int _displayYOffset = 0;

    // bitmap display object
    private System.Drawing.Bitmap  _bitmap;
    private int _bitmapHeight = 100;
    private int _bitmapWidth = 100;

    .....
}

在控制元件的類,我們宣告的例項clsDisplayList()和提供一些方法來新增一個新的顯示物件:隱藏,收縮,複製Code

public class ctlScrollAbout : System.Windows.Forms.UserControl
{
    ....
    // display object list
    private clsDisplayList m_DisplayObject = new clsDisplayList();
    ...

    /// <summary>
    /// Add a text display object.
    /// </summary>
    public void AddDisplayText(string text, string fontName, ?
           int fontSize, System.Drawing.FontStyle fontStyle, 
           System.Drawing.Brush textColor)
    {
        m_DisplayObject.Add(new clsDisplayObject(text, fontName, 
                                fontSize, fontStyle, textColor));
        BuildScrollingBitMap();
    }

    /// <summary> 
    /// Add a bitmap display object.
    /// </summary>
    public void AddDisplayBitmap(string fileName, 
                                 int bmpHeight, int bmpWidth)
    {
        m_DisplayObject.Add(new clsDisplayObject(fileName, 
                                bmpHeight, bmpWidth));
        BuildScrollingBitMap();
    }
}

現在一切都很清楚你可以整合他們自己的控制。一步一步的引導建立一個c#控制,您可以參考文章:簡單介紹編寫你的第一個。net控制。 使用的程式碼 在應用程式中使用上面的控制是非常簡單的。下載控制原始碼和構建它做一個c#控制。這將是一個DLL檔案的編譯輸出目錄;在我的例子中,它是。\ bin \ \ ScrollerAbout.dll除錯。 DLL檔案之後,您將建立一個新的Windows應用程式專案。在設計視窗中,請開啟工具箱選項卡,右鍵單擊並選擇新增/刪除專案。然後瀏覽到我們的DLL檔案,選中它並單擊OK。有一個滾動aboutbox控制在你的工具箱。 現在你可以拖動任何形式的控制您的. net應用程式並開始使用它。下面的程式碼顯示瞭如何初始化並將引數傳遞給控制當表單載入:隱藏,收縮,複製Code

' VB.Net example code
Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    ctrAbout.LineSpacing = 20
    ctrAbout.XMargin = 20
    ctrAbout.YMargin = 20
    ctrAbout.ScrollingStep = 1
    ctrAbout.ScrollingTime = 100

    ctrAbout.AddDisplayText("Scrolling AboutBox", "Arial Black", _
       15, System.Drawing.FontStyle.Bold, System.Drawing.Brushes.White)
    ctrAbout.AddDisplayText("Developed by", "Arial Black", 10, _
       System.Drawing.FontStyle.Italic, System.Drawing.Brushes.Olive)
    ctrAbout.AddDisplayText("Man_Man2612", "Arial Black", 10, _
      System.Drawing.FontStyle.Strikeout, System.Drawing.Brushes.Violet)

    ctrAbout.AddDisplayBitmap("images\test.gif", 115, 115)
    ctrAbout.AddDisplayBitmap("images\pic0.BMP", 100, 100)
    ctrAbout.StartScrolling()
End Sub


// C# example code
private void Form1_Load(object sender, System.EventArgs e)
{
    ctrAbout.LineSpacing = 20;
    ctrAbout.XMargin = 20;
    ctrAbout.YMargin = 20;
    ctrAbout.ScrollingStep = 1;
    ctrAbout.ScrollingTime = 500;

    ctrAbout.AddDisplayText("Scrolling AboutBox", "Arial Black", _
      15, System.Drawing.FontStyle.Bold, System.Drawing.Brushes.White); 
    ctrAbout.AddDisplayText("Developed by", "Arial Black", 10, _
      System.Drawing.FontStyle.Italic, System.Drawing.Brushes.Olive);
    ctrAbout.AddDisplayText("Man_Man2612", "Arial Black", 10, _
      System.Drawing.FontStyle.Strikeout, System.Drawing.Brushes.Violet);

    ctrAbout.AddDisplayBitmap(@"images\test.gif",115,115); 
    ctrAbout.AddDisplayBitmap(@"images\pic0.BMP",320,240); 
         ctrAbout.StartScrolling()
}

總結 我們現在知道如何建立一個定製的使用者控制在。net框架為特定的目的。我們也看到,一個新的繼承的類,用於管理自己的物件集合是非常簡單的。這個滾動AboutBox有一些高階功能,我想改善例如文字包裝,超連結物件,動畫形象等。但由於我消的時候,我剛剛建立的這篇文章,希望這種開放原始碼的人可以幫我做一個新的有用的滾動AboutBox版本。 歷史 2004年10月25日,1.0版。 文章提交。 2006年1月20日 丹•Morphis更新。 本文轉載於:http://www.diyabc.com/frontweb/news8412.html