Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Snap to grid

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een grid maken op een form, en ervoor zorgen dat mijn muis hier op snapt.

Momenteel heb ik volgende code:


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void drawgrid()

        {
            Graphics g = this.CreateGraphics();

            for (float i = 0; i <= this.ClientSize.Width; i += 20 * 1)
            {

                for (float j = 0; j <= this.ClientSize.Height; j += 20 * 1)
                {

                    g.DrawLine(Pens.Black, new Point((int)i, (int)j), new Point((int)i + 1, (int)j));

                }

            }


private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            int grid = 1;
            Point pos = new Point(grid * ((e.X + grid / 2) / grid), grid * ((e.Y + grid / 2) / grid));
            Cursor.Position = this.PointToScreen(pos);
         }



Het grid wordt getekend, als ik componenten in mijn bestaand programma sleep, moet ik het grid de hele tijd refreshen wat veel CPU power kost.

Maar het eigenlijke probleem is dat mijn cursor nu traag beweegt, maar niet echt wilt snappen op het grid.
Iemand een idee?

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Je kunt een aantal dingen doen:
- Invalidate goed te implementeren waardoor je alleen het stuk grid opnieuw tekent waar net iets overheen gesleept is.
- DoubleBuffered property aanzetten wat sowiezo scheelt in het knipperen

Nu met Land Rover Series 3 en Defender 90


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik denk dat je sowieso niet de cursor zelf wilt snappen. Met een te breed grid zal de cursor gevangen worden op een grid point en zal het veel moeite kosten om hem eruit te krijgen, want elke keer wordt hij weer teruggezet op dat gridpoint - je hebt dan een beweging nodig die groter is dan de snap area.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn schreef op dinsdag 19 februari 2008 @ 13:31:
Ik denk dat je sowieso niet de cursor zelf wilt snappen. Met een te breed grid zal de cursor gevangen worden op een grid point en zal het veel moeite kosten om hem eruit te krijgen, want elke keer wordt hij weer teruggezet op dat gridpoint - je hebt dan een beweging nodig die groter is dan de snap area.
Zo had ik het nog niet bekeken, wat is hier dan een betere manier voor?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

De cursor gewoon z'n ding laten doen, en de componenten die je erin sleept zelf snappen tijdens het plaatsen.

[ Voor 7% gewijzigd door .oisyn op 19-02-2008 13:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Als ik bij mijn code die ik nu heb, mijn picturebox laat snappen ipv mijn cursor, krijg ik 2 pictureboxen te zien én ze worden nog op de verkeerde positie geplaatst.

Ik ga er van uit dat deze code waardeloos is voor deze toepassing en ik een totaal andere richting uit moet.

Maar welke??

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19-11 23:43

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je moet ook eerst delen door grid en daarna weer vermenigvuldigen met grid, anders maakt het geen verschil :)

.edit: oh wacht dat doe je ook, er staan haakjes om de deling.

[ Voor 23% gewijzigd door .oisyn op 19-02-2008 15:02 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb hier volgend stuk code gevonden op het net:


C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
int GRID_SPACING = 10;
bool m_Drawing;
Bitmap m_BufferBitmap;
Graphics m_BufferGraphics;
int m_X1;
int m_Y1;
int m_X2;
int m_Y2;

    
    private void SaveSnapshot() {
        Bitmap new_bitmap;
        //  Make a new bitmap that fits the PictureBox.
        new_bitmap = new Bitmap(picCanvas.Size.Width, picCanvas.Size.Height);
        m_BufferGraphics = Graphics.FromImage(new_bitmap);
        //  Clear the new bitmap.
        m_BufferGraphics.Clear(picCanvas.BackColor);
        //  Draw the positioning grid.
        DrawGrid(new_bitmap);
        //  Copy the existing bitmap's contents into
        //  the new bitmap.
        if (!(m_BufferBitmap == null)) {
            m_BufferGraphics.DrawImage(m_BufferBitmap, 0, 0);
        }
        //  Save the new bitmap and graphics objects.
        m_BufferBitmap = new_bitmap;
    }
    
    //  Redraw the saved buffer.
    private void DrawPicture(Graphics gr) {
        if (!(m_BufferBitmap == null)) {
            gr.DrawImage(m_BufferBitmap, 0, 0);
        }
        //  Start drawing a rubberband line.
    }
    
    void picCanvas_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
        //  Do nothing if this isn'tthe left mouse button.
        if ((e.Button != MouseButtons.Left)) {
            return;
        }
        m_Drawing = true;
        SaveSnapshot();
        //  Save the current mouse position.
        m_X1 = e.X;
        m_Y1 = e.Y;
        SnapToGrid(m_X1, m_Y1);
        m_X2 = m_X1;
        m_Y2 = m_Y1;
    }
    
    //  Continue drawing the rubberband line.
    private void picCanvas_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
        //  Do nothing if we're not drawing.
        if (!m_Drawing) {
            return;
        }
        //  Save the new point.
        m_X2 = e.X;
        m_Y2 = e.Y;
        SnapToGrid(m_X2, m_Y2);
        //  Erase the previous line.
        Graphics gr = picCanvas.CreateGraphics();
        DrawPicture(gr);
        //  Draw the new line directly on the PictureBox.
        gr.DrawLine(Pens.Gray, m_X1, m_Y1, m_X2, m_Y2);
    }
    
    //  Finish drawing the new line.
    private void picCanvas_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) {
        //  Do nothing if we're not drawing.
        if (!m_Drawing) {
            return;
        }
        m_Drawing = false;
        m_BufferGraphics.DrawLine(Pens.Blue, m_X1, m_Y1, m_X2, m_Y2);
        //  Redraw to show the new line.
        DrawPicture(picCanvas.CreateGraphics());
    }
    
    //  Snap the point to the grid.
    private void SnapToGrid(ref int X, ref int Y) {
        X = (GRID_SPACING * int.Parse((X / GRID_SPACING)));
        Y = (GRID_SPACING * int.Parse((Y / GRID_SPACING)));
    }
    
    //  Draw the positioning grid.
    private void DrawGrid(Bitmap bm) {
        for (int Y = 0; (Y 
                    <= (bm.Height - 1)); Y = (Y + GRID_SPACING)) {
            for (int X = 0; (X 
                        <= (bm.Width - 1)); X = (X + GRID_SPACING)) {
                bm.SetPixel(X, Y, Color.Black);
            }
        }
    }
    
    //  Redraw the picture.
    private void picCanvas_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {
        DrawPicture(e.Graphics);
    }
    
    //  Make the initial grid.
    private void Form1_Load(object sender, System.EventArgs e) {
        SaveSnapshot();
    }
    
    //  Make the new grid.
    private void picCanvas_Resize(object sender, System.EventArgs e) {
        SaveSnapshot();
    }


Dit programma zou een grid moeten tekenen, waar je lijnen in het grid kan tekenen met snap to grid; ideaal wat ik nodig heb waar ik al 2 dagen mee vast zit.

Echter heb ik volgende errors:

Op regel 83 en 84: The best overload method match for "int.parse(string)' has invalid arguments; argument 1: cannot convert from int to string.


Kan iemand deze syntaxis fout verbeteren aub?

  • Sijmen
  • Registratie: November 2004
  • Laatst online: 01-10 13:44
Int32.Parse() wordt gebruikt om een getal uit een string uit te lezen. Je hebt in dat stukje helemaal niks met strings te maken voor zover ik kan zien, je kunt die kunt die methode call er dus gewoon uit halen.

Verwijderd

Topicstarter
Danku!

Het werkt! _/-\o_
Pagina: 1