一個簡單的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