[DirectX] EditControl de DXUT

Le côté programmation du développement d'un jeu vidéo.

EditControl de DXUT

Messagepar grob1212 » 16 Mar 2006, 00:09

Bonsoir,

je suis entrain d'implémenter une petite interface graphique qui utilise les contrôles DXUT de DX9.
Mon problème est que le contrôle EDIT refuse apparemment l'emploi des touches flèches pour le déplacement dans le texte. Quelqu'un a-t-il eu le même problème (ou une âme charitable pourrait ouvrir le sample CustomUI du SDK pour savoir si le problème ne vient pas de moi) ?

Merci d'avance
grob1212
Hello World, I'm new !
 
Messages: 277
Inscription: 13 Avr 2005, 15:12

Messagepar Lenolian » 16 Mar 2006, 03:07

Le code de traitement des touches pour une EditBox, en C# :

Code: Tout sélectionner
       
 /// <summary>Handle keyboard input to the edit box</summary>
public override bool HandleKeyboard( Microsoft.Samples.DirectX.UtilityToolkit.NativeMethods.WindowMessage msg, IntPtr wParam, IntPtr lParam)
        {
            if (!IsEnabled || !IsVisible)
                return false;

            // Default to not handling the message
            bool isHandled = false;
            if (msg == NativeMethods.WindowMessage.KeyDown)
            {
                switch ((System.Windows.Forms.Keys)wParam.ToInt32())
                {
                    case System.Windows.Forms.Keys.End:
                    case System.Windows.Forms.Keys.Home:
                        // Move the caret
                        if (wParam.ToInt32() == (int)System.Windows.Forms.Keys.End)
                            PlaceCaret(textData.Text.Length);
                        else
                            PlaceCaret(0);
                        if (!NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ShiftKey))
                        {
                            // Shift is not down. Update selection start along with caret
                            textData.SelectionStart = caretPosition;
                            FocusText();
                        }

                        ResetCaretBlink();
                        isHandled = true;
                        break;
                    case System.Windows.Forms.Keys.Insert:
                        if (NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ControlKey))
                        {
                            // Control insert -> Copy to clipboard
                            CopyToClipboard();
                        }
                        else if (NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ShiftKey))
                        {
                            // Shift insert -> Paste from clipboard
                            PasteFromClipboard();
                        }
                        else
                        {
                            // Toggle insert mode
                            isInsertMode = !isInsertMode;
                        }
                        break;
                    case System.Windows.Forms.Keys.Delete:
                        // Check to see if there is a text selection
                        if (caretPosition != textData.SelectionStart)
                        {
                            DeleteSelectionText();
                            RaiseChangedEvent(this, true);
                        }
                        else
                        {
                            if (caretPosition < textData.Text.Length)
                            {
                                // Deleting one character
                                textData.Text = textData.Text.Remove(caretPosition, 1);
                                RaiseChangedEvent(this, true);
                            }
                        }
                        ResetCaretBlink();
                        isHandled = true;
                        break;

                    [B]case System.Windows.Forms.Keys.Left:[/B]
                        if (NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ControlKey))
                        {
                            // Control is down. Move the caret to a new item
                            // instead of a character.
                        }
                        else if (caretPosition > 0)
                            PlaceCaret(caretPosition - 1); // Move one to the left

                        if (!NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ShiftKey))
                        {
                            // Shift is not down. Update selection
                            // start along with the caret.
                            textData.SelectionStart = caretPosition;
                            FocusText();
                        }
                        ResetCaretBlink();
                        isHandled = true;
                        break;

                   [B] case System.Windows.Forms.Keys.Right:[/B]
                        if (NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ControlKey))
                        {
                            // Control is down. Move the caret to a new item
                            // instead of a character.
                        }
                        else if (caretPosition < textData.Text.Length)
                            PlaceCaret(caretPosition + 1); // Move one to the left
                        if (!NativeMethods.IsKeyDown(System.Windows.Forms.Keys.ShiftKey))
                        {
                            // Shift is not down. Update selection
                            // start along with the caret.
                            textData.SelectionStart = caretPosition;
                            FocusText();
                        }
                        ResetCaretBlink();
                        isHandled = true;
                        break;

                    case System.Windows.Forms.Keys.Up:
                    case System.Windows.Forms.Keys.Down:
                        // Trap up and down arrows so that the dialog
                        // does not switch focus to another control.
                        isHandled = true;
                        break;

                    default:
                        // Let the application handle escape
                        isHandled = ((System.Windows.Forms.Keys)wParam.ToInt32()) == System.Windows.Forms.Keys.Escape;
                        break;
                }
            }

            return isHandled;
        }


En caractère gras on voit qu'il prend bien en compte les touches <- et -> Est-ce que tu peut décrire un peu plus ton problème?

Un truc qui pourrait faire que cela ne marche est qu'un autre élément de la GUI reçoit et répond à l'evenement touche appuyée en premier et empêche par la-même l'editbox d'y répondre.
J'ai toujours raison, même quand j'ai tort car alors j'ai raison d'avoir tort.
Avatar de l’utilisateur
Lenolian
Hello World, I'm new !
 
Messages: 799
Inscription: 10 Avr 2005, 16:17
Localisation: Toulouse

Messagepar grob1212 » 16 Mar 2006, 09:31

Apparemment, il y a une erreur dans le code :

bool CDXUTEditBox::MsgProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
if( !m_bEnabled || !m_bVisible )
return false;

switch( uMsg )
{
// Make sure that while editing, the keyup and keydown messages associated with
// WM_CHAR messages don't go to any non-focused controls or cameras
case WM_KEYUP:
case WM_KEYDOWN:
return true;

Dans la procédure, WM_KEYUP and DOWN terminent la fonction en renvoyant un booléen (ce qui est conforme à la logique développé dans leur commentaire). Seulement, le traitement des messages de type LEFT, RIGHT, etc est effectué dans la fonction HandleKeyboard... ...qui n'est pas appelé lorsque MsgProc renvoie true à la suite d'un KEYDOWN. J'ai donc changé la valeur précédente et ca marche correctement maintenant.

Merci pour ton aide Lénolian.

PS: j'avais également essayé le sample CustomUI sur une autre machine et les touches fléchées ont montré le même comportement.
grob1212
Hello World, I'm new !
 
Messages: 277
Inscription: 13 Avr 2005, 15:12


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 7 invités

cron