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

[C#] PictureBox Drag & Drop

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik kan in mijn programma pictureboxen genereren via een button, en via drag en drop op een form plaatsen.

Nu heb ik op mijn form één grote picturebox geplaatst, wat het eigenlijke werkveld wordt. Ik ben voor een picturebox gegaan, omdat hierin een grid en lijnen worden getekend.

Dit alles wordt met deze code aangestuurd:

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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
 int teller_transfo, teller_vermogen, teller_scheider, teller_motor;
        Point pos, pos2, grid2;



        int grid_spacing = 30;
        bool m_drawing;
        Bitmap m_BufferBitmap;
        Graphics m_bufferGraphics;
        int m_X1, m_Y1, m_X2, m_Y2;
        bool dragging;
        int curX, curY;



        private void SaveSnapshot()
        {
            Bitmap new_Bitmap;
            new_Bitmap = new Bitmap(picCanvas.Size.Height, picCanvas.Size.Width);
            m_bufferGraphics = Graphics.FromImage(new_Bitmap);
            m_bufferGraphics.Clear(picCanvas.BackColor);
            DrawGrid(new_Bitmap);
            if (!(m_BufferBitmap == null))
            {
                m_bufferGraphics.DrawImage(m_BufferBitmap, 0, 0);
            }
            m_BufferBitmap = new_Bitmap;
        }


        private void DrawPicture(Graphics gr)
        {
            if (!(m_BufferBitmap == null))
            {
                gr.DrawImage(m_BufferBitmap, 0, 0);
            }

        }


        private void SnapToGrid(ref int X, ref int Y)
        {
            X = (grid_spacing * ((X / grid_spacing)));
            Y = (grid_spacing * ((Y / grid_spacing)));
            //X = 10;
            //Y = 10;
        }

      public Form1()
        {
            InitializeComponent();
        }

              private void Form1_Load(object sender, EventArgs e)
        {
            
                        SaveSnapshot();

        }

        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            PictureBox transfo = (PictureBox)e.Data.GetData(typeof(PictureBox));
            transfo.Location = this.PointToClient(new Point(e.X, e.Y));


            //Picturebox wordt geplaatst alsof de cursor in het midden staat van de picturebox ipv linkerbovenhoek
            pos.X = MousePosition.X;
            pos.Y = MousePosition.Y;
            pos2.X = pos.X - 25;
            pos2.Y = pos.Y - 50;
            transfo.Location = pos2;

        }

        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
            grid2.X = MousePosition.X;
            grid2.Y = MousePosition.Y;
            toolStripStatusLabel1.Text = "X Pos:" + MousePosition.X.ToString();
            toolStripStatusLabel2.Text = "Y Pos:" + MousePosition.Y.ToString();
            
        }


        private void btn_transfo_MouseDown(object sender, MouseEventArgs e)
        {
            teller_transfo += 1;
            PictureBox transfo = new PictureBox();
            transfo.Name = "transfo" + teller_transfo;
            transfo.ClientSize = new Size(50, 50);
            transfo.SizeMode = PictureBoxSizeMode.StretchImage;
            try
            {
                transfo.Image = Image.FromFile(@"c:\pic\transfo.jpg");
            }
            catch (Exception error)
            {
                MessageBox.Show(error.Message, "Cannot find pic", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            transfo.MouseDown += new MouseEventHandler(transfo_MouseDown);
            transfo.MouseUp += new MouseEventHandler(transfo_MouseUp);
            transfo.MouseMove += new MouseEventHandler(transfo_MouseMove);
            transfo.MouseDoubleClick += new MouseEventHandler(transfo_MouseDoubleClick);
            transfo.MouseClick += new MouseEventHandler(transfo_MouseRightClick);
            this.Controls.Add(transfo);
            this.DoDragDrop(transfo, DragDropEffects.Move);
            toolStripStatusLabel1.Text = "X Pos:" + MousePosition.X.ToString();
            toolStripStatusLabel2.Text = "Y Pos:" + MousePosition.Y.ToString();

        }

        void transfo_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("transfo dubbelklik");
        }

        void transfo_MouseRightClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                MessageBox.Show("transfo Rechtsklik");
            }
        }

        void transfo_MouseMove(object sender, MouseEventArgs e)
        {
            PictureBox x = (PictureBox)sender;
            if (x.Tag != null && (bool)x.Tag)
           {
                pos.X = MousePosition.X;
               pos.Y = MousePosition.Y;
                pos2.X = pos.X - 25;
                pos2.Y = pos.Y - 50;
                grid2.X = MousePosition.X;
                grid2.Y = MousePosition.Y;
                toolStripStatusLabel1.Text = "X Pos:" + MousePosition.X.ToString();
                toolStripStatusLabel2.Text = "Y Pos:" + MousePosition.Y.ToString();
              ((Control)sender).Location = pos2;

            }
                    
        }


        void transfo_MouseUp(object sender, MouseEventArgs e)
        {
            ((Control)sender).Tag = false;

                      
        }

        void transfo_MouseDown(object sender, MouseEventArgs e)
        {
            ((Control)sender).Tag = true;
           
         
        }


Vermits het form nu niet meer wordt gebruikt, maar wel één grote picturebox, moeten de aangemaakte pictureboxen op die picturebox worden geplaatst.

Ik heb dit geprobeerd:

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
private void Form1_Load(object sender, EventArgs e)
        {
            
            this.picCanvas.AllowDrop = true;
            SaveSnapshot();

        }

void transfo_MouseMove(object sender, MouseEventArgs e)
        {
            
            if (dragging)
            {
                PictureBox x = (PictureBox)sender;
                x.Top = x.Top + (e.Y - curY);
                x.Left = x.Left + (e.X - curX);
            }

            
            
        }


        void transfo_MouseUp(object sender, MouseEventArgs e)
        {
            
            dragging = false;
            
        }

        void transfo_MouseDown(object sender, MouseEventArgs e)
        {
             dragging = true;
            curX = e.X;
            curY = e.Y;
        }

private void picCanvas_DragEnter(object sender, DragEventArgs e)
        {
            {
                if (e.Data.GetDataPresent(DataFormats.Bitmap))
               {
                    e.Effect = DragDropEffects.Copy;
               }
               else
                   e.Effect = DragDropEffects.None;
            } 
        }


private void picCanvas_DragDrop(object sender, DragEventArgs e)
        {
            {
                if ((e.Data.GetDataPresent(DataFormats.Bitmap)))
                {
                   this.picCanvas.Image = (Bitmap)(e.Data.GetData(DataFormats.Bitmap));
              }
           } 
        }


Ik kan nu geen drag en drop uitvoeren op de picturebox, wel op het form. Ook heb ik nog enkele pogingen gewaagd om bestaande code te manipuleren maar zonder resultaat.

Als er een picturebox is geplaatst op het form, dan kan ik deze niet verplaatsen op de picturebox. Het lijkt alsof deze achter de picturebox zit.

Op het net is genoeg source code en voorbeelden te vinden ivm drag & drop , maar zelfs een testcase hiervoor krijg ik niet werkende.
Wat wel raar is, als ik een picturebox plaats op het form in design, en tijdens het runnen deze verplaats met bovenstaande code, dat werkt wel !

Ik zou dus drag en drop op de picturebox willen doen van gegenereerde pictureboxen, die daarna nog verplaatst kunnen worden.

Wat doe ik hier verkeerd?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
Sorry, ik heb niet je hele code doorgekeken (ivm "post alleen relevante code"), maar het eerste wat in me opkomt is dat je AllowDrop op je PictureBox nog op true moet zetten, en de OnDrop (oid) die nu in je Form staat onderdeel laten worden van je PictureBox. Daarvoor kan je misschien beter een custom PictureBox maken die je afleidt van de standaard en vervolgens die gebruikt op je Form.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack