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 :

texte s�lectionnable dans CDateTimeCtrl


Sujet :

MFC

  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par d�faut texte s�lectionnable dans CDateTimeCtrl
    Bonjour � tous!
    Pour le besoin d'une application, je cr�� dynamiquement des objets h�ritants directement de la classe CDateTimeCtrl.
    J'arrive � peu pr�s � faire tout ce que je veux avec ce control sauf une chose : je suis incapable d'autoriser la s�lection de la chaine de caract�re, comme on pourrait le faire dans un CEdit classique...

    Existe-t-il un moyen, autre que la d�finition manuelle des appuis sur touches (Ctrl+A Ctrl+C) ou de l'�v�nement s�lection, pour autoriser la s�lection de la date affich�e dans l'objet CDateTimeCtrl

    Merci d'avance de votre aide

  2. #2
    Expert confirm�
    Avatar de Melem
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 39
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par d�faut
    Sp�cifier le style DTS_APPCANPARSE.

  3. #3
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par d�faut
    DTS_APPCANPARSE
    Je l'ai d�j� test� celui l�, mais d�s que je clique dans mon objet CDateTimeCtrl, l'application crash lamentablement.

    Je d�clare cet objet dynamiquement de cette mani�re:

    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
     
    int CInPlaceDateTime::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CDateTimeCtrl::OnCreate(lpCreateStruct) == -1)
    		return -1;
     
    	// Set the proper font
    	CFont* font = GetParent()->GetFont();
    	SetFont(font);
     
    	// When we want to diaplay date AND time in the edit control, we modify display format
    	if ( m_iDisplayType == DATE_TIME )
    		SetFormat("dd/MM/yyyy HH:mm:ss");
     
    	SetTime(m_oDateHourToUse);
     
    	SetFocus();
     
    	//When we use SetFocus, two firsts caracters are not displayed, the only solution I found 
    	//is to simulata right, then left, arrow touch pressing.
    	PostMessage(WM_KEYDOWN,VK_RIGHT,0);
    	PostMessage(WM_KEYDOWN,VK_LEFT,0);
     
    	return 0;
    }
    Et l'appelle � ce Create se fait de la mani�re suivante:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    pDateTime = new CInPlaceDateTime(nItem, nCol, GetItemText( nItem, nCol ),CInPlaceDateTime::DisplayType::TIME_ONLY);
    rect.bottom = rect.top + 20;
    dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | DTS_TIMEFORMAT;
    pDateTime->Create( dwStyle, rect, this, IDC_IPDATETIME );
    Et oui... il s'agit m�me d'une surd�finition d'objet graphique.

    Tant qu'il n'y a pas DTS_APPCANPARSE, tout va bien, mais d�s qu'il pointe le bout de son nez : TOUT EXPLOSE!!!

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par d�faut
    Bon, j'ai affin� la recherche
    J'utilise la fonction OnKillFocus pour envoyer des informations � la fen�tre parent. Oui, mais voil�, lorsque je rentre dans la phase de s�lection du texte, il passe dans cette m�thode OnKillFocus.

    On n'y passe pas lorsque l'option DTS_APPCANPARSE n'est pas sp�cifi�e.

    L� o� je comprend encore moins, c'est que j'ai beau �tre en train de s�lectionner du texte contenu dans mon CDateTimeCtrl, le GetFocus ne retourne l'adresse de cet objet, mais d'un autre qui m'est inconnu (CTempWnd)

    La fonction GetSel ne fonctionne pas, sinon je m'en serais servi pour court-circuiter les appels � m�thodes pr�sents dans OnKillFocus.
    J'avoue que je commence � s�cher un peu l�...

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par d�faut
    Bon, bon, bon...
    Devant la ferveur exalt�e de la foule en d�lire, j'annonce que j'ai trouv� une solution � mon probl�me.
    Certaines personnes vont crier au scandale, mais vu que j'utilise �norm�ment la fonction OnKillFocus pour faire des op�rations de traitement des donn�es, il a fallu que je m'en sorte tant bien que mal.

    Mon raisonnement a �t� le suivant : vu qu'il semblerait qu'un nouvel objet soit cr�� lorsque l'on passe en �dition sur ce type de contr�le, je me suis rabattu sur un test de "paternit�".

    Comme on aurait pu s'y attendre, l'objet cr�� pour l'�dition (de type CTempWnd) � le m�me parent que l'objet Calendar (petit boite de dialogue qui s'affiche pour choisir la date plus "graphiquement, il est rattach� � l'objet CDateTimeCtrl). Voici donc mon code:

    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
     
    void CInPlaceDateTime::OnKillFocus(CWnd* pNewWnd)
    {
    	CDateTimeCtrl::OnKillFocus(pNewWnd);
     
    	//When we make a selection in the control, a new object is created (CTempWnd) that seems to be
    	//a kind of temporary object containing selected text. But when we read the memory address of this object's parent
    	//we can see that it's the address of our CDateTimeCtrl.
    	//So, if ptrToTest is the same pointer than "this", we know focus has not been lost.
    	CWnd * ptrToTest = GetFocus()->GetParent();
    	if ( !GetMonthCalCtrl() && (ptrToTest != this) )
    	{
    		//Treatments.............
    		DestroyWindow();
    	}	
    }
    Sur ce... Je remercie les gens qui ont cherch�.

  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
    Par d�faut
    salut,
    tu cherches simplement � provoquer la s�lection du contenu ?
    si CTRL+A fonctionne ,envoi la s�quence clavier directement au contr�le ..

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    177
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 177
    Par d�faut
    J'y ai pens�, mais il m'est demand� de pouvoir s�lectionner ce que l'on veut...

    En plus, cette solution est un peu plus longue � mettre en place (du moins, j'en ai l'intime impression)

  8. #8
    Membre �m�rite
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    D�tails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Par d�faut
    Existe-t-il un moyen, autre que la d�finition manuelle des appuis sur touches (Ctrl+A Ctrl+C) ou de l'�v�nement s�lection, pour autoriser la s�lection de la date affich�e dans l'objet CDateTimeCtrl
    Je ne suis pas s�r de bien comprendre le probl�me.

    Si tu veux autoriser la s�lection dans le CDateTimeCtrl il faut que tu obtiennes son contr�le associ� CMonthCalCtrl au moment o� le CDateTimeCtrl est dropped down en interceptant l'�v�nement DTN_DROPDOWN

    Voici un exemple ou je refuse toute modification dans mon CDateTimeCtrl
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void CMyDlgPage::OnDtnDropdownMaturityDateProp(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	CMonthCalCtrl* pMoCalCtrl = m_MaturityDateCtrl.GetMonthCalCtrl();
    	ASSERT(pMoCalCtrl != NULL);
    	pMoCalCtrl->EnableWindow(FALSE);
    	*pResult = 0;
    }
    �a peu t'inspirer.
    Try It.

Discussions similaires

  1. R�cuperer le texte s�lectionn� dans l'�diteur de code
    Par JeromeL83 dans le forum API, COM et SDKs
    R�ponses: 0
    Dernier message: 03/03/2012, 21h46
  2. R�ponses: 5
    Dernier message: 07/07/2011, 08h22
  3. R�ponses: 3
    Dernier message: 03/10/2007, 09h28
  4. R�ponses: 3
    Dernier message: 02/09/2007, 20h35
  5. Capturer du texte s�lectionn� dans une fen�tre
    Par Trap D dans le forum Windows
    R�ponses: 8
    Dernier message: 28/09/2006, 22h29

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