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

 C Discussion :

Création IHM en C


Sujet :

C

  1. #61
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    D'accord, je ne savais pas pour les exit().

    J'ai pas mal avancé et obtenu plus ou moins ce que je voulais, voici la fonction récursive :

    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
    //fonction permettant de lister tous les fichiers dans leurs répertoires
     
    void recursively_list_files(FILE* fichier, char * dir) {
     
    	HANDLE hFind3;
    	WIN32_FIND_DATA fd;
    	char path[MAX_PATH + 1];
     
     
    	sprintf(path, "%s\\*", dir);
     
     	if ((hFind3 = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) {
     
    		fprintf(fichier, "Erreur FindFirstFIle sur %s\n", path);
    		exit(1);
    	}
     
    	while(1) {
     
    		if ((strcmp(".", fd.cFileName) !=0) && (strcmp("..", fd.cFileName) != 0)) {
     
    			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     
                    /* c'est un dossier */
     
    				sprintf(path, "%s\\%s", dir, fd.cFileName);
     
    				recursively_list_files(fichier, path);
     
     
    			} else {
     
    				/* c'est un fichier */
     
    				//Création d'une nouvelle variable contenant le chemin absolu du fichier
     
    				sprintf(bufferCheminFichier, dir); //on mets le chemin absolu du dossier dans la nouvelle variable
    				strcat(bufferCheminFichier, "\\");  //on ajoute un \ entre le dossier et le fichier
    				strcat(bufferCheminFichier, fd.cFileName);  //on ajoute le nom du fichier
     
    				//On mets tous les chemins abolu des fichiers dans le fichier "donnees.txt"
     
    				fprintf(fichier, "%s\n", bufferCheminFichier);
     
    		  	}
    		}
     
    		if (!FindNextFile(hFind3, &fd))
                break;
     
    	}
     
     
     
    	if (GetLastError() != ERROR_NO_MORE_FILES) {
     
    		printf("Erreur FindNextFile - dans %s\n", path);
    		fprintf(fichier, "Erreur FindNextFile - dans %s\n", path);
    		exit(1);
    	}
    	if (FindClose(hFind3) == FALSE) {
     
    		fprintf(fichier, "Erreur FindClose\n");
    		exit(1);
    	}
     
     
    }
    Dans ce code, je liste tous mes fichiers, ligne par ligne, avec leur chemin absolu.

    J'ai créé une autre fonction, qui doit me permettre de lire chaque fichier, et de ne sélectionner que ce que je veux ... Voici le 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
    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
     
     
    //Analayse du fichier 
     
     
    int AnalyseFichier() 
     
    {
    	FILE* fichier2 = NULL;
    	char buf[255];
     
    	fichier2 =fopen("C:\\Users\\cTelnaz\\Documents\\Visual Studio 2010\\Projects\\Projet-c\\Projet-c\\donnees.txt","r");
     
    		if (fichier2 == NULL)
    		{
    			MessageBox(NULL, "Le fichier n'a pas pu être ouvert", "Erreur", MB_ICONWARNING | MB_OK);
    			exit(1);
    		}
    		else 				
    		{
    		      do 
     
    		      {
     
     
    		       //Recherche des lignes du fichier
     
    				 if (fgets(buf, sizeof buf, fichier2) != NULL)
     
    				{
     
                                    //ouverture du fichier correspondant à la ligne trouvée 
     
    				fichier2 = fopen(buf,"r");
     
    					 if (strstr(buf, "<A>"))
     
    					{
    						do
    						{
    						      //suppresion du code
    						}
    						while (strstr(buf, "</A>"));
    						}
     
     
    					}
     
    					else 
    					{
    						MessageBox(NULL, "Plus de lignes à lire", "Stop", MB_ICONWARNING | MB_OK);
    					 }
     
    			} while (buf != 0);
     
    		fclose(fichier2);
     
    		}
     
    }
    Cette fonction s’exécute après la fonction récursive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if (hEditJ !=0 && hEditI !=0)
     
    {
    FILE* fichier;
    fichier=fopen("donnees.txt", "w+");
    recursively_list_files(fichier, bufferCheminSousDossier);
    AnalyseFichier() ;
     
    fclose(fichier);
    }
    J'ai premièrement écris la condition : Si la ligne comprends <A>, alors supprimer le code, tant que la prochaine ligne ne contient pas </A>.

    Ensuite, pour la suppression, j'ai fais quelques recherches mais j'ai du mal à voir comment faire ... Après cela, ce sera la fin !

  2. #62
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Les lignes 37 à 43 peuvent se résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(fichier,"%s\\%s\n",dir,fd.cFileName);
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #63
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Effectivement, merci !

    J'ai terminé cette fonction.

    J'ai maintenant commencé à créer mon algorithme permettant la suppression de codes.

    Pour cela, j'ai créé tout d'abord une fonction permettant de charger les fichiers listés, un par un. Cela fonctionne.

    Ensuite, j'ai créé une fonction permettant le traitement des fichiers par rapport aux balises.
    Plus précisément, cette fonction permet de renvoyer une chaîne de caractère comprenant la totalité du contenu du fichier traité s'il y a des balises correspondantes ou NULL s'il n'y en a pas et que le fichier ne doit pas changer.

    Pour cela, j'ai séparé les fonctions de mon projet pour faire quelques tests. Tout d'abord, j'essaye d'envoyer une chaine de caractère qui ne contient pas les fameuses balises, ainsi, la fonction doit normalement retourner NULL.

    Cependant, lors de l’exécution, cela m'affiche : Unhandled exception at ... in test-balise.exe : Un segement de mémoire a été endommagé.

    J'ai du mal à comprendre cette erreur, car elle n'indique pas de ligne précise ... J'imagine tout de même que le problème provient du "malloc", que j'ai du caster suite à un problème de compilation (impossible à résoudre).

    Voici cette fonction :

    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
     
    char* traiter_retrait_balises(char * contenu, char * balise_debut, char * balise_fin)
     
    {	
     
    	int dans_balise =0;
    	char* contenunew;
     
    	//On découpe la chaîne avec les caractères de séparation \r\n
     
    	char * ligne = strtok(contenu, "\r\n");
     
    	FILE * file; 
    	file= fopen("fichiertest.txt", "w+");
     
     
    	//Si le contenu est vide, on retourne NULL
     
    	if (contenu[0] == '\0') { return NULL; }
     
     
    	/* On alloue la mémoire au moins ausssi grande que le 
    	contenu passé à la fonction pour dimensionner contenunew */
     
    	contenunew = (char *)malloc(strlen(contenu)+1);
     
    	while (ligne != NULL) 
     
    	{
     
    		//Si balise_debut est dans ligne, l'expression retourne 1
     
    		int is_balise_debut = (strcmp(ligne, balise_debut) ==0)? 1 :0;
    	        int is_balise_fin = (strcmp(ligne, balise_fin) ==0)? 1 :0;
     
    		//Si on est pas dans la balise et que "ligne" n'est pas une balise de début,
     
    		if (!is_balise_debut && !dans_balise)
     
    		{
    			//On ajoute la ligne à la chaîne à retourner
     
    			strcat(contenunew, ligne);
    			strcat(contenunew, "\n");
    		}
     
    		//Si ligne est une balise de début
     
    		else if (is_balise_debut)
     
    		{
    			dans_balise = 1;
    		}
     
    		//Si ligne est une balise de fin
     
    		else if (is_balise_fin)
     
    		{
    			dans_balise =0;
    		}						
     
    		/* On demande à strtok() de nous trouver la prochaine ligne 
    		et on boucle
    		*/
     
    		ligne = strtok(NULL, "\r\n");
     
    	}
     
    return contenunew;
     
    fclose(file);
    }
    Que j'appelle ensuite ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void test_trb_chaine_sans_balise_recherchee(void) {
        char balise_debut[] = "<A>";
        char balise_fin[]   = "</A>";
        char contenu[]      = "Ceci est un texte.\r\nIl ne comprend aucune balise recherchée\r\n\r\n<B>\r\nTexte dans B\r\n</B>\r\nC'est terminé";
        char * contenunew = traiter_retrait_balises(contenu, balise_debut, balise_fin);
        assert(contenunew == NULL
                && "test_trb_chaine_sans_balise_recherchee doit renvoyer NULL");
    }
    Puis le code permettant d'appeler les différents TESTS, ici il n'y en a pour l'instant qu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void test_suite_trb_traiter_retrait_balises(void) {
     
        test_trb_chaine_sans_balise_recherchee();
     
    }
    Puis la fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main(void) {
     
        test_suite_trb_traiter_retrait_balises();
     
        return 0;
    }

  4. #64
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    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
     
    char* traiter_retrait_balises(char * contenu, char * balise_debut, char * balise_fin)
     
    {	
     
    	....
     
    	FILE * file; 
    	file= fopen("fichiertest.txt", "w+");
     
     
    	//Si le contenu est vide, on retourne NULL
    	if (contenu[0] == '\0') { return NULL; }
     
     
    	/* On alloue la mémoire au moins ausssi grande que le 
    	contenu passé à la fonction pour dimensionner contenunew */
     
    	contenunew = (char *)malloc(strlen(contenu)+1);
     
     
    .....
     
    return contenunew;
     
    fclose(file);
    }
    1. gestion des fopen/fclose et return à revoir (car tu ouvres sans fermer)
    2. malloc sans free
    3. il manque la vérification que le malloc a réussi

    je n'ai pas regardé plus loin

  5. #65
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Merci, j'ai pu réussir à finaliser la chose ...

    Maintenant, il me reste à créer la fonction pour remplacer un fichier (permettant donc de supprimer le code voulu).

    J'ai écris ceci (pour un test) :

    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
     
    int remplacer_fichier(char * pathfich, char * contenunew) 
    {
        FILE* fichnew = fopen(pathfich, "w");
     
        //Ouverture d'un fichier en écriture 
     
        fichnew = fopen (fichier.blk.new, "w");
        fprintf(fichnew, "%s", contenunew);
     
        // On efface l'ancien fichier
     
        remove(pathfich)
     
        //On renomme le fichier créé 
     
        rename("fichier.blk.new", "fichier.blk");
     
        fclose(fichnew);
     
    }
    .blk est l'extension du fichier.

    Lors du test avec la fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(void) 
     
    {
         char pathfich[] ="C:\\Users\\Perot\\test.blk";
         char contenunew[] = "Test";
         remplacer_fichier(pathfich, contenunew);
    }
    Le contenu du fichier test.blk est supprimé mais pas le fichier, et il n'y a pas non plus la création du fichier.

    De toute manière, je me demande comment faire pour renommer le fichier avec le nom du fichier justement remplacé ?

  6. #66
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichnew = fopen (fichier.blk.new, "w");    // Ecrase "fichier/blk.new"  quel que soit son contenu, donc tu as un nouveau fichier
    pour supprimer un fichier (si tu veux être 100% windows), tu as DeleteFile
    pour renommer/déplacer un fichier (si tu veux être 100% windows), tu as MoveFile

    Donc à toi de mettre les appels dans le bon ordre pour obtenir ce que tu souhaites

  7. #67
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    À quoi sert le fopen() ligne 4 ? La valeur de fichnew est de toute façon écrasée avec le fopen() ligne 8.
    Et faire un remove(pathfich) alors que le fichier est ouvert, ça ne va pas le faire.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  8. #68
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Ok, j'ai écris cela :

    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
     
    int remplacer_fichier(char * pathfich, char * contenunew) 
    {
        FILE* fichnew;
     
        //Ouverture d'un fichier en écriture 
     
        fichnew = fopen (fichier.new, "w");
     
        fprintf(fichnew, "%s", contenunew);
     
        MoveFileExA(pathfich, "fichier.new", MOVEFILE_WRITE_THROUGH);
     
        fclose(fichnew);
     
        // On efface l'ancien fichier
     
        remove(pathfich)
     
    }
    Le nouveau fichier n'est pas renommé, par contre cette fois l'autre est bien supprimé.
    En plus de cela, le fichier est créé dans le chemin par défaut du projet, mais est-il possible que ce fichier soit créé dans le même dossier ? Enfin cela est sûrement possible, mais il faudrait que ce soit récurrent pour tous les différents fichiers qui passeront par cette fonction.

    EDIT : j'ai amélioré 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    int remplacer_fichier(char * pathfich, char * contenunew) 
    {
        FILE* fichnew;
        int result;
        char nomfichtemp[] = "fichier.txt";
     
        //Ouverture d'un fichier en écriture 
     
        fichnew = fopen (nomfichtemp, "w+");
     
        fprintf(fichnew, "%s", contenunew);
     
        fclose(fichnew);
     
        result = rename(nomfichtemp, "test");
     
        if (result !=0)
        {
              printf("Impossible de renommer le fichier : %s\n", nomfichtemp);
              return result;
         }
         else 
              printf("%d\n", result);
              return result;
     
        // On efface l'ancien fichier
     
        remove(pathfich)
     
    }
    J'arrive maintenant à renommer simplement mon fichier. Le problème est que dans la variable pathfich, j'ai le chemin absolu du fichier. Donc je ne vois pas comment, avec cette variable, donner le nom et le bon chemin au nouveau fichier. J'ai essayé avec MoveFile mais je n'ai pas réussi, comme montré plus haut.

  9. #69
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int remplacer_fichier(char * pathfich, char * contenunew) 
    {
        FILE* fichnew;
        int result;
        char nomfichtemp[] = "fichier.txt";
     
        //Ouverture d'un fichier en écriture 
     
        fichnew = fopen (nomfichtemp, "w+");
     
        fprintf(fichnew, "%s", contenunew);
     
        fclose(fichnew);
    Pourquoi ouvrir en "w+"? "w" suffit. Et tu peux remplacer fprintf(fichnew, "%s", contenunew) par un plus simple fputs(contenunew, fichnew).

    Citation Envoyé par Perot Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (result !=0)
        {
              printf("Impossible de renommer le fichier : %s\n", nomfichtemp);
              return result;
         }
         else 
              printf("%d\n", result);
              return result;
    Le premier return result est inutile. Ou alors c'est le else qui est inutile.

    Citation Envoyé par Perot Voir le message
    J'arrive maintenant à renommer simplement mon fichier. Le problème est que dans la variable pathfich, j'ai le chemin absolu du fichier. Donc je ne vois pas comment, avec cette variable, donner le nom et le bon chemin au nouveau fichier. J'ai essayé avec MoveFile mais je n'ai pas réussi, comme montré plus haut.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char nomFinal[MAX_PATH + 1];
    sprintf(nomFinal, "%s/test", pathfich);
    rename(nomfichtemp, nomFinal);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #70
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Citation Envoyé par Perot Voir le message
    J'ai essayé avec MoveFile mais je n'ai pas réussi, comme montré plus haut.
    Sur un fichier ouvert ? Je ne pense pas que ça fonctionne !
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  11. #71
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je tenais à remercier tout ceux qui m'ont grandement aidé pour mon projet. J'ai beaucoup appris ...

    Notamment Sve@r et CGI pour leurs dernières réponses ...

    Aujourd'hui, j'ai atteint mon objectif, mais je continue tout de même à optimiser mon IHM (mise en page ...).

    J'aimerais que mes boutons se colorent lorsque j'appuie dessus.

    J'ai par exemple ce bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hBouton2 = CreateWindow(TEXT("button"), TEXT("test"), WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 420, 185, 150, 30, hwnd, (HMENU)4, NULL, NULL);
    Le bouton concerné a donc pour identifiant : 4.

    Au niveau du case WM_COMMAND, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    case WM_COMMAND :
        switch (LOWORD((PARAM)) 
     
       {
     
          case 4 :
     
              bgColor = RGB(255,0,0);
              SendMessage(NULL, WM_CTLCOLORBTN, (WPARAM)GetDC(hBouton2), (LPARAM)hBouton2);
     
    /*.................*/
    En notant que bgColor est définit comme ceci en haut de page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COLORREF bgColor = RGB(0,0,0);
    Je ne mets pas tous le code, il y a une multitude de boutons ...

    Pour finir, j'ai le case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case WM_CTLCOLORBTN :
     
           return (LRESULT)CreateSolidBrush(bgColor);
           break;
    Cela créé bien des boutons entourés de noir, et quand j'appuie sur le bouton test, id 4, j'ai du rouge qui apparaît. Jusqu'ici tout va bien, mais lorsque que je survole les autres boutons, tout se colorient !

    Je ne comprends pas pourquoi cela fait ça, la condition est pourtant faite uniquement lorsque le bouton test (id 4) est appuyé ...

  12. #72
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par Perot Voir le message

    Cela créé bien des boutons entourés de noir, et quand j'appuie sur le bouton test, id 4, j'ai du rouge qui apparaît. Jusqu'ici tout va bien, mais lorsque que je survole les autres boutons, tout se colorient !

    Je ne comprends pas pourquoi cela fait ça, la condition est pourtant faite uniquement lorsque le bouton test (id 4) est appuyé ...
    cela vient de cette partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case WM_CTLCOLORBTN :
     
           return (LRESULT)CreateSolidBrush(bgColor);
           break;
    Tu as fait cet algo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    si clic sur bouton 4 alors je stocke couleur = rouge
     
    affichage bouton : affiche avec la couleur mémorisée
    solution : dans WM_CTLCOLORBTN, il faut que tu testes que tu es sur le bon bouton (par défaut, il prend tous les boutons)

  13. #73
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Il faut que je rajoute une condition du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (LOWORD(wParam) == 4)
    {
        return (LRESULT)CreateSolidBrush(bgColor);
    }
    ?


    Mais cela va donc supprimer la couleur (noir) de base.

  14. #74
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Normalement ça s'utilise sur des boutons avec le style BS_OWNERDRAW
    Sans ce style ça dessine un bien rectangle autour des boutons sur les applications avec les styles visuels activée.
    Tu devras utiliser le handle du bouton qui est envoyer dans le dernier paramètre de la procédure de fenêtre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        case WM_CTLCOLORBTN :
     
           if(lParam==(LPARAM)hBouton2) return (LRESULT)CreateSolidBrush(RGB(255,0,0));
           return NULL;
    Par contre il est inutile d'envoyer le message comme tu le fais. C'est le bouton qui s'en charge pour récupérer le pinceau.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  15. #75
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Merci CGI, j'ai donc enlevé le "SendMessage" inutile et ajouté la condition.

    Cela fonctionne, par contre si je veux ajouter les autres boutons, je dois mettre des "if" à la suite ?

    Si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        case WM_CTLCOLORBTN :
     
           if(lParam==(LPARAM)hBouton2) return (LRESULT)CreateSolidBrush(RGB(255,0,0));
           return NULL;
     
           if(lParam==(LPARAM)hBouton3) return (LRESULT)CreateSolidBrush(RGB(255,0,0));
           return NULL;
    Si je fais ainsi, je reviens au même problème (coloriage des boutons au survole)

  16. #76
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    La seconde partie de ton code ne sera jamais exécuté le premier return NULL y met fin, il est donc de trop.

    Coloriage au survole, c'est normale, si tu veux contrôler l'aspect total du bouton, il faut leur mettre le style BS_OWNERDRAW et les modifier sur le message WM_DRAWITEM ou alors les sous classer.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  17. #77
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    D'accord, mais avec WM_CTLCOLORBTN il n'est donc pas possible de colorier (le contour peu importe) les boutons un à un lors d'un appui ?

    Je vais regarder la documentation pour WM_DRAWITEM, merci pour ces informations.

Discussions similaires

  1. Modélisation 1ère étape de la création d'IHM Leonardi
    Par Lucas Panny dans le forum W4 Express
    Réponses: 2
    Dernier message: 26/07/2007, 09h29
  2. [OpenOffice][Texte] Création d'une TOC sans IHM
    Par lekekoo dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 25/05/2007, 16h09
  3. création d'IHM java en XML
    Par sglon dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 10/04/2007, 05h43
  4. IHM : création Dataset typé
    Par cDotNet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/01/2007, 17h29
  5. Conseils/docs sur la création d'ihm
    Par hellbilly dans le forum Windows
    Réponses: 3
    Dernier message: 19/09/2005, 21h53

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