Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Dette kan du enkelt kode selv. Her er et par tips:

TIMER og MONOSPACE FONT

 

Det du kan gjøre er å sette ut en TEXT box som du strekker ut over hele skjermen. Pass på at den strekkes på utsiden av skjermen på den siden du vil mate med tekst

 

Så er trikset å sette opp en TIMER som gjør følgende:

Flytte text kontrollen en pixel til venstre like mange ganger som fontens bredde. Den siste gangen legger du til en bokstav til høyre siden av text kontrollen

minText.text = minText.Text + InnlestBokstav;

og så flytter du hele text kontrollen tilbake til utgangspunktet

 

Dermed får du en scroll effekt. men pass på at du bruker en MONOSPACE font, hvis ikke så blir scrollingen hakkete og pussig å se på.

Lenke til kommentar

Kjempelett å lage med grafikk istedet da, så spiller det heller ingen rolle hva slags font du bruker.

 

public void ScrollPaint( Graphics g, string text, int scroll, float text_width )
{
 int count = (int)(Display.ClientSize.Width / text_width + .5f) + 1;
 int sc = (int)(scroll % text_width);
 for ( int i = 0; i < count; i++ )
 {
	 g.DrawString( text, Display.Font, Brushes.Black, i * text_width  - sc, 0 );
 }
}

Endret av GeirGrusom
Lenke til kommentar
  • 3 uker senere...
Kjempelett å lage med grafikk istedet da, så spiller det heller ingen rolle hva slags font du bruker.

 

public void ScrollPaint( Graphics g, string text, int scroll, float text_width )
{
 int count = (int)(Display.ClientSize.Width / text_width + .5f) + 1;
 int sc = (int)(scroll % text_width);
 for ( int i = 0; i < count; i++ )
 {
	 g.DrawString( text, Display.Font, Brushes.Black, i * text_width  - sc, 0 );
 }
}

 

Prøvde å skrive om den til VB (2005), men står litt fast... Kan noen hjelpe meg? :)

 

	Private Sub Button1_Click(ByVal sender As System.Object, _
									 ByVal e As System.EventArgs) Handles Button1.Click
	ScrollPaint(??, "test", ??, ??)

End Sub

	Private Sub ScrollPaint(ByVal g As System.Drawing.Graphics, _
						ByVal Text As String, _
						ByVal Scroll As Integer, _
						ByVal Text_width As Integer)

	Dim count As Integer = CInt(Me.ClientSize.Width / Text_width + 0.5F) + 1
	Dim sc As Integer = CInt(Scroll / Text_width)

	For i As Integer = 0 To i < count
		i = i + i
		g.DrawString(Text, Me.Font, Brushes.Black, i * Text_width - sc, 0)
	Next

End Sub

Lenke til kommentar

Nesten riktig, med Modulo (%) skrives Mod i Visual Basic 2008, og float oversettes til Single.

Det er også unødvendig å skrive i = i + 1 inne i for løkken din (VB regner med at det skal være slik med mindre du sier noe annet ved å bruke Step)

 

Text_width regner du ut ved å bruke [Graphics].MeasureString, for eksempel slik:

Public Function GetStringWidth(Text As String) As Single
 Using g As Graphics = CreateGraphics()
Return g.MeasureStream(Text, Font).Width
 End Using
End Sub

Lenke til kommentar
  • 3 uker senere...

har testet lenge nå men får det ikke helt til.

 

her er coden eg bruker for og lese av texten som skal vises.

 

feilmeldinge eg får er

 

Error 1 No overload for 'Form1_Paint' matches delegate 'System.Windows.Forms.PaintEventHandler' C:\Documents and Settings\Administrator\Local Settings\Application Data\Temporary Projects\paint test 2\Form1.Designer.cs 41 27 paint test 2

 

hva er overload? hvordan setter eg/bruker eg overload?

 

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace paint_test_2
{
public partial class Form1 : Form
{
	public Form1()
	{
		InitializeComponent();
	}
	public string teXt;
	private void Form1_Load(object sender, EventArgs e)
	{
		string file_name = "c:\\temp\\test.txt";
		{
			System.IO.StreamReader objReader;
			objReader = new System.IO.StreamReader(file_name);

			//textBox1.Text = objReader.ReadToEnd();
			teXt = objReader.ReadToEnd();
			objReader.Close();
		}
	}
	private void Form1_Paint(Graphics g, string text, int scroll, float text_width)
	{
		int count = (int)(this.ClientSize.Width / text_width + .5f) + 1;
		int sc = (int)(scroll % text_width);
		for (int i = 0; i < count; i++)
		{
			g.DrawString(teXt, this.Font, Brushes.Black, i * text_width - sc, 0);
		}

	}
}
}

Lenke til kommentar

hva er det du prøver på her?

Hvorfor heter den funksjonen der Form1_Paint? den har ikke argumentene som Control.Paint krever (object sender, PaintEventArgs e)

 

Skriv en egen funksjon for ticker funksjonen, og deretter trykker du på Form-en, velger events (lynet) blar frem til paint, og dobbeltklikker.

Inni der bare kaller du ticker-tegnefunksjonen med e.Graphics som parameter til g

Lenke til kommentar

ja er med på den, blir det noe slik som det her?

 

texten kommer opp nå men den scroller ikke den kommer bare opp i mange versjoner vedsiden av kverandre.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace paint_test_2
{
public partial class Form1 : Form
{
	public Form1()
	{
		InitializeComponent();
	}
	public string teXt;
	private void Form1_Load(object sender, EventArgs e)
	{
		string file_name = "c:\\temp\\test.txt";
		{
			System.IO.StreamReader objReader;
			objReader = new System.IO.StreamReader(file_name);

			//textBox1.Text = objReader.ReadToEnd();
			teXt = objReader.ReadToEnd();
			objReader.Close();
		}
	}
	public void ScrollPaint(Graphics g, int scroll, float text_width)
	{
		int count = (int)(this.ClientSize.Width / text_width + .5f) + 1;
		int sc = (int)(scroll % text_width);
		for (int i = 2; i < count; i++)
		{
			g.DrawString(teXt, this.Font, Brushes.Black, i * text_width - sc, 0);
		}
	}

	private void Form1_Paint(object sender, PaintEventArgs e)
	{
		Graphics g = e.Graphics;
		ScrollPaint(g, 15, 10);
		//Refresh();
	}

}
}

Lenke til kommentar

Lagde faktisk en klasse for dette for en stund siden:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace SmoothScroller
{
class Scroller
{
	#region Variables
	private Size textSize;
	private Bitmap wholeString;
	private Bitmap compositeString;
	private Bitmap stringToReturn;
	private Graphics drawGraphics;

	private int num=0;

	private int _scrollDelay=20;
	private string _text;
	private long _timeStamp;
	private Font _font = new Font("Sans Serif", 10F,FontStyle.Regular);
	private Color _color = Color.Black;
	private bool _isInitialized=false;
	private Direction _direction = Direction.Left;

	private int index = 0;
	#endregion
	#region Contstructors
	public Scroller(string text, Direction direction)
	{
		_text = text;
		_direction = direction;
	}
	public Scroller(string text, Direction direction, int scrollDelay)
	{
		if (text == null || text == "") throw new ArgumentException("Parameter text cannot be null or empty");
		_text = text;
		_direction = direction;
		if (scrollDelay < 1) throw new ArgumentException("Parameter scrollDelay cannot be negative");
		_scrollDelay = scrollDelay;
	}
	public Scroller(string text, Direction direction, int scrollDelay, Font font)
	{
		if (text == null || text == "") throw new ArgumentException("Parameter text cannot be null or empty");
		_text = text;
		_direction = direction;
		if (scrollDelay < 1) throw new ArgumentException("Parameter scrollDelay cannot be negative");
		_scrollDelay = scrollDelay;
		_font = font;
	}
	public Scroller(string text, Direction direction,int scrollDelay, Font font,Color color )
	{
		if (text == null || text == "") throw new ArgumentException("Parameter text cannot be null or empty");
		_text = text;
		_direction = direction;
		if (scrollDelay < 1) throw new ArgumentException("Parameter scrollDelay cannot be negative");
		_scrollDelay = scrollDelay;
		_font = font;
		_color = color;
	}
	#endregion
	#region Properties
	public int ScrollDelay { get { return _scrollDelay; } set { if (value < 0)throw new ArgumentException("Property ScrollDelay cannot be negative"); _scrollDelay = value; } }
	public string Text { get { return _text; } set { if (value == null || value == "") throw new ArgumentException("Property Text cannot be null or emmpty"); _text = value; _isInitialized = false; } }
	public long TimeStamp { get { return _timeStamp; } }
	public Font Font { get { return _font; } set { _font = value; _isInitialized= false; } }
	public Color Color { get { return _color; } set { _color = value; _isInitialized = false; } }
	public bool IsInitialized { get { return _isInitialized; } }
	public Direction ScrollDirection { get { return _direction; } set { _direction = value; } }
	#endregion
	#region Methods
	public Bitmap Scroll(int pixelsToShow)
	{   
		if (!_isInitialized)
		{
			textSize = TextRenderer.MeasureText(_text, _font);
			wholeString = new Bitmap(textSize.Width, textSize.Height);
			drawGraphics = Graphics.FromImage(wholeString);
			drawGraphics.DrawString(_text, _font, new SolidBrush(_color), new PointF(0F, 0F));
			num = int.Parse(Math.Floor((double)pixelsToShow / wholeString.Width).ToString()) + 2;
			compositeString = new Bitmap(wholeString.Width * num, wholeString.Height);
			drawGraphics = Graphics.FromImage(compositeString);
			for (int i = 0; i < num; i++)
			{ drawGraphics.DrawImage(wholeString, new Rectangle(wholeString.Width * i, 0, wholeString.Width, wholeString.Height), new Rectangle(0, 0, wholeString.Width, wholeString.Height), GraphicsUnit.Pixel); }

			_isInitialized = true;
		}

		stringToReturn = new Bitmap(pixelsToShow, wholeString.Height);
		drawGraphics = Graphics.FromImage(stringToReturn);

		if (((DateTime.Now.Ticks ) - _timeStamp) > _scrollDelay)
		{
			if (_direction == Direction.Left)
			{
				if (index < wholeString.Width)
					index++;
				else
					index = 0;
			}
			else
			{
				if (index > 0)
					index--;
				else
					index = wholeString.Width;
			}
			ResetTimeStamp();
		}

		drawGraphics.DrawImage(compositeString, new Rectangle(0, 0, pixelsToShow, wholeString.Height), new Rectangle(index, 0, pixelsToShow, wholeString.Height), GraphicsUnit.Pixel);
		return stringToReturn;
	}
	public void ResetTimeStamp()
	{ _timeStamp = (long)DateTime.Now.Ticks ; }
	public void ResetIndex()
	{index = 0;}
	#endregion
	#region Enums
	public enum Direction
	{
		Left=0,
		Right
	}
	#endregion
}
}

Lag en ny kontroll med en eller annen form for image property, og putt denne koden innenfor en timer event:

SomeControl.Image = myScroller.Scroll(ScrollerPanel.Width);

Det er to ting som kanskje er verdt å nevne: Teksten vil flikkre litt, og delay propertien kan ikke bli satt lavere enn 15-16.

Endret av Velena
Lenke til kommentar

go ide, så eg tenkte bare for og teste satt opp en label med tallet 1 og fikk denne til og øke me 0.1 pr tick me en timer

 

public int sum1;

private void timer1_Tick(object sender, EventArgs e)
	{
		decimal sum1 = decimal.Parse(verD.Text) + new decimal(0.1);
		verD.Text = sum1.ToString();
	}

	private void Form1_Paint(object sender, PaintEventArgs e)
	{
		Graphics g = e.Graphics;
		ScrollPaint(g, sum1, 10);
		//Refresh();
	}

 

eg ser labelen teller så sum1 verdien øker jo per tick?, men texten beveger seg ikke, ser ikke helt hva eg gjør feil her.

Lenke til kommentar
go ide, så eg tenkte bare for og teste satt opp en label med tallet 1 og fikk denne til og øke me 0.1 pr tick me en timer

 

public int sum1;

private void timer1_Tick(object sender, EventArgs e)
	{
		decimal sum1 = decimal.Parse(verD.Text) + new decimal(0.1);
		verD.Text = sum1.ToString();
	}

	private void Form1_Paint(object sender, PaintEventArgs e)
	{
		Graphics g = e.Graphics;
		ScrollPaint(g, sum1, 10);
		//Refresh();
	}

 

eg ser labelen teller så sum1 verdien øker jo per tick?, men texten beveger seg ikke, ser ikke helt hva eg gjør feil her.

Må du ikke plassere ScrollPaint kallet i timer eventen? Som det er nå blir den jo bare kallt når du gjør noe som krever at formen tegnes på nytt. Og hvorfor definerer du to sum1 variabler? Den som brukes i paint eventen blir jo aldri endret.

Graphics g;
public decimal sum1=0;

private void timer1_Tick(object sender, EventArgs e)
	{
			sum1 += new decimal(0.1);
							ScrollPaint(g, sum1, 10);
	}
			private Form1_Load (object sender, EventArgs e)
			{
			g = Graphics.FromHwnd(this.Handle);
			}

Tror dette skulle bli riktig :ermm:.

Edit: Feil i koden.

Endret av Velena
Lenke til kommentar

For å tegne på nytt kaller du Invalidate()

 

Du kan for eksempel lage en lokal variabel som du setter lik

 

scroll = ++scroll % ClientSize.Width;

 

I timeren, denne verdien sendes i Paint eventet til Scroll funksjonen.

 

Så timeren teller opp scrolleren, og tvinger formen til å repainte ved å kalle Invalidate()

 

int scroll;
private void TimerTick(object sender, ElapsedEventArgs e)
{
 scroll = ++scroll % ClientSize.Width;
 Invalidate();
}
private void Form_Paint(object sender, PaintEventArgs e)
{
 ScrollPaint(e.Graphics, scroll, text_width);
}

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...