[ explorer-1 @ 28.12.2007. 18:57 ] @
Imam problem sa crtanjem u C#. Crtam na panel kontrolu, i sve je ok dok sporo crtam, no kad radim brže poteze mišom linija nije kontinuirana.
Kako bih to mogao riješiti?
(hvala)
[ mmix @ 28.12.2007. 19:51 ] @
Imas negde bottleneck u procesiranju mouse move eventa, daj kod...
[ explorer-1 @ 28.12.2007. 20:04 ] @
Ma mislim da nije štos u tome... al evo

Code:

        public Bitmap crtanje(Bitmap potpisBMP, int X, int Y)
        {
            SolidBrush fill = new SolidBrush(Color.Black);
            Graphics g = Graphics.FromImage(potpisBMP);
            g.FillRectangle(fill, X - 2, Y - 2, 4, 4);
            fill.Dispose();
            g.Dispose();
            return potpisBMP;
        }
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Bitmap trenutniSadrzaj = new Bitmap(pictureBox1.Image);
            if (e.Button == MouseButtons.Left)
            {
                pictureBox1.Image = crtanje(trenutniSadrzaj, e.X, e.Y);
            }
        }


s tim da je ista stvar dali direktno crtam na kontrolu ili prvo u bitmap pa onda proiciram sve na picturebox, također za pictureBox je uključen doublebuffering
[ Predrag Glumac @ 28.12.2007. 20:20 ] @
Nije ti dobar logaritam :P Umesto sto crtas samo jednu tacku (zapravo rectangle) crtaj liniju izmedju prethodne koordinate kurzora i nove koordinate. Bice reckavo, ali ce biti u kontinuitetu.

Drugo, nema potrebe da svaki put pravis novi bitmap, jer je on nasledjen iz Image klase.
[ explorer-1 @ 28.12.2007. 21:12 ] @
Ma opet ista stvar, napravio sam sada kako si rekao, i opet, vidi:

[ Shadowed @ 29.12.2007. 00:56 ] @
Prvo, ne valja ti sto u metodu crtanje svaki put kreiras i unistavas Graphics objekat. Napravi jedan na nivou klase i koristi uvek isti. Tek kad znas da ti vise neces crtati (ili bar na neko vreme, detalji zavise od aplikacije), unisti taj objekat.
Drugo, definitivno nisi napravio da crta liniju od prethodne pozicije do nove, vec i dalje crtas tacke. Potrebno je da prilikom jednog povlacenja linije zabelezis koordinate koje si koristio a onda prilikom sledeceg crtas od tih zabelezenih do novih a zatim nove zabelezis na istom mestu - u promenljivima koje su na nivou klase.
Pokusaj to pa javi kako je proslo, ako ne uspes napisacu ti sutra kod, sad je malo kasno :)
Inace, cak i tada, iako ces imati kontinualnu liniju, prilikom brzih pokreta, ona ce biti izlomljena jer postoji odredjen broj pozicija u jedinici vremena koje Windows "hvata".
[ explorer-1 @ 29.12.2007. 10:43 ] @
A kako da pamtim koordinate?
[ Shadowed @ 29.12.2007. 12:38 ] @
Code:

public partial class Form1 : Form {
    Boolean EditMode = false;
    Bitmap MyBitmap;
    Graphics g;
    Pen MyPen = new Pen(Color.Black, 1);
    int OldX, OldY;
        public Form1() {
        InitializeComponent();
    }
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left) {
            EditMode=true;
            OldX=e.X;
            OldY=e.Y;
        }
    }
    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) {
        if (e.Button == MouseButtons.Left)
            EditMode=false;
    }
    private void Form1_Load(object sender, EventArgs e) {
        MyBitmap = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);
        g = Graphics.FromImage(this.MyBitmap);
        pictureBox1.Image=MyBitmap;
    }
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) {
        if (EditMode) {
            g.DrawLine(MyPen, OldX, OldY, e.X, e.Y);
            OldX=e.X;
            OldY=e.Y;
            pictureBox1.Refresh();
        }
    }
}
[ explorer-1 @ 29.12.2007. 12:57 ] @
Woow.. hvala!