sommy Skrevet 26. mars 2009 Del Skrevet 26. mars 2009 holder på og sette opp en monitoring skjerm som skal ha en rolling ticker gående helt i bunn av skjermen, er det mulig og mode denne classen for og få den til og hente ut texten som skal scrolles fra en fil som feks ligger på c:\ http://www.c-sharpcorner.com/Forums/Search...searchtext=news eventuelt noen som har link til et script som kan brukes? Lenke til kommentar
HDSoftware Skrevet 30. mars 2009 Del Skrevet 30. mars 2009 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
GeirGrusom Skrevet 30. mars 2009 Del Skrevet 30. mars 2009 (endret) 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 30. mars 2009 av GeirGrusom Lenke til kommentar
_powerade_ Skrevet 15. april 2009 Del Skrevet 15. april 2009 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
GeirGrusom Skrevet 15. april 2009 Del Skrevet 15. april 2009 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
sommy Skrevet 1. mai 2009 Forfatter Del Skrevet 1. mai 2009 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
GeirGrusom Skrevet 1. mai 2009 Del Skrevet 1. mai 2009 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
sommy Skrevet 1. mai 2009 Forfatter Del Skrevet 1. mai 2009 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
Velena Skrevet 1. mai 2009 Del Skrevet 1. mai 2009 (endret) 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 1. mai 2009 av Velena Lenke til kommentar
GeirGrusom Skrevet 1. mai 2009 Del Skrevet 1. mai 2009 texten kommer opp nå men den scroller ikke den kommer bare opp i mange versjoner vedsiden av kverandre. Grunnen er at scroll parameteret har du satt til en konstant verdi. Denne kan du istede øke eller endre med en timer eller lignende. Lenke til kommentar
sommy Skrevet 1. mai 2009 Forfatter Del Skrevet 1. mai 2009 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
Velena Skrevet 2. mai 2009 Del Skrevet 2. mai 2009 (endret) 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 . Edit: Feil i koden. Endret 2. mai 2009 av Velena Lenke til kommentar
GeirGrusom Skrevet 2. mai 2009 Del Skrevet 2. mai 2009 (endret) 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 2. mai 2009 av GeirGrusom Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå