/* Code revised from chapter 9 GDI+ Custom Controls with Visual C# 2005 By Iulian Serban, Dragos Brezoi, Tiberiu Radu, Adam Ward Language English Paperback 272 pages [191mm x 235mm] Release date July 2006 ISBN 1904811604 Sample chapter http://international.us.server12.fileserver.kutayzorlu.com/files/download/2017/01/1604_CustomControls_SampleChapter_uuid-a814f190-9358-4a00-828c-98487bcb382d_crc-0.pdf For More info on GDI+ Custom Control with Microsoft Visual C# book visit website www.packtpub.com */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace FlickerFree { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void tbInterval_Scroll(object sender, EventArgs e) { scrollingText.ScrollTimeInterval = tbInterval.Value; } private void tbAmount_Scroll(object sender, EventArgs e) { scrollingText.ScrollPixelAmount = tbAmount.Value; } /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.scrollingText = new FlickerFree.ScrollingText(); this.grpTrackerBars = new System.Windows.Forms.GroupBox(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.tbAmount = new System.Windows.Forms.TrackBar(); this.tbInterval = new System.Windows.Forms.TrackBar(); this.grpTrackerBars.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).BeginInit(); this.SuspendLayout(); // // scrollingText // this.scrollingText.BackColor = System.Drawing.Color.LightGray; this.scrollingText.Font = new System.Drawing.Font("Verdana", 26.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.scrollingText.ForeColor = System.Drawing.Color.Navy; this.scrollingText.Location = new System.Drawing.Point(38, 29); this.scrollingText.Margin = new System.Windows.Forms.Padding(12, 10, 12, 10); this.scrollingText.Name = "scrollingText"; this.scrollingText.ScrollPixelAmount = 10; this.scrollingText.ScrollTimeInterval = 100; this.scrollingText.Size = new System.Drawing.Size(300, 80); this.scrollingText.TabIndex = 0; this.scrollingText.Text = "Scrolling Text that Scrolls"; // // grpTrackerBars // this.grpTrackerBars.Controls.Add(this.tbInterval); this.grpTrackerBars.Controls.Add(this.tbAmount); this.grpTrackerBars.Controls.Add(this.label2); this.grpTrackerBars.Controls.Add(this.label1); this.grpTrackerBars.Location = new System.Drawing.Point(38, 132); this.grpTrackerBars.Name = "grpTrackerBars"; this.grpTrackerBars.Size = new System.Drawing.Size(322, 183); this.grpTrackerBars.TabIndex = 1; this.grpTrackerBars.TabStop = false; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(7, 37); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(72, 13); this.label1.TabIndex = 0; this.label1.Text = "Scroll Amount"; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(10, 134); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(71, 13); this.label2.TabIndex = 1; this.label2.Text = "Scroll Interval"; // // tbAmount // this.tbAmount.Location = new System.Drawing.Point(101, 19); this.tbAmount.Maximum = 20; this.tbAmount.Name = "tbAmount"; this.tbAmount.Size = new System.Drawing.Size(200, 45); this.tbAmount.TabIndex = 2; this.tbAmount.Value = 1; this.tbAmount.Scroll += new System.EventHandler(this.tbAmount_Scroll); // // tbInterval // this.tbInterval.Location = new System.Drawing.Point(101, 123); this.tbInterval.Maximum = 500; this.tbInterval.Minimum = 10; this.tbInterval.Name = "tbInterval"; this.tbInterval.Size = new System.Drawing.Size(200, 45); this.tbInterval.TabIndex = 3; this.tbInterval.TickFrequency = 10; this.tbInterval.Value = 100; this.tbInterval.Scroll += new System.EventHandler(this.tbInterval_Scroll); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(456, 332); this.Controls.Add(this.grpTrackerBars); this.Controls.Add(this.scrollingText); this.Name = "Form1"; this.Text = "Form1"; this.grpTrackerBars.ResumeLayout(false); this.grpTrackerBars.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.tbAmount)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.tbInterval)).EndInit(); this.ResumeLayout(false); } #endregion private ScrollingText scrollingText; private System.Windows.Forms.GroupBox grpTrackerBars; private System.Windows.Forms.TrackBar tbInterval; private System.Windows.Forms.TrackBar tbAmount; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label1; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } public partial class ScrollingText : UserControl { private string text; private int scrollAmount = 10; private int position = 10; public ScrollingText() { InitializeComponent(); } private void ScrollingText_Load(object sender, EventArgs e) { this.ResizeRedraw = true; if (!this.DesignMode) { scrollTimer.Enabled = true; } } private void scrollTimer_Tick(object sender, EventArgs e) { position += scrollAmount; this.Invalidate(); } [Browsable(true),DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public override string Text { get { return text; } set { text = value; this.Invalidate(); } } public int ScrollTimeInterval { get { return scrollTimer.Interval; } set { scrollTimer.Interval = value; } } public int ScrollPixelAmount { get { return scrollAmount; } set { scrollAmount = value; } } private void ScrollingText_Paint(object sender, PaintEventArgs e) { } protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) { // to avoid a design-time error we need to add the following line if (e.ClipRectangle.Width == 0) { return; } base.OnPaint(e); if (position > this.Width) { // Reset the text to scroll back onto the control. position = -(int)e.Graphics.MeasureString(text, this.Font).Width; } // Create the drawing area in memory. // Double buffering is used to prevent flicker. Bitmap bufl = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height); Graphics g = Graphics.FromImage(bufl); g.FillRectangle(new SolidBrush(this.BackColor), e.ClipRectangle); g.DrawString(text, this.Font, new SolidBrush(this.ForeColor), position, 0); // Render the finished image on the form. e.Graphics.DrawImageUnscaled(bufl, 0, 0); g.Dispose(); } /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.scrollTimer = new System.Windows.Forms.Timer(this.components); this.SuspendLayout(); // // scrollTimer // this.scrollTimer.Tick += new System.EventHandler(this.scrollTimer_Tick); // // ScrollingText // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Name = "ScrollingText"; this.Size = new System.Drawing.Size(400, 100); this.Load += new System.EventHandler(this.ScrollingText_Load); this.Paint += new System.Windows.Forms.PaintEventHandler(this.ScrollingText_Paint); this.ResumeLayout(false); } #endregion internal System.Windows.Forms.Timer scrollTimer; } }