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

MFC Discussion :

Avoir surclassé mon CEdit empèche le fonctionnement correct de la touche Tab!


Sujet :

MFC

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut Avoir surclassé mon CEdit empèche le fonctionnement correct de la touche Tab!
    Bonjour,
    Suite au surclassement de mon CEdit, l'appui sur la touche Tab ne provoque plus le passage au controle suivant comme c'était le cas auparavant.

    J'intercepte la message WM_CHAR, mais je fait rien de particulier avec le charactère Tab

    Avez-vous une idée pour moi rétablir ce fonctionnement?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    comment tu as surclassé ton edit ?
    tu n'as pas intercepté le message WM_GETDLGCODE ?
    la case tab de ton edit est bien cochée ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut
    J'intercepte en effet le message WM_GETDLGCODE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UINT CExtEdit::OnGetDlgCode()
    {
    	return CEdit::OnGetDlgCode()+VK_RETURN;
    }
    La case Tab est bien cochée, si je retourne à la situation précédente pour mon controle (CExtEdit->CEdit)la succession des Tab est correcte.

    Juste pour info
    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
    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
     
    // CExtEdit
    // ExtEdit.cpp : implementation file
    //
     
    #include "stdafx.h"
    #include "Phoenix.h"
    #include "Utilities.h"
    #include "ExtEdit.h"
     
     
    IMPLEMENT_DYNAMIC(CExtEdit, CEdit)
     
    CExtEdit::CExtEdit()
    {
    	m_EditType = eDouble;
    }
     
    CExtEdit::~CExtEdit()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CExtEdit, CEdit)
    	ON_WM_GETDLGCODE()
    	ON_WM_CHAR()
    	ON_WM_SETFOCUS()
    END_MESSAGE_MAP()
     
     
    // CExtEdit message handlers
    UINT CExtEdit::OnGetDlgCode()
    {
    	return CEdit::OnGetDlgCode()+VK_RETURN;
    }
     
    void CExtEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
    	CString str;
    	GetWindowText(str);			// Save string before adding new character
    	CEdit::OnChar(nChar, nRepCnt, nFlags);
    	DWORD dwCurPos = GetSel();
    	double val;
    	// Verify char according selected type
    	switch (m_EditType)
    	{
    		case eAll:
    		break;
    		case eINT:
    		break;
    		case eDouble:
    			{
    				CString NewStr;
    				GetWindowText(NewStr);
    				NewStr.MakeLower();
    				int l = NewStr.GetLength()-1;
    				if (l>0)
    				{
     
    					// Remove 'e' if it is located at the end
    					if (NewStr.Find(_T("e")) == l)
    						NewStr.Delete(l);
    					// Remove 'e' & '+' or '-' if it is located at the end
    					int pos = NewStr.Find(_T("+"));
    					if (pos == l  && NewStr.GetAt(l-1)=='e')
    						NewStr.Delete(l-1,2);
    					pos = NewStr.Find(_T("-"));
    					if (pos == l  && NewStr.GetAt(l-1)=='e')
    						NewStr.Delete(l-1,2);
    				}
    				if (l==0) //only one char
    				{
    					if (NewStr.GetAt(0)=='+'||NewStr.GetAt(0)=='-')
    						NewStr.Delete(0);
     
    				}
    				if (ReadDouble(NewStr,&val) == RD_NOT_NUMBER )
    				{
    					// Cancel character
    					SetWindowText(str);
    					SetSel(dwCurPos,dwCurPos);
    	//				PostMessage(WM_KEYDOWN,VK_END,0);
    	//				PostMessage(EM_SETSEL,0,-1);
    				}
    			}
    		break;
    	}
    	// Notify Enter key to the parent window
       if (nChar == VK_RETURN)
       {
    		NMHDR hdr;
    		hdr.hwndFrom = GetSafeHwnd();
    		hdr.idFrom   = GetDlgCtrlID();
    		hdr.code     = WM_CHAR;
    		GetParent()->SendMessage(WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&hdr);
       }
    }
    void CExtEdit::OnSetFocus(CWnd* pOldWnd)
    {
    	PostMessage(EM_SETSEL,0,-1);
    	CEdit::OnSetFocus(pOldWnd);
    }
    et le .h
    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
     
    #pragma once
     
     
    // CExtEdit
     
    class CExtEdit : public CEdit
    {
    	DECLARE_DYNAMIC(CExtEdit)
     
    public:
    	typedef enum eEditType
    	{
    		eAll,
    		eINT,
    		eDouble,
    	};
    	CExtEdit();
    	virtual ~CExtEdit();
     
    protected:
    	DECLARE_MESSAGE_MAP()
    	eEditType m_EditType;
    	double m_dMax,m_dMin;
    	afx_msg UINT OnGetDlgCode();
    	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    	afx_msg void OnSetFocus(CWnd* pOldWnd);
    public:
    	void SetEditType(eEditType EdiType);
    	void SetMax(double dMax){m_dMax=dMax;};
    	void SetMin(double dMin){m_dMin=dMin;};
    	eEditType GetEditType() {return m_EditType;};
    };

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    je m'en doutais ...
    il vaut mieux passer par pretranslatemessage, et ne pas toucher a getdlgcode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BOOL CEditEx::PreTranslateMessage(MSG* pMsg)
    {
        // TODO : ajoutez ici votre code spécialisé et/ou l'appel de la classe de base
        if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
        {
            TRACE("\nok");
        }
        return CEdit::PreTranslateMessage(pMsg);
    }

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut

    Une fois de plus Merci,
    As-tu une explication pourquoi ON_WM_GETDLGCODE() empêche le Tab de fonctionner?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    les valeurs acceptées sont:
    • DLGC_BUTTON Button (generic).
    • DLGC_DEFPUSHBUTTON Default pushbutton.
    • DLGC_HASSETSEL EM_SETSEL messages.
    • DLGC_UNDEFPUSHBUTTON No default pushbutton processing. (An application can use this flag with DLGC_BUTTON to indicate that it processes button input but relies on the system for default pushbutton processing.)
    • DLGC_RADIOBUTTON Radio button.
    • DLGC_STATIC Static control.
    • DLGC_WANTALLKEYS All keyboard input.
    • DLGC_WANTARROWS Arrow keys.
    • DLGC_WANTCHARS WM_CHAR messages.
    • DLGC_WANTMESSAGE All keyboard input. The application passes this message on to the control.
    • DLGC_WANTTAB TAB key.
    VK_RETURN est donc invalide..
    si le message est traité au niveau du contrôle le parent ne le recoit plus
    il vaut mieux donc passer par pretranslatemsg pour intercepter certaines touches...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155
    Par défaut
    Merci,
    commes tu peux l'imaginer j'ai pompé ce code de la FAQ, il serait peut être interressant de la complèter/corriger.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    quel post de la faq ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Points : 155
    Points
    155

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

Discussions similaires

  1. [Prototype] Empêche d'autres scripts jquery de fonctionner correctement
    Par papisdoums dans le forum Bibliothèques & Frameworks
    Réponses: 6
    Dernier message: 09/02/2012, 04h55
  2. Page qui fonctionne correctement après avoir effacé les cookies
    Par MarathonMan3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/11/2011, 20h14
  3. Mon clonage n'est pas correct ?
    Par elitost dans le forum Langage
    Réponses: 6
    Dernier message: 21/03/2006, 15h38
  4. [IB71] mon Blob ne marche pas correctement
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 2
    Dernier message: 17/09/2003, 15h03

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