| auteur : Farscape | Dans la ressource dialogue insérer l'édit et le contrôle SpinUp à côté.
Veiller à régler le tab order (CTRL +D) pour que le spin up soit après le CEdit.
Régler l'édit avec l'option number
Au niveau du SpinUp cocher les options suivantes dans l'onglet styles:
- Auto buddy ;
- Set buddy integer ;
- Alignement right.
|
| auteur : Farscape | Il faut commencer par régler les propriétés de l'édit dans l'éditeur de ressources :
Onglet styles :
Activer la coche Multiline et Want Return.
Pour remplir l'édit plusieurs solutions :
Si l'on dispose d'une variable CString attachée à l'édit il faudra veiller à rajouter les codes CR+LF ("\r\n") à la fin de chaque ligne et faire un UpdateData(FALSE) pour mettre à jour le contrôle
On pourra aussi mettre à jour l'édit avec la fonction SetWindowText.
CString str ,strLine;
for (int i= 0 ;i< 10 ;i+ + )
{
str.Format (" ligne numéro :%d \r\n " ,i) ;
strLine+ = str ;
}
GetDlgItem (IDC_EDIT1)- > SetWindowText (strLine);
|
|
| auteur : Farscape | Lorsque l'on se déplace par la touche tabulation d'un édit a l'autre la zone texte de l'édit est sélectionnée,
par contre si l'on click directement sur l'édit avec la souris ce n'est pas le cas.
Pour remédier à ce problème il suffira de placer le code suivant dans le message OnSetFocus:
soit dans un édit dérivé de la classe CEdit ,soit en rajoutant une notification EN_SETFOCUS sur la fenêtre parent en sélectionnant l'édit concerné dans ClassWizard .
Exemple implémentation sur la fenêtre parent :
BEGIN_MESSAGE_MAP (CTestMdiView, CFormView)
ON_EN_SETFOCUS (IDC_EDIT1, OnSetfocusEdit1)
END_MESSAGE_MAP ()
void CTestMdiView:: OnSetfocusEdit1 ()
{
GetDlgItem (IDC_EDIT1)- > PostMessage (EM_SETSEL,0 ,- 1 );
}
|
Sur un édit dérivé :
CMyEdit:: CMyEdit (){ }
CMyEdit:: ~ CMyEdit (){ }
BEGIN_MESSAGE_MAP (CMyEdit, CEdit)
ON_CONTROL_REFLECT (EN_SETFOCUS, OnSetfocus)
END_MESSAGE_MAP ()
void CMyEdit:: OnSetfocus ()
{
PostMessage (EM_SETSEL,0 ,- 1 );
}
|
|
| auteur : Farscape | Méthode: il faut intercepter le message WM_CHAR et ne pas répondre quand le caractère ne convient pas.
Il va sans dire qu'il faudra générer une classe édit dérivée de la classe CEdit avec l'aide de ClassWizard.
L'exemple ci-dessous interdit de saisir les ?a'.
CMyEdit:: CMyEdit ()
{
}
CMyEdit:: ~ CMyEdit ()
{
}
BEGIN_MESSAGE_MAP (CMyEdit, CEdit)
ON_WM_CHAR ()
END_MESSAGE_MAP ()
void CMyEdit:: OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar= = ' a ' ) return ;
CEdit:: OnChar (nChar, nRepCnt, nFlags);
}
|
|
| auteur : Farscape | Il suffit de cocher l'option Uppercase ou Lowercase sur les propriétés de l'édit dans l'éditeur de ressources.
|
| auteur : Farscape |
BOOL CMyForm:: OnCommand (WPARAM wParam, LPARAM lParam)
{
CWnd * pWnd = GetFocus ();
switch (wParam)
{
case IDOK: if (pWnd! = GetDlgItem (IDOK))
{
reinterpret_cast < CDialog * > (this )- > NextDlgCtrl ();
return FALSE;
}
break ;
case IDCANCEL:if (pWnd! = GetDlgItem (IDCANCEL))
{
return FALSE;
}
break ;
}
return CFormView:: OnCommand (wParam, lParam);
}
|
Note : l'exemple ci-dessus fonctionne pour une CFormView et une CDialog
|
| auteur : Farscape | Pour un CEdit simple ligne :
pEdit- > PostMessage (WM_KEYDOWN,VK_END,0 );
pEdit- > SetFocus ();
|
Pour un CEdit multi lignes :
int n= pEdit- > GetWindowTextLength ()- 1 ;
pEdit- > SetSel (n,n,TRUE);
pEdit- > PostMessage (WM_KEYDOWN,VK_END,0 );
pEdit- > SetFocus ();
|
|
| auteur : Farscape | En interceptant le message "reflect" =WM_CTLCOLOR à destination de l'édit.
Voici comment procéder :
Générer une classe dérivée de CEdit par ClassWizard .
Toujours dans ClassWizard intercepter le message "reflect" =WM_CTLCOLOR dans la liste des messages.
L'exemple ci-dessus mettra une couleur de fond blanche si l'édit est mode lecture seule.
HBRUSH CMyEdit:: CtlColor (CDC* pDC, UINT nCtlColor)
{
if ((GetStyle () & ES_READONLY))
{
if (! m_pBrushReadOnly) m_pBrushReadOnly = new CBrush (RGB (255 ,255 ,255 ));
pDC- > SetBkColor (RGB (255 ,255 ,255 ));
return (HBRUSH)m_pBrushReadOnly- > GetSafeHandle ();
}
return NULL ;
}
|
|
| auteur : Farscape | Par défaut la touche entrée n'est pas relayée au niveau de l'édit pour les messages WM_CHAR ,WM_KEYDOWN etc..
Note: il en est de même pour les flèches et la touche tabulation .
Pour intercepter cette touche il faudra commencer par générer une classe dérivée de CEdit avec l'aide de ClassWizard .
Et de redéfinir la fonction PreTranslateMessage comme suit:
|
BOOL CMyEdit:: PreTranslateMessage (MSG* pMsg)
{
if (pMsg- > message = = WM_KEYDOWN & & pMsg- > wParam = = VK_RETURN)
{
TRACE (" \nReturn intercepté " );
}
return CEdit:: PreTranslateMessage (pMsg);
}
|
|
| auteur : Farscape |
Pour commencer avec l'aide de ClassWizard :
Il faut générer une classe dérivée d'un CEdit .
Ensuite intercepter le message WM_CHAR .
Pour Les caractères non souhaités il ne faut pas appeler la fonction de la classe de base ,
Pour envoyer un autre caractère en fonction de celui qui est reçu on utilisera un postmessage.
void CMyEdit:: OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar= = ' a ' )
{
PostMessage (WM_CHAR,' A ' );
return ;
}
CEdit:: OnChar (nChar, nRepCnt, nFlags);
}
|
l'exemple ci-dessus remplace un 'a' par un 'A'.
Note:il faudra bien sûr utiliser cette classe à la place de CEdit lors de la génération de la variable contrôle dans la classe parent.
|
| auteur : nico-pyright(c) | (pour un CEdit multiligne)
On peut par exemple récupérer la taille du contenu du CEdit, envoyer un message de sélection à la fin du CEdit, et remplacer la sélection par le nouveau texte.
Exemple qui ajoute une ligne avec l'heure courante :
CTime monTemps = CTime:: GetCurrentTime ();
CString resultat;
resultat.Format (" %d:%d:%d\r\n " ,monTemps.GetHour (),monTemps.GetMinute (),monTemps.GetSecond ());
int longueur = m_monEdit.GetWindowTextLength ();
m_monEdit.SetSel (longueur,longueur);
m_monEdit.ReplaceSel (resultat);
|
|
| auteur : Farscape | Sur windows 95 la limite est de 64K et on ne peut pas la changer.
Sur windows NT c'est différent et la limite dépendra de la machine.
Pour cela on appellera la fonction SetLimitText avec la valeur 4111222333 pour disposer du maximum disponible sur la machine utilisée...
Voir note MSDN
|
| auteur : Farscape | Cette séquence de touche peut être utile avec l'utilisation de différents contrôles
Exemple placer le curseur dans un CEdit ou CEditView en fin de page avec un défilement de la fenêtre si nécessaire.
keybd_event (VK_CONTROL,0x9d ,0 , 0 );
keybd_event (VK_END,0 ,0 ,0 );
keybd_event (VK_END,0 ,KEYEVENTF_KEYUP,0 );
keybd_event (VK_CONTROL,0x9d ,KEYEVENTF_KEYUP,0 );
|
Note le contrôle où va s'appliquer ces séquences de touches doit avoir le focus bien sûr.
|
| auteur : Farscape | Le but étant par exemple de changer le type d'alignement du texte.
Par exemple de passer de l'alignement à gauche à centré etc..
La première idée serait d'utiliser la fonction Comment modifier le style d'une fenêtre ?
Exemple :
m_edit_test.ModifyStyle (ES_RIGHT | ES_CENTER ,ES_LEFT);
|
Malheureusement ce code ne fonctionne pas, on ne peut modifier certains styles spécifiques d'un contrôle après sa création.
le mieux étant de faire un essai avant; Exemple avec ES_READONLY ça fonctionne .
pour résoudre le problème on procédera par la re création d'un nouveau contrôle en copiant les informations du précédent.
void ModifyEditStyle (CEdit & rEdit,DWORD dwRemove,DWORD dwAdd)
{
rEdit.ModifyStyle (dwRemove,dwAdd);
UINT nID= rEdit.GetDlgCtrlID ();
CRect rect;
rEdit.GetWindowRect (& rect);
CWnd * pParent= rEdit.GetParent ();
pParent- > ScreenToClient (& rect);
DWORD dwExEditStyle = rEdit.GetExStyle ( );
DWORD dwEditStyle = rEdit.GetStyle ( );
CString str;
rEdit.GetWindowText (str);
HWND hwnd= :: CreateWindowEx (
dwExEditStyle,
TEXT (" EDIT " ),
str,
dwEditStyle,
rect.left,
rect.top,
rect.Width (),
rect.Height (),
pParent- > GetSafeHwnd (),
(HMENU)(nID),
AfxGetInstanceHandle (),
NULL );
:: SendMessage (hwnd, WM_SETFONT, (WPARAM):: SendMessage (rEdit.GetSafeHwnd (), WM_GETFONT, 0 , 0 ),TRUE);
rEdit.DestroyWindow ();
rEdit.SubclassWindow (hwnd);
}
void CessaiOCX1View:: OnBnClickedButtonAlignDrotie ()
{
ModifyEditStyle ( m_edit_test, ES_LEFT | ES_CENTER , ES_RIGHT);
}
|
|
lien : Comment modifier le style d'une fenêtre ?
|
Consultez les autres F.A.Q.
|
|