Probleme avec un EDIT CONTROL

2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 - 25 mai 2007 à 11:17
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 - 25 mai 2007 à 17:39
Bonjour,

Je suis actuelement en train de réaliser un jeu de Taquin sous Visual.
J'ai deja reussi a coder la generation aleatoire des cases pour une solution soluble et le déplacement des chiffres

Voici un ptit screen pour vous faire une idée

Les cases sont des EDIT CONTROL qui changent de valeur.
Ce que je voudrais faire c'est supprimer la bordure si l'EDIT CONTROL affiche 0, et la rétablir dans le cas contraire.

Voici un extrait de mon code. (quand je clique sur la Case1, en haut a gauche )

void CSolitechDlg::OnEnSetfocusEditCase1()
{
int m_CaseT; // Création d'une case de transition fictive. Puis inversement des cases.
if ( m_Case2 == 0)
{
   m_CaseT = m_Case2;
   m_Case2 = m_Case1;
   m_Case1 = m_CaseT;
   m_NClic = m_NClic + 1;
}

if ( m_Case4 == 0)
{
   m_CaseT = m_Case4;
   m_Case4 = m_Case1;
   m_Case1 = m_CaseT;
   m_NClic = m_NClic + 1;
}
ControleDuJeu();
ControleDuGain();
UpdateData(NULL);
}

Je voudrais arriver à un truc comme ca




void CSolitechDlg::OnEnSetfocusEditCase1()
{
int m_CaseT; // Création d'une case de transition fictive. Puis inversement des cases.
if ( m_Case2 == 0)
{
   m_CaseT = m_Case2;
   m_Case2 = m_Case1;
   m_Case1 = m_CaseT;
   m_NClic = m_NClic + 1;
   






Apres je supprime la bordure de la Case1 et rétablie celle de la Case2 (WS_BORDER ???)

}

if ( m_Case4 == 0)
{
   m_CaseT = m_Case4;
   m_Case4 = m_Case1;
   m_Case1 = m_CaseT;
   m_NClic = m_NClic + 1;






   Apres je supprime la bordure de la Case1 et rétablie celle de la Case4 (WS_BORDER ???}

}
ControleDuJeu();
ControleDuGain();
UpdateData(NULL);
}





Voila, c'est assez important vu que c'est mon projet info

Je trouve deja dans mon Solitech.rc les propriétés de mes EDIT CONTROL
Voici celui reprensente le nombre de deplacements (voir screen) NOT WS_BORDER indique qu'il ne possede pas de bordure (revoir screen lol)

EDITTEXT IDC_EDIT_NClic,119,48,16,14,ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP

Mais comment faire pour arriver à changer les propriétes d'un EDIT CONTROLE dans une fonction ... ?

...

H.E.L.P

10 réponses

2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 11:50
Bon alors j'ai peut etre un debut de solution ca serait pas un truc avec



EDITTEXTSTATES()

ou

BORDERTYPE() ???
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
25 mai 2007 à 12:45
Salut,
Pour cela il faut récupérer le HWND du controle afin de pouvoir activer ou désactiver le style WS_BORDER:

HWND hwndedit=GetDlgItem(hwndDlg, IDC_EDIT_NClic);
LONG ancienstyle=GetWindowLong(hwndedit, GWL_STYLE);
LONG nouveaustyle;
nouveaustyle= ancienstyle & ~WS_BORDER; // enlever la bordure
nouveaustyle= ancienstyle | WS_BORDER; // ajouter la bordure
SetWindowLong(hwndedit, GWL_STYLE, nouveaustyle);
0
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 14:23
Waaaaw j'avais jamais vu ça (un peu normal vu le niveau que j'ai :D) !
En tout cas merci ! Je vais tester ça et je te / vous tiens au courant.
0
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 14:40
Erreur 1 error C2065: 'hwndDlg' : identificateur non déclaré


HWND hwndedit = GetDlgItem(hwndDlg, IDC_EDIT_Case9);


LONG ancienstyle = GetWindowLong(hwndedit, GWL_STYLE);

LONG nouveaustyle;

nouveaustyle = ancienstyle & ~WS_BORDER;



// enlever la bordure

//nouveaustyle = ancienstyle | WS_BORDER; // ajouter la bordure

SetWindowLong(hwndedit, GWL_STYLE, nouveaustyle);

Je ne vois pas trop a quoi ca pourrait correspondre ...
Je prog sous Visual .Net 2005, et la seule commande qu'il me sort commencant par hwnd c'est hwndedit.

Ca a changé ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 15:03
Désolé de poster à la suite, mais on ne peut pas éditer.







hwnd : "handle to dialog box" (sous windows, toute fenêtre est identifiée par un "handle" qui est en fait en entier long)
=>  identificateur du dialogue dans lequel se trouve ton edit box






#define   IDC_EDIT_Case9         1008

Je pensais que c'etait le 1008, mais non, ça n'a pas l'air d'être ça ...

J'ai essayé un tas de bidouillage, je ne vois pas comment faire.
0
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 15:21
Je suis vraiment perdu ^^

Mon EDIT CONTROL se trouve dans ma boite de dialogue IDD_SOLITECH_DIALOG

#define   

IDD_SOLITECH_DIALOG         102

Ou est ce que je pourrais le trouver ? Ca correspond reelement a quoi ?
Je mets ca au cas ou ...
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
25 mai 2007 à 16:13
Tu peux récupérer ce HWND en faisant par exemple:
HWND hwndDlg=FindWindow(0,"Solitech");
0
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 16:27
J'y arrive pas justement :'(



Erreur 1 error C2664: 'CWnd::FindWindowW' : impossible de convertir le paramètre 2 de 'const char [9]' en 'LPCTSTR' c:\Documents and Settings\makbouli\Bureau\Solitech\Solitech\SolitechDlg.cpp 531

Erreur 2 error C2664: 'void CWnd::GetDlgItem(int,HWND *) const' : impossible de convertir le paramètre 1 de 'HWND' en 'int' c:\Documents and Settings\makbouli\Bureau\Solitech\Solitech\SolitechDlg.cpp 532
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
25 mai 2007 à 17:23
Il parait que tu travailles avec les MFCs. Moi je préfère travailler directement avec les APIs Windows.
Mon code est normalement facilement adaptable aux MFCs.
Il parait aussi que tu travailles en UNICODE. Dans ce cas il faut faire:
HWND hwndDlg=FindWindow(0,TEXT("Solitech"));
Pour l'erreur N°2, il parait que les paramètres de GetDlgItem() sont inversés en MFC. En Api, voici son prototype:
GetDlgItem(HWND, int);
Tu peux pas utiliser directement ces fonctions sans passer par CWnd?
0
2fear Messages postés 14 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 25 mai 2007 1
25 mai 2007 à 17:39
Oui, désolé, j'ai oublié de préciser que j'etais en MFC. Ce n'est pas un choix, c'est imposé.
Je ne vois pas du tout à quoi ca correspond, mais voila ce que m'indique Visual. Qu'en penses tu ?




CWnd * FindWindow(LPCTSTR lpszClassName, LCTSTR lpszWindowName)







CWnd * GetDlgItem (int nID) const



void GetDlgItem(int nID, HWND *phWND) const

La solution que tu m'as proposé ci dessus ne marche pas non plus.
0