一个简单的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	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

原文地址:https://www.cnblogs.com/Dincat/p/13467888.html