65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的 C# 滚动关于框控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.22/5 (12投票s)

2004年11月5日

4分钟阅读

viewsIcon

191083

downloadIcon

2797

描述了如何用C#创建一个简单的滚动关于框用户控件。该控件可以管理其显示对象列表,包括文本或图像。

引言

我希望在我的项目中有一个可以显示文本、图像并自动滚动它们作为鸣谢对话框的滚动关于框。这是我希望添加到我的一些已完成应用程序中的一个附加功能。在花费了数小时在网上搜索后,我发现了一些文章和示例代码,尤其是在这个网站上,我被以下文章所打动:

以上两篇文章都做得很好,但并非我想要的。这些程序是用Visual C++ 6.0Visual C++ 7.1(.NET)开发的,但使用了MFC,因此我无法基于它们的模块构建C#控件。我不得不修改它们以适应我的工作。

背景

正如前面所说,这些示例程序使用了MFC来方便编码。MFC中的函数CreateCompatibleDCCreateCompatibleBitmapSelectObject等是图像处理和操作绘图窗口设备上下文的常用方法。但是,我现在使用VB.NET或C#在.NET Framework中工作,因此上述程序对我来说已不再有用。

我开始在互联网上搜索,并在MSDN中查找,了解到C#可以通过一种变通方法来使用旧的Win32 API图形函数进行平滑绘图。这个想法是让C#知道您将使用非托管DLL中的一些函数,使用DllImport属性。关于DllImport的详细文档可以在.NET文档中找到。我是C#新手,所以用这种方式解决问题对我来说太困难了。

幸运的是,我们可以在.NET中使用图形的System.Drawing命名空间来实现相同的目标。与MFC相比,.NET中的图像渲染更加简单高效。Graphics类中有两个函数用于将您的Image对象渲染到屏幕上,它们是DrawImageDrawImageUnscaled。因此,我们将把我们的离屏绘图在一个Image对象中完成。之后,我们可以使用这些函数将该对象直接渲染到DC,并获得平滑的动画效果。

在我的代码中,我将尝试在控件的OnPaint()事件中绘制所有显示对象。

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函数之前绘制的。在这种情况下,我们的控件是一个自动滚动的关于框,所以我们必须有一个计时器来控制滚动速度。在计时器滴答事件中绘制离屏图像并手动调用OnPaint()函数是可以的。看看这个:

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

下一部分将描述滚动关于框如何管理其显示对象。此控件有两种类型的显示对象:文本对象和图像对象。可以使用一种通用方法将所有这些对象保存在一个列表中。NET支持一些集合基对象,如ArrayListHashTableQueueStackSortedList等,它们可以轻松使用。但是,我们想要自己的列表来存储特定的显示对象,所以我们应该从可用的对象中继承一个新的类。我们有clsDisplayList来管理显示对象,如下所示:

// 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;
        }
    }
}

对于显示对象,它包含一个具有所有必要成员变量和相应属性的类。滚动关于框将使用这些属性来正确地在屏幕上绘制显示对象。

// 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()实例,并提供一些方法来添加新的显示对象。

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\Debug\ScrollerAbout.dll

拥有DLL文件后,创建一个新的Windows应用程序项目。在设计窗口中,请打开“工具箱”选项卡,右键单击并选择“添加/删除项”。然后浏览到我们的DLL文件,选择它并按OK。您的工具箱中将出现一个滚动关于框控件。

现在您可以将关于框控件拖放到.NET应用程序中的任何窗体上并开始使用它。下面的代码展示了如何在窗体加载时初始化并向关于框控件传递参数。

' 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 Framework中为特定目的创建自定义用户控件。我们也看到创建新的继承集合类来管理我们自己的对象非常简单。这个滚动关于框有一些我希望改进的高级功能,如文本换行、超链接对象、动画图像等。但由于时间关系,我只写了这篇文章,希望通过这个开源代码,有人能帮助我制作一个新的有用的滚动关于框版本。

历史

  • 2004年10月25日 - 版本1.0。
    • 文章已提交。
  • 2006年1月20日
    • 由Dan Morphis更新。
© . All rights reserved.