Déplacement comme dans Photoshop /Windows Form C# Visual Studio/ [Résolu]

Signaler
Messages postés
55
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
16 février 2020
-
Whismeril
Messages postés
14245
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 février 2020
-
YO !

Je vous situe le contexte :

J'ai eu envie de créer une appli', j'ai choisis le C#, j'ai cherché comment ça se faisait, j'ai DL tout ce qui fallait, Visual Studio, blablabla, j'apprend les bases de la base sur OpenClassroom, j'ai ensuite enchainé sur la POO en C#, je suis arrivé sur le premier TP et là je me dis que c'est chiant t'utiliser tant d'énergie pour un programme qui ne m'intéresse pas, je créer donc mon Windows Form, et je décide de commencer mon appli. J'ai mon p'tit mémo de tous les trucs à faire à côté, je vois que comme d'habitude j'ai poussé le truc hyper loin et que c'est beaucoup trop complexe pour moi actuellement, je décide donc d'en faire une version ultra simplifié, comme un prototype que je complexifierai de plus en plus en allant dans mon apprentissage.
En même temps de cella je me demande si l'apprentissage sur le tas ce ne serait pas le meilleurs apprentissage pour moi et je décide donc en même temps de tester ce mode de fonctionnement. Mais le truc, c'est qu'il me faut de la matière pour comprendre comment ça marche, du code tout fait que je décortique et essaye de comprendre. Bon, jusque là j'ai réussi à avoir des bouts de code par si par là qui correspondaient à ce que je voulais faire j'en ai compris une partie et j'ai réussi à les faire fonctionner ensemble, jusqu'à ce truc que je n'ai trouvé nul part et que j'arrive pas à programmer :



Dans Photoshop il y a un outil, l'outil main, qui permet de ce "déplacer" dans l'image, on peut maintenir ESPACE, le clique gauche enfoncé et se déplacer pour l'utiliser rapidement. (comme sur le GIF)

J'aimerais ça mais dans mon appli', en sachant que je peux faire apparaître des contrôles utilisateur, avec un bouton du menu contextuel de mon formulaire principal, qui se créent à la position de mon curseur, et que je peux déplacer.

Il me faut donc une zone (le rectangle blanc) de délimitation dans laquelle ces contrôles (rectangle gris) peuvent se déplacer.

J'imagine un code qui devrait faire ça :
- Créer le contrôle utilisateur à l'emplacement de la souris. (déjà fais)
- Ancre le contrôle utilisateur au panel (le rectangle blanc) qui ferait une très grande taille de départ pour avoir de la marge (par la suite je pourrai créer quelque chose pour modifier sa taille, je verrai plus tard pour ça)
- Créer des événements quand on appuie sur ESPACE et clique gauche en même temps et déplacer la souris sur le panel, se qui ferait déplacer le panel et par conséquent le contrôle utilisateur qui restera toujours au même point sur le panel.

- Ou -

On se passe du panel et on bouge tous les contrôles utilisateur en même temps. Chose que je sais encore moins faire.

Voilà, j'en viens à l'aide de celui ou celle qui pourrait me dénicher ça de ses vieux fichiers, ou de je ne sais où, ou qui aurait des tutos en lien avec ce que je recherche en anglais ou en français ça ne me dérange pas, aled.

3 réponses

Messages postés
14245
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 février 2020
462
Bonjour

Je n’ai pas photoshop, mais dans d’autres logiciel de photo ce que tu décris n’est possible que si la.photo n’est pas affichée en plein écran (zoom).

Je vais donc partir de cette même hypothèse : ton panel déborde du formulaire.
Il te suffit de mettre la propriété AutoScroll du formulaire à true, ainsi un ascenseur vertical et un horizontal apparaîtront.
Ensuite dans l’événement MouseClick tu vérifies le bouton et la touche espace du clavier pour associer ou non la position des ascenseurs au déplacement de la souris.
Pearusdoancaia
Messages postés
55
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
16 février 2020
6
Ah, c'est aussi simple que ça, yes. Bah merci !

Bon, le truc de déplacer les ScrollBar avec le déplacement de la souris bug un peu, elles clignotes, vont au début et reviennent à l'endroit voulu, quand on relâche tout on a une chance sur deux de tomber sur le début ou l'endroit voulu puis, si on arrive à l'endroit voulu et qu'on veut se redéplacer elles reviennent au début. Mais bon, en soit, pour une version simplifié de ce que je veux faire ça me va de me déplacer en cliquant sur les barres.
Bonjour

ça me chiffonnait ton histoire <bloc>elles clignotes, vont au début et reviennent à l'endroit voulu, quand on relâche tout on a une chance sur deux de tomber sur le début ou l'endroit voulu puis, si on arrive à l'endroit voulu et qu'on veut se redéplacer elles reviennent au début</bloc>

J'ai eu un peu de temps pour faire un test rapide. Avec AutoScroll et Keypreview à True
        private Point origine;
        private int scrollH;
        private int scrollV;
        private bool espace = false;

        private double kx = 1; // coeff de "vitesse" de défilement par rapport au déplacement de la souris, à affiner
        private double ky = 1;
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space)
                espace = true;
            else
                espace = false;
        }

        private void Form1_KeyUp(object sender, KeyEventArgs e)
        {
            espace = false;
        }

        private void Panel1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                origine = MousePosition;
                scrollH = HorizontalScroll.Value;
                scrollV = VerticalScroll.Value;
            }
        }

        private void Panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right & espace)
            {
                int h = scrollH + (int)((MousePosition.X - origine.X)* kx);
                int v = scrollV + (int)((MousePosition.Y - origine.Y) * ky);

                if (h < 0)
                    h = 0;
                else if (h > HorizontalScroll.Maximum)
                    h = HorizontalScroll.Maximum;

                if (v < 0)
                    v = 0;
                else if (v > VerticalScroll.Maximum)
                    v = VerticalScroll.Maximum;

                HorizontalScroll.Value = h;
                VerticalScroll.Value = v;
            }
        } 


Je n'ai pas de soucis.
J'ai laissé la possibilité de régler la vitesse de défilement avec un coéficient.
Pearusdoancaia
Messages postés
55
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
16 février 2020
6
Oui, je ne me suis pas trop éternisé là dessus, j'ai sûrement fais n'importe quoi. Merci pour le code, ça me servira quand je voudrai implémenté cette mécanique du clique + ESPACE enfoncé.
Messages postés
14245
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 février 2020
462
De rien