Probleme avec un EDIT CONTROL

Signaler
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007
-
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007
-
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

Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

Bon alors j'ai peut etre un debut de solution ca serait pas un truc avec



EDITTEXTSTATES()

ou

BORDERTYPE() ???
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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);
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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.
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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é ?
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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.
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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 ...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Tu peux récupérer ce HWND en faisant par exemple:
HWND hwndDlg=FindWindow(0,"Solitech");
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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?
Messages postés
14
Date d'inscription
jeudi 9 juin 2005
Statut
Membre
Dernière intervention
25 mai 2007

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.