IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[WPF] Créer un grip à la manière de PowerPoint


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 14
    Par défaut [WPF] Créer un grip à la manière de PowerPoint
    Bonsoir à tous,
    Je cherche à pouvoir créer le système de grip que l'on peut avoir sous PowerPoint lorsque l'on sélectionne l'objet que l'on vient de créer...

    Il est plus facile ainsi de redimensionner l'objet et de le déplacer que de passer par une boite de propriétés où l'on change les valeurs inscrites...

    L'organisation de la portion du programme est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <Grid x:Class="QuanticStorm.XNA.Controls.XnaControl"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          xmlns:controls="clr-namespace:QuanticStorm.XNA.Controls"
          mc:Ignorable="d" 
          d:DesignHeight="600"
          d:DesignWidth="800"
          SizeChanged="Grid_SizeChanged"
          Loaded="Grid_Loaded"
          Name="xnaGrid">
        <Image Name="xnaImage"
               MouseMove="xnaImage_MouseMove">
             <!-- Contient les input bindings et le context menu -->
        </Image>
     
        <Canvas Name="spriteGripContainer"
                     MouseMove="spriteGripContainer_MouseMove"/>
     
        <Grid Name="cameraSettings"
              Visibility="Hidden">
            <!-- Contient les données servant de "caméra" -->
        </Grid>       
    </Grid>
    Ici nous avons un objet Image qui contient le rendu de la surface XNA.
    Cette surface dessine en interne les sprites qu'on lui envoie et genère une image bitmap qui est renvoyé dans le composant Image.

    Lorsqu'un nouveau sprite est ajouté, on recréé l'image bitmap et on demande à ce que ce nouveau sprite soit sélectionné.

    Pour que l'on voit que le sprite est sélectionné, on créé un objet SpriteGrip.

    Cet objet est un Canvas, qui a la taille du sprite, et sur lequelle 8 boutons sont ajoutés (haut-gauche, haut-centre, haut-droit, etc...)

    Ce grip sera ajouté au canvas nommé spriteGripContainer (cela permet de positionner le grip sur le sprite).

    Le système de caméra n'a aucune importance ici.

    Maintenant le problème se situe sur le grip.

    Le fichier est défini comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <Canvas x:Class="QuanticStorm.XNA.Controls.SpriteGrip"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"          
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
            mc:Ignorable="d" 
            d:DesignHeight="300"
            d:DesignWidth="300"
            SizeChanged="Canvas_SizeChanged">
        <Button Canvas.Top="-5"
                    Canvas.Left="-5"
                    x:Name="topLeftGrip" />
     
        <Button Canvas.Top="-4"
                    Canvas.Left="146"
                    x:Name="topCenterGrip"
                             MouseEnter="GripOnMouseEnter"
                             MouseLeave="GripOnMouseLeave"
                             Click="GripOnClick" />
     
        <Button Canvas.Top="-5"
                    Canvas.Right="-5"
                    x:Name="topRightGrip" />
     
        <Button Canvas.Top="146"
                    Canvas.Left="-4"
                    x:Name="middleLeftGrip"/>
     
        <Button Canvas.Top="146"
                   Canvas.Right="-4"
                   x:Name="middleRightGrip"/>
     
        <Button Canvas.Bottom="-5"
                   Canvas.Left="-5"
                   x:Name="bottomLeftGrip"/>
     
        <Button Canvas.Bottom="-4"
                    Canvas.Left="146"
                    x:Name="bottomCenterGrip" />
     
        <Button Canvas.Bottom="-5"
                    Canvas.Right="-5"
                    x:Name="bottomRightGrip" />
    </Canvas>
    L'evènement SizeChanged permet de replacer les grips en fonction de la taille du Canvas.

    Ma question est : comment je peux faire pour que tant qu'un bouton est cliqué et que la souris bouge le canvas de grips se redimensionne ?

    J'ai essayé les events MouseDown, MouseUp, Click et MouseMove des boutons mais jusqu'ici, bernique...

    Si je fais un Click et que je quitte le bouton, le bouton n'est plus considéré comme cliqué et si je bouge en dehors de la zone du bouton (qui est relativement petit) les évènements MouseMove ne sont plus lancés, donc forcément je n'arrive pas à redimensionner le canvas ...

    Quand aux évènements MouseDown et MouseUp, pour un bouton ils n'ont pas l'air de se lancer. (et ce malgré l'utilisation d'un point d'arrêt dans les méthodes)

    A moins de m'y être mal pris, quels autres moyens y auraient-ils pour que je puisse parvenir à mes fins.


    NOTE : Les évènements ont été enregistrés dans le XAML mais pour plus de simplicité de lecture je les ai retirés...

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut SPRITE ,sizegrip
    bonjour
    Pour deplacer des controles sur un canvas ou un panel (tout container visuel fait l'affaire),tu peux utiliser le "razoir d'occam" c.à.d la classe Adorner ("decorateur") qu'il faut personnaliser.

    Voici un bout de code cree par un certain Denis Vuyka sur le site word.press.com. qui utilise un adorner qui deplace 2 boutons et un controle textbox place sur un canvas.Tu peux rajouter un controle image XNA.
    En tous cas il devrait repondre à tes voeux pour deplacer tes bitmaps XNA avec des "sizegrips" .
    Il suffit de rajouter la classe adorner à ton appli,et deplacer le code exemple dans Windows1 dans la fenetre windows qui contient ton canvas spriteGripContainer.

    ici le code que j'ai utilise pour tester l'adorner sur une image.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    <Window x:Class="adorners.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
     
        <Canvas Name="myCanvas">
            <Button Canvas.Left="49" Canvas.Top="21" Height="23" Name="button1" Width="75">Button1</Button>
            <Button Height="21" Canvas.Left="147" Canvas.Top="23" Width="75">Button2</Button>
            <TextBox Canvas.Left="64" Canvas.Top="60" Height="24" Name="textBox1" Width="128" />
            <Image  Canvas.Left="200"  Canvas.Top="200"  Source="Resources/USA-FLAG.jpg"></Image>
     
        </Canvas>
     
    </Window>
    piece-jointe : le fichier .zip du code source de l'auteur(code source public).
    En tous cas tu dois abandonner ce controle "SpriteGrip",car c'est une mauvaise approche qui n'utilise pas les outils disponibles.
    Il suffit de rechercher un peu dans l'api.
    bon code...........

    ici le lien avec code source de l'auteur en c#:
    http://www.google.fr/url?sa=t&source...eYtHojY2GL6SmQ

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 14
    Par défaut
    Merci, je vais voir tout ça, mais c'est ce qu'il me fallait ...
    (je ne connaissais pas la classe Adorner, je vais aller enquêter sur cette classe)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer liste images de manière automatique
    Par cobe91 dans le forum Android
    Réponses: 5
    Dernier message: 14/06/2015, 07h50
  2. [WPF] créer "path" perso
    Par Zenith dans le forum Windows Presentation Foundation
    Réponses: 28
    Dernier message: 18/11/2009, 10h59
  3. [WPF] Créer un menu style "menu démarrer"
    Par UNi[FR] dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 28/09/2007, 09h49
  4. [WPF] Créer un splash screen
    Par despeludo dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 25/01/2007, 07h41
  5. Créer une variable de manière dynamique
    Par Nelson74 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/11/2006, 23h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo