.NET finom scroll

.NET finom scroll
2007-09-17T11:03:14+02:00
2007-09-25T10:14:19+02:00
2022-07-25T19:01:25+02:00
*deleted_08849376
Kellene nekem egy smooth scroll-os fényújság-szerű csík. Megcsináltam GDI+-szal, de a végeredmény elég gázos, meglehetősen ocsmányul villog a felirat doublebufferrel is, sőt ha bitmap-be rajzolom majd a bitmapot rajzolom ki akkor is. Nincs valakinek ötlete hogy hogy lehetne ezt szépen megcsinálni, úgy hogy egyrészt ne kelljen hozzá 20+ megabyte run-time-ot letölteni a felhasználónak és .NET 2 alatt is működjön (WPF kizárva) és ne használja el egy szuperszámítógép számítási kapacitását? Egyrészt az SDL-en filózok bár picit az is lassúcska volt amikor utoljára ilyesmit játszottam vele, másrészt meg valami DirectX-es vagy OpenGL-es megoldáson, de nem igazán tudom hogy mi lenne a legjobb. Valaki csinált már ilyesmit ?
Mutasd a teljes hozzászólást!
Nekem egyik módszer sem villogott ennél a példánál. Kipróbáltam a demo-t, nincs villogás. Van forráskód is.
Mutasd a teljes hozzászólást!

  • Nálam az a demó is elég csúful villogott.

    Én amúgy ezt csinálom.

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace Scroll { public partial class ScollBox : UserControl { string txt; Bitmap bmp = null; public ScollBox() { InitializeComponent(); } public string Txt { get { return txt; } set { txt = value; Graphics g = CreateGraphics(); SizeF sf = g.MeasureString(txt, Font); int w = (int)sf.Width; int h = (int)sf.Height; Bitmap newBmp = new Bitmap(w,h); Graphics fx = Graphics.FromImage(newBmp); fx.FillRectangle(Brushes.Gold,0,0, w, h); fx.DrawString(txt, Font, Brushes.Blue, 0, 0); bmp = newBmp; } } public int Interval { get { return timer1.Interval; } set { timer1.Interval = value; } } int px = 0; int pi = 1; private void timer1_Tick(object sender, EventArgs e) { px+=pi; if (px > 500) pi = -1; if (px < 0) pi = 1; Graphics g = CreateGraphics(); Bitmap bmx = new Bitmap(ClientRectangle.Width, ClientRectangle.Height); Graphics gx = Graphics.FromImage(bmx); gx.FillRectangle(Brushes.Gold, ClientRectangle); if (bmp!=null) gx.DrawImage(bmp, px, 0); g.DrawImage(bmx, new Point(0, 0)); } } }

    A usercontrolon egy timer1 nevű timer van engedélyezve, annak a tick-je mozgatja a feliratot.

    Bocs hogy kicsit gány a kód de ez már a 120. változat...
    Mutasd a teljes hozzászólást!
  • Nálam az a demó is elég csúful villogott.


    Ja, és Vista-n nézem. Akkor bocs, nem tudom kipróbálni, mert a VPC-met is leselejteztem, mióta megy a VS 2008 a gépemen.
    Mutasd a teljes hozzászólást!
  • Vista-n a kódod sem villog.
    Mutasd a teljes hozzászólást!
  • Nálam XP-n sajnos igen, méghozzá elég csúnyán. Lehet hogy végül .NET 3 és WPF lesz a dolog vége...
    Mutasd a teljes hozzászólást!
  • Lehet az kéne . Nálam a sima GDI-s komponensek közül is volt egy (a control átméretező), ami meg XP-n nem, de Vista-n meg villog, amikor mutatja egérhúzás közben a téglalapot, amekkorává átméreteződik elengedéskor a control. Nyilván ez azért van, mert anno erre a szutyokra optimalizáltam be. De Vista-n erre nem lenne szükség, mert az végre képes normálisan festeni.
    Mutasd a teljes hozzászólást!
  • Mindenesetre enyhén szólva bosszantó hogy egy olyan egyszerű műveletet mint egy finom scroll amit anno ZX-Spectrumon és C64-en is gond nélkül meg tudtam oldani pár sor assemblyvel XP-n .NET 2.0 mellett nem tudok . És nem azért mert maga a bitmap műveletek lassúak, hanem a megjelenítés vacakol valamiért.
    Mutasd a teljes hozzászólást!
  • Elmondom mi a poén, kipróbáltam XP-n a kódod, nálam se villog egy picit se.
    Mutasd a teljes hozzászólást!
  • Ha nálam ha a doublebuffered be van kapcsolva akkor kevésbé villog, ha nincs akkor nagyon. Az interval-tól is függ, ha 20 körül van akkor nálam nem nagyon villog, ha 1 vagy ha Pl. 100 akkor elég rondán. Amúgy alaplapra integrált GF6000-es kártya és TFT monitor, régebbi 3D-s játékok csont nélkül mennek rajta, de Pl. a flash sem villog. Egyedül ez a nyomorú scroll
    Mutasd a teljes hozzászólást!
  • és, ha szerepel ez is a codeban:

    protected override void OnPaintBackground(PaintEventArgs e) { //base.OnPaintBackground(e); }
    Mutasd a teljes hozzászólást!
  • Én 1-re nyomtam az interval-t és egyáltalán nem villogott a DoubleBuffered beállítása nélkül. Nálad valami más gebasz van.
    Mutasd a teljes hozzászólást!
  • Ez picit javít a helyzeten ha a doublebuffer ki van kapcsolva. Egyékbént nem igazán változtat a helyzeten.
    Mutasd a teljes hozzászólást!
  • Most kipróbáltam egy másik gépen is (az egyik gép ep egy 3800+-os AM2 Dual procis, 1 Ghz-es procival NVidia GF6000-es gép, a másik egy 2Ghz-es laptop ATI vezérlővel. Mind a kettőn villog. Igazából nem annyira vészes csak csúnya, én olyan szép folyamatos csíkot szeretnék mint a hírtv-ben és más csatornákon is van csak keskenyebbet, olyan 20 pixel magasat. De nem villoghat egy picit sem.
    Mutasd a teljes hozzászólást!
abcd