Zmiana miejsca PictureBoxa po kliknięciu myszą

0

Witam,
chciałbym pobierać lokację PictureBoxa A kliknięciem. Nastepnie klikając w PictureBox B chciałbym aby PictureBox A zmienił pozycję na taką jak PictureBox B

 foreach (Control control in Controls)
            {
                if (control is PictureBox)
                { 
                    control.MouseClick += new MouseEventHandler(PictureBoxMouseClick);
                }
            }
        }
 
        int klik = 0;
        private void PictureBoxMouseClick(object sender, MouseEventArgs e)
        {
 
            if (e.Button == MouseButtons.Left)
            {
                if (klik == 0)
                {
                    Point p = this.Location; //pobranie lokacji
                    klik = 1;
                }
                else 
                {
                    if (klik == 1)
                    {
                        //tutaj działanie po kliknieciu w drugi pbx
                        //TU LEZY GLOWNY PROBLEM, NIE WIEM JAK TO ZROBIC
                        klik = 0;
                    }
                }
 
            }
        }    

PS. notka do moderatora: wiem że bardzo podobny post był przeze mnie kiedyś założony jednak nie otrzymałem na nim satysfakcjonującej odpowiedzi.

0

chciałbym pobierać lokację PictureBoxa A kliknięciem. Nastepnie klikając w PictureBox B chciałbym aby PictureBox A zmienił pozycję na taką jak PictureBox B
Wut?

bardzo podobny post był przeze mnie kiedyś założony jednak nie otrzymałem na nim satysfakcjonującej odpowiedzi.
I nie otrzymasz, póki nie wyjaśnisz w sposób zrozumiały, o co tobie chodzi.

1

Chyba chodzi mu o to, co zresztą nie jest dobrym rozwiązaniem, bo trzeba dodać dużo pictureboxów do listy. Zrobiłem na labelach, bo mi się picture boxów nie chce robić.

namespace WFASandbox
{
    public partial class Form1 : Form
    {
        List<Label> labelList;
        LabelWatcher labelWatcher; 

        public Form1()
        {
            InitializeComponent();
            labelWatcher = new LabelWatcher();

            labelList = new List<Label>() { label1, label2, label3 };

            foreach (Label label in labelList)
            {
                label.Click += label_Click;
            }
        }

        void label_Click(object sender, EventArgs e)
        {
            labelWatcher.AddNewLabel(sender as Label);
        }
    }

    class LabelWatcher
    {
        int index;
        Label[] labels;

        public LabelWatcher()
        {
            labels = new Label[2];
            index = 0;
        }

        public void AddNewLabel(Label label)
        {
            labels[index] = label;
            index += 1;
            index %= 2;

            if (index == 0)
            {
                ChangePosition();
            }
        }

        private void ChangePosition()
        {
            labels[0].Location = labels[1].Location;
        }
    }
}

 
0

kurdee, nie wiem jak to lepiej wytłumaczyć. Klikam w picturebox, potem klikam w drugi picturebox i ten pierwszy przenosi się na drugi (zakrywa go)

1

Kod, który zamieściłem powyżej właśnie to robi, tylko na labelach. Wklej sobie 3 labele do pustego projektu o nazwach label1...label3 i sprawdź. Później zmień labele na pictureboxy, powinno być alleluja.

0

ok, coś działa, bardzo dziękuję :D tak naprawdę robię szachy. może pokażę cały kod:

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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<PictureBox> pola; 
        List<PictureBox> figury;
        PictureBoxWatcher pictureBoxWatcher;

        public Form1()
        {
            InitializeComponent();

            pictureBoxWatcher = new PictureBoxWatcher();

            pola = new List<PictureBox> 
            {   H1, H2, H3, H4, H5, H6, H7, H8, 
                G1, G2, G3, G4, G5, G6, G7, G8, 
                F1, F2, F3, F4, F5, F6, F7, F8, 
                E1, E2, E3, E4, E5, E6, E7, E8, 
                D1, D2, D3, D4, D5, D6, D7, D8, 
                C1, C2, C3, C4, C5, C6, C7, C8, 
                B1, B2, B3, B4, B5, B6, B7, B8, 
                A1, A2, A3, A4, A5, A6, A7, A8 };

            figury = new List<PictureBox>
            {   PionBialy1, PionBialy2, PionBialy3, PionBialy4, 
                PionBialy5, PionBialy6, PionBialy7, PionBialy8,
                WiezaBiala1, WiezaBiala2, SkoczekBialy1, SkoczekBialy2,
                GoniecBialy1, GoniecBialy2, KrolBialy, DamaBiala,
                PionCzarny1, PionCzarny2, PionCzarny3, PionCzarny4,
                PionCzarny5, PionCzarny6, PionCzarny7, PionCzarny8,
                WiezaCzarna1, WiezaCzarna2, SkoczekCzarny1, SkoczekCzarny2,
                GoniecCzarny1, GoniecCzarny2, KrolCzarny, DamaCzarna };


            foreach (PictureBox pictureBox in figury)
            {
                pictureBox.Click += pictureBox_Click;
            }
            foreach (PictureBox pictureBox in pola)
            {
                pictureBox.Click += pictureBox_Click;
            }
        }
        
        
        void pictureBox_Click(object sender, EventArgs e)
        {
            pictureBoxWatcher.AddNewPictureBox(sender as PictureBox);
        }   
    }

    class PictureBoxWatcher
    {
        int index;
        PictureBox[] pictureBoxy;

        public PictureBoxWatcher()
        {
            pictureBoxy = new PictureBox[2];
            index = 0;
        }
        public void AddNewPictureBox(PictureBox pictureBox)
        {
            pictureBoxy[index] = pictureBox;
            index += 1;
            index %= 2;

            if (index == 0)
            {
                ChangePosition();
            }
        }

        private void ChangePosition()
        {
            pictureBoxy[0].Location = pictureBoxy[1].Location;
        }
    }
}

Sprawa jest tego typu, że posiadam dwie listy Pictureboxów. pola oraz figury, w obecnym ustawieniu figury wymieniają się miedzy sobą tak jak zakładałem.
Problem jest z tym że:
a) jeśli figura wchodzi na figurę, to ta "pod spodem" powinna zniknąć
b) pictureboxy z polami nie powinny znikać. Powinny "dać się klikać" ale nie przenosić się.

po tych zadaniach będę miał strukturę na której będe już mógł tworzyć zależności między figurami :)
Jeśli mógłbyś pomóc z jakimkolwiek punktem byłbym wdzięczny :)

0

Napisanie szachów nie jest tak prostą sprawą na początek. Potrzebujesz klas, które będą właśnie te rzeczy nadzorować. Dozwolony ruch na planszy(pamiętając o np. roszadzie) czy nastąpiło bicie pionów i całą resztę, o której nie pomyślałem lub nie pamiętam.

Tutaj masz przykład szachów w C#, z kodem źródłowym: http://code.msdn.microsoft.com/windowsdesktop/Huo-Chess-C-C-VB-micro-fea2bb87

Popatrz jak jest rozwiązane. Jest podobny do Twoich picuteboxów. Może tylko planszę wygeneruj inaczej. Wsadzić na twardo 64 pictureboxy do formy, to moim zdaniem masochizm. Myślę, że lepiej wygenerować tę planszę w pętli, wstawiając pole czarne lub białe i zapisywać to do jakiejś tablicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1