Masquer ou afficher la console avec MFC

Résolu
Signaler
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007
-
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
-
Bonjour à tous,

Tout d'abord je remercie toute la communauté de programmeurs qui fait vivre ce site, car sans vous je n'irais pas très loin, le forum m'a souvent été d'une aide précieuse.

Ma question est la suivante:

Je développe une application de traitement d'image en C++ en utilisant MFC.
Lorsque je traite une image, je fais appel à un logiciel qui me permet de convertir des images Tif en Bmp. Le logiciel s'appelle ImageMagick.
Ce logiciel s'execute en ligne de commande (ex: on tape dans l'invite de commande : convert image1.tif image2.bmp pour convertir l'image1 au format Tif en image2 au format Bmp).

Pour cela, je n'ai rien trouvé de mieux que l'utilisation de la fonction system( ).
Pour info, dans mon code, j'ai mis ça:  system("convert test.tif test2.bmp");

Mon probleme est que la fenêtre de la console apparait brièvement puis disparait (le temps convertir l'image).

J'aimerais savoir si il est possible d'empécher la fenêtre d'apparaître (dans un soucis d'esthétique).

Merci à vous,

Bonne continuation,

Pierlab.

13 réponses

Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

J'ai réglé mon problème, j'utilise la fonction ShellExecute de la façon suivante:

    ShellExecute(NULL,"open",convert_path,param,NULL,SW_HIDE);

Voila, par contre je suis obligé de faire un _sleep(500) juste après, le temps que la conversion soit finie, avant de faire le traitement.
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

je te propose d'utiliser FreeImage qui s'utilise comme librairie: ainsi, plus de ligne de commande!
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

J'utilise déjà CImg mais mon problème n'est pas la.

CImg permet aussi d'ouvrir des image Tif . L'ennui, c'est que j'ouvre des fichier Tif multi-image. Si j'ouvre un fichier multi-image de facon classique (avec CImg, FreeImage, ou quoi que ce soit...), ca prend 6 secondes (les fichiers sont assez gros), en les convertissant avant, je tombe a 1,5 secondes.

Je doit donc utiliser l'invite de commande.

Ca fait un petit moment que je cherche mais je trouve pas, je voudrais seulement savoir si on peut masquer la console.
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Tu veux dire qu'executer la conversion tif->bmp en invite de
commande est plus rapide que d'appeler la fonction de conversion de la
librairie dans ton code?
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

oui, l'ami c'est ce que je veux dire.

Si tu connais la réponse à ma question n'hésites pas.
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

T'es t-il possible dans le code de convertir l'image sans avoir à la
charger? (il me semble qu avec FreeImage cela soit impossible mais on
ne sait jamais) car il semblerait qu'en ligne de commande le programme
appelle une fonction qui ne charge pas l'image au préalable, d'ou une
conversion plus rapide.
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
STARTUPINFO startUpInfo = {sizeof(STARTUPINFO),NULL,NULL,NULL,0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,SW_HIDE,0,NULL,0,0,0}; 
           
 CreateProcess("convert.exe" , "test.tif test2.bmp", NULL,NULL,NULL,0,NULL,NULL,NULL,&pi);
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
Et si tu veux attendre la fin du process :

PROCESS_INFORMATION pi;
STARTUPINFO startUpInfo = {sizeof(STARTUPINFO),NULL,NULL,NULL,0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,SW_HIDE,0,NULL,0,0,0}; 
           
if ( CreateProcess("convert.exe" , "test.tif test2.bmp", NULL,NULL,NULL,0,NULL,NULL,NULL,&pi))
{  
    WaitForSingleObject( pi.hProcess, INFINITE );}
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008

Mais c'est pas un peu dommage de se priver de la librairie? (sauf si on ne peut faire autrement...)
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

Merci pour les infos, je testerai ca demain, et je vous dirai ce ke ca donne.

Merci les codeurs
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

Re tout le monde.

Bn alors je viens de tester ton bout de code comme ca, en changeant juste le chemin de mon .exe et des parametres et ca me fait une erreur (access violation... un dépassement de tableau je pense).
J'ai regardé dans la doc MSDN pour voir un peu ce qu'il faut mettre dans la fonction CreateProcess.

Du coup j'ai changer certains parametres:
//la, y'a rien qui change
STARTUPINFO startUpInfo = {sizeof(STARTUPINFO),NULL,NULL,NULL,
0,0,0,0,0,0,0,STARTF_USESHOWWINDOW,SW_HIDE,0,NULL,0,0,0};
//c'est la que ca change un peu
CreateProcess(convert_path,param,NULL,NULL,0,NORMAL_PRIORITY_CLASS,
NULL,NULL,&startUpInfo,&pi);

Alors ca plante plus, mais ca fait rien, pas de conversion, que dalle.

Je sais que ca vient du &startUpInfo que j'ai mis a la fin de la fonction car si je mets NULL a la place, ca plante.

Si quelqu'un peu m'expliquer comment fonction cette fonction ce serait sympa.
Messages postés
7
Date d'inscription
mardi 15 février 2005
Statut
Membre
Dernière intervention
6 juin 2007

finalement, je fais ca : 
//on attend que le fichier Bmp soit créé
FILE *file=fopen("fichier.bmp","r");
while(!file) 
{
file=fopen("fichier.bmp","r");
_sleep(1); 
}
fclose(file);

Merci pour le coup de main.

A+
Messages postés
178
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
1
un Sleep de 1 ms, t'a une dent contre ton proco ?

un WaitForSingleObject sera beaucoup moins gourmand.... mais faut alors utiliser createrprocess...