介绍 我想有一个滚动的盒子在我的项目可以显示文本,图像,并自动滚动学分对话框。这是一个额外的特性我宁愿增加完成我的一些应用程序。花很多时间在互联网上搜索之后,我找到了一些文章和例子代码,特别是在这个网站,我印象深刻的是,以下文章: 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 est.gif", 115, 115) ctrAbout.AddDisplayBitmap("imagespic0.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 est.gif",115,115); ctrAbout.AddDisplayBitmap(@"imagespic0.BMP",320,240); ctrAbout.StartScrolling() }
总结 我们现在知道如何创建一个定制的用户控制在。net框架为特定的目的。我们也看到,一个新的继承的类,用于管理自己的对象集合是非常简单的。这个滚动AboutBox有一些高级功能,我想改善例如文本包装,超链接对象,动画形象等。但由于我消的时候,我刚刚创建的这篇文章,希望这种开放源代码的人可以帮我做一个新的有用的滚动AboutBox版本。 历史 2004年10月25日,1.0版。 文章提交。 2006年1月20日 丹•Morphis更新。 本文转载于:http://www.diyabc.com/frontweb/news8412.html