elmarokinho
Messages postés58Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention 6 février 2009
-
21 mars 2008 à 16:07
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 2009
-
28 mars 2008 à 01:25
bonjour,
je suis en DUT 2e année ... je dois réaliser un projet pr la
mi-mars ;
:
realisation d'un logiciel de transcodage anglais/arabe
...
voila j'ai commencé a me remettre au langage C , d'ailleurs je me dit que
j'aurais bien fait 'écouter un peu plus en cours ^^ ...
Donc si quelqun a
déja réalisé ce type de projet ou si vous avez un code source d'un logiciel
proche qui pourrait m'aider , merci de me faire signe
pour ma part je suis chargé de l'interface graphique.
j'utilise WinApi mais je n'arrive pas a intégrer une zone de texte !!!!
int WINAPI WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance,
LPSTR lignesDeCommande, int modeDAffichage)
{
HWND fenetrePrincipale;
WNDCLASS classeFenetre;
//Variables de la fonction principale
MSG msg;
instance = cetteInstance;
// Structure de la classe de la fenêtre principale
switch(motHaut)
{
//Notification EN_CHANGE envoyée par le contrôle
case EN_CHANGE:
if (hCtl == hEdit[0])
{
MessageBox(fenetrePrincipale,"Vous avez modifié le texte d'une contrôle à une ligne !!","",MB_OK);
}
break;
case BN_CLICKED: // cliquer sur un des boutons pour analyser les messages
msgCtl((HWND)fenetrePrincipale,(UINT)msg,(WPARAM)wParam,(LPARAM)lParam);
break;
}
}
elmarokinho
Messages postés58Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention 6 février 2009 25 mars 2008 à 16:35
bonjour,
outre le probleme de l'affichage de caractere. il me reste plus beaucoup de temps pour mettre sur pied un programme fonctionnel quitte a ce que se soit de français a français, uniquement pour afficher la démarche.
voila j'ai écri un programe servan a une étape du projet qui écri dans un fichier le caractere corespondan au code ascii ( exemple si jentre 6 la lettre sera affichée dans le fichier txt).
Donc je ne parviens pas a intégrer le contenu de ce fichier dans ma fenetre, a la place du "résultat...".
Comment faire svp?
voila le code du programme ...
est-ce que je doit executer directement le prog en ariere plan, ou je doit l'executer indépendemment du premier. L'ideal serait d'avoir a la fin un seul .exe
code :
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int ascii_code;
FILE *fp;
printf("vueillez saisir le code ascii d'un mot ou lettre arabe: ");
scanf("%d",&ascii_code);
switch (msg)
{
// --- Creation de la fenêtre principale
case WM_CREATE:
{
// --- GROUPBOX autour de la sélection du sens de traduction
CreateWindow
(
"BUTTON"
,"Sens de la traduction"
,WS_CHILD | WS_VISIBLE | BS_GROUPBOX
,10,10 // x,y
,375,50 // largeur,hauteur
,fenetrePrincipale
,NULL
,instanceGlobale
,NULL
);
// --- Traitement d'une commande
case WM_COMMAND:
switch(LOWORD(wParam))
{
// --- Radiobouton Anglais vers Arabe
case ID_ANGAR :
sensTraduction = 1;
break;
// --- Radiobouton Arabe vers Anglais
case ID_ARANG :
sensTraduction = 2;
break;
// --- Saisie dans la zone
case ID_TEXTE :
{
// --- Valider/invalider les boutons d'effacement et de traduction
// --- en fonction de l'existance d'un texte à traduire
GetDlgItemText(fenetrePrincipale,ID_TEXTE,Text,LONGUEUR_MAXI_TEXT);
BOOL b = (BOOL)(Text[0] != 0);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_EFFACER) ,b);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_TRADUIRE),b);
}
break;
// --- Bouton pour effacer
case ID_B_EFFACER :
SetDlgItemText(fenetrePrincipale,ID_TEXTE,"");
SetFocus(GetDlgItem(fenetrePrincipale,ID_TEXTE));
break;
// --- Bouton pour traduire
case ID_B_TRADUIRE :
{
GetDlgItemText(fenetrePrincipale,ID_TEXTE,Text,LONGUEUR_MAXI_TEXT);
if (sensTraduction == 1)
TraduireANGAR();
else
TraduireARANG();
SetDlgItemText(fenetrePrincipale,ID_TEXTE,Text);
}
break;
// --- Bouton pour quitter
case IDCANCEL :
SendMessage(fenetrePrincipale,WM_DESTROY,0,0);
break;
}
return 0;
// --- Quitter le programme
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
// --- Traitement par défaut
return DefWindowProc(fenetrePrincipale,msg,wParam,lParam);
}
// ====================================
// Traduction de l'anglais vers l'arabe
// ====================================
void TraduireANGAR(void)
{
strcpy(Text,"Résultat de l'anglais vers l'arabe");
}
// ====================================
// Traduction de l'arabe vers l'anglais
// ====================================
void TraduireARANG(void)
{
strcpy(Text,"Résultat de l'arabe vers l'anglais");
}
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 24 mars 2008 à 16:13
Ca je n'ai jamais utilisé ! je sais qu'il existe un style étendu pour ça (WS_EX_RTLREADING en utilisant un CreateWindowEx() à la place d'un CreateWindow()) mais d'après la doc il faut que le système soit paramétrer sur une langue utilisant ce sens d'écriture donc c'est tout ou rien !
Il va falloir inverser les caractères avant visu !
Jean-François
Vous n’avez pas trouvé la réponse que vous recherchez ?
elmarokinho
Messages postés58Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention 6 février 2009 24 mars 2008 à 16:42
merci beaucoup pour tout le mal que vous vous donnez mais lorsque je modifie la source, et que j'execute il n'y a aucune difference avec le précedenet. comment puis-je intégrer une police arabe?
et également, pourquoi ai-je une fenetre Dos qui s'ouvre en arriere plan lorsque j'execute le programme?
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 25 mars 2008 à 21:09
Bonsoir,
J'étais absent aujourd'hui d'où cette réponse un peu tardive !
1) Dans le petit programme d'écriture dans le fichier a.txt il faut remplacer le
fprintf(fp,"%s",&ascii_code); // faux
- %s = chaîne de caractères (= tableau de caractères terminé par un 0 binaire)
- &ascii_code = adresse de la variable ascii_code
par
fprintf(fp,"%c\n",ascii_code);
Si c'est le caractère à enregistrer
ou par
fprintf(fp,"%d\n",ascii_code);
Si c'est le code ASCII du caractère qui est à enregistrer
2) Quant à : sprintf(Text,"%c",fopen("C:\\proj\\a.txt","r"));
cela ne veut malheureusement rien dire ! C'est sensé mettre dans la chaîne de caractères Text, un seul caractère (%c) dont le code ASCII est le code retour de la fonction fopen(). Or cette fonction retourne le pointeur correspondant au fichier dont on demande l'ouverture (ou NULL si ça se passe mal) !!!
Voilà un exemple de programme qui écrit puis qui lit un code ASCII via un fichier :
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int ascii_code;
FILE *fp;
// --- Saisir le caractère
printf("Code ascii d'un mot ou d'une lettre arabe : ");
scanf("%d",&ascii_code);
// --- Ecrire le caractère
fp = fopen("C:\\proj\\a.txt","w");
if (fp != NULL)
{
fprintf(fp,"%d\n",ascii_code); // ou %c
fclose(fp);
}
// --- Lire le caractère
fp = fopen("C:\\proj\\a.txt","r");
if (fp != NULL)
{
fscanf(fp,"%d\n",&ascii_code); // ou %c
fclose(fp);
}
// --- Afficher le caractère lu
printf("ascii_code caractère %c code ASCII %d\n",ascii_code,ascii_code);
return 0;
}
Ce qui donne :
Code ascii d'un mot ou d'une lettre arabe : 65ascii_code caractère A code ASCII 65
ce qu eje voudrais maintenant c'est l'intégrer à la fenetre créée au début du sujet pour avor le contenu du fichier qui s'affiche dans la zone de texte de la fenetre. je pense que cela doit etre possible mais désolé je suis vraiment nul en C !
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mars 2008 à 10:12
Bonjour,
C'est de ce programme là dont je parle dans le point 1) de mon message précédent ! le fprintf() est incorrect !
Je ne comprend pas en quoi consiste l'intégration de ce fichier dans le programme de traduction : Que dans chacune des 2 fonctions de traduction, il y ait le parcours d'un fichier pour y trouver la traduction du mot saisi, ça je comprends. Mais l'enregistrement, puis la lecture, d'un code ASCII, ça je ne comprend pas !
elmarokinho
Messages postés58Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention 6 février 2009 26 mars 2008 à 10:17
en fait c'est du transcodage ...
B= b en arabe .. etc
donc le but du programme :
- saisie du texte
- lecture du code ascii de chaque caractere
- correspondance entre les code ascii arabe/latins
-ecriture du caractere arabe
donc voila j'aimerais intégrer le résultat de cette derniere étape dans mon programme ,
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mars 2008 à 10:40
OK ! Effectivement cela n'est pas du tout de la traduction ! En fin de compte le texte saisi est une représentation du texte arabe avec des caractères latins et il suffit de parcourir ce texte saisi pour remplacer chaque caractère par le caractère arabe correspondant ? Mais pourquoi passer par un fichier ?
D'autre part : En passant par des caractères UNICODE on a accès aux caractères arabes ! Regarder, par exemple, la police Arial avec l'utilitaire "Table des caractères" (dans Démarrer/Tous les programmes/Accessoires/Outils système en demandant l'affichage avancé et Jeux de caractères = Unicode). Et dans la zone "Caractères à copier" on les voit visiblement s'afficher dans le sens arabe !
elmarokinho
Messages postés58Date d'inscriptionvendredi 18 janvier 2008StatutMembreDernière intervention 6 février 2009 26 mars 2008 à 10:56
en fait si je passe par un fichier c'est parce que nous sommes 2 a travailler dessus, je m'occupe de l'interfac, l'autre personne du fond du programme.
nous avons essayé cette fonction en console, maintenant qu'elle marche j'aimerais l'intégrer a la fenetre.
le fichier texte n'est pas nécessaire si je parvient a retourné le résultat directement dans la zone Edit de la fenetre.
mais comment faire?
pour l'Unicode, je ne vois pas comment faire. C'est dans ces moments la que je me rend compte de bon reel niveau :-$ ...
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mars 2008 à 11:04
1) ok mais je ne comprends toujours pas ce qu'il y a dans ce fichier ! c'est le résultat d'un transcodage réalisé sous console et qu'il faut afficher ? Un exemple ne serait pas superflu !
2) D'autre part, vu que c'est du transcodage de caractères, en quoi cela concerne l'anglais ? cela ne serait pas plutôt latin/arabe ?
le tout depuis l'interface graphique...
ça en fait des problemes a gérer... et il fat reproduire cette demarche pour tout les caractere grace a une boucle.
exemple :
je tape A
le programme en retire le code ascii 65
grace a un tableau i fait la correspondance avec le code arabe exemple 1610
le caractere arabe saffiche a l'écran ...
voila je suis un peu désespéré car je n'ai vraiment plus de temps ... il me faut au moin avoir un petit truc a présenté qui fonctionne ...
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mars 2008 à 13:12
Alors voilà ce que cela donne avec Unicode et latin à la place d'anglais. Il n'y a pas de fichier car cela n'a aucune utilité et je me suis basé sur A=1610 B=1611 C=1612 pout le test ! Et ça marche très bien, avec de jolis caractères arabes que je ne comprends pas !
Pour le test, tapez le texte ABC puis bouton "Transcoder" puis sélectionner le sens "Arabe vers Latin" puis bouton "Transcoder" et on retrouve le texte ABC !
switch (msg)
{
// --- Creation de la fenêtre principale
case WM_CREATE:
{
// --- GROUPBOX autour de la sélection du sens de transcodage
CreateWindow
(
TEXT("BUTTON")
,TEXT("Sens du transcodage")
,WS_CHILD | WS_VISIBLE | BS_GROUPBOX
,10,10 // x,y
,375,50 // largeur,hauteur
,fenetrePrincipale
,NULL
,instanceGlobale
,NULL
);
// --- Traitement d'une commande
case WM_COMMAND:
switch(LOWORD(wParam))
{
// --- Radiobouton Latin vers Arabe
case ID_LATIN_ARABE :
sensTranscoder = 1;
break;
// --- Radiobouton Arabe vers Latin
case ID_ARABE_LATIN :
sensTranscoder = 2;
break;
// --- Saisie dans la zone
case ID_TEXTE :
{
// --- Valider/invalider les boutons d'effacement et de transcodage
// --- en fonction de l'existance d'un texte à transcoder
GetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteEntree,LONGUEUR_MAXI_TEXTE);
BOOL b = (BOOL)(TexteEntree[0] != 0);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_EFFACER) ,b);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_TRANSCODER),b);
}
break;
// --- Bouton pour effacer
case ID_B_EFFACER :
SetDlgItemText(fenetrePrincipale,ID_TEXTE,TEXT(""));
SetFocus(GetDlgItem(fenetrePrincipale,ID_TEXTE));
break;
// --- Bouton pour transcoder
case ID_B_TRANSCODER :
{
GetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteEntree,LONGUEUR_MAXI_TEXTE);
if (sensTranscoder == 1) LatinVersArabe(); else ArabeVersLatin();
SetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteSortie);
}
break;
// --- Bouton pour quitter
case IDCANCEL :
SendMessage(fenetrePrincipale,WM_DESTROY,0,0);
break;
}
return 0;
// --- Quitter le programme
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
// --- Traitement par défaut
return DefWindowProc(fenetrePrincipale,msg,wParam,lParam);
}
// ==================================================
// Transcoder du latin vers l'arabe
// --------------------------------------------------
// TexteEntree = Texte saisi en caractères latin
// TexteSortie = Texte transcodé en caractères arabes
// ==================================================
void LatinVersArabe(void)
{
int iSortie = 0;
for (int iEntree=0 ; TexteEntree[iEntree] ; ++iEntree)
{
switch (TexteEntree[iEntree])
{
case 'A' : TexteSortie[iSortie] = 1610; break;
case 'B' : TexteSortie[iSortie] = 1611; break;
case 'C' : TexteSortie[iSortie] = 1612; break;
// ...
default : TexteSortie[iSortie] = TexteEntree[iEntree]; break;
}
++iSortie;
}
TexteSortie[iSortie] = 0; // terminateur de la chaîne
}
// ==================================================
// Transcoder de l'arabe vers le latin
// --------------------------------------------------
// TexteEntree = Texte saisi en caractères arabes
// TexteSortie = Texte transcodé en caractères latins
// ==================================================
void ArabeVersLatin(void)
{
int iSortie = 0;
for (int iEntree=0 ; TexteEntree[iEntree] ; ++iEntree)
{
switch (TexteEntree[iEntree])
{
case 1610 : TexteSortie[iSortie] = 'A'; break;
case 1611 : TexteSortie[iSortie] = 'B'; break;
case 1612 : TexteSortie[iSortie] = 'C'; break;
// ...
default : TexteSortie[iSortie] = TexteEntree[iEntree]; break;
}
++iSortie;
}
TexteSortie[iSortie] = 0; // terminateur de la chaîne
}
Pour que votre programme aie le look XP (très joli) vous pouvez copier les lignes qui suivent dans un fichier qu'il faudra sauvegarder là où se trouve l'exécutable de votre programme et en lui donnant exactement le même nom suivi de ".manifest". Par exemple si le programme s'appelle "Trad.exe" ce fichier devra s'appeler "Trad.exe.manifest".
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 26 mars 2008 à 16:29
Facile ! Voir les 2 fonctions de transcodage avec 1613 pour coder CH. Et cela peut se répéter s'il y a des groupes de 3 caractères. Tout est question de tests, sans oublier de sauter par dessus les caractères traités.
Dans cette version j'ai rajouté de la couleur ! c'est plus joli.
Vous avez remarqué que Windows gère automatiquement le sens d'écriture et le changement de forme d'une lettre en fonction de sa position dans le mot !!! Je découvre aussi.
Je n'utilise pas de messager ! Je n'aime pas du tout et je ne pourrais pas travailler en même temps, alors que répondre à des e-mails n'est pas un problème !
switch (msg)
{
// ---------------------------
// Creer la fenêtre principale
// ---------------------------
case WM_CREATE:
{
// --- GROUPBOX autour de la sélection du sens de transcodage
CreateWindow
(
TEXT("BUTTON")
,TEXT("Sens du transcodage")
,WS_CHILD | WS_VISIBLE | BS_GROUPBOX
, 10,10 // x,y
,375,50 // largeur,hauteur
,fenetrePrincipale
,NULL
,instanceGlobale
,NULL
);
// --- Radioboutons de sélection du sens de transcodage
boutonLATIN_ARABE = CreateWindow
(
TEXT("BUTTON")
,TEXT("Latin vers Arabe")
,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
, 20,25 // x,y
,130,30 // largeur,hauteur
,fenetrePrincipale
,(HMENU)ID_LATIN_ARABE
,instanceGlobale
,NULL
);
boutonARABE_LATIN = CreateWindow
(
TEXT("BUTTON")
,TEXT("Arabe vers Latin")
,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
,245,25 // x,y
,130,30 // largeur,hauteur
,fenetrePrincipale
,(HMENU)ID_ARABE_LATIN
,instanceGlobale
,NULL
);
CheckRadioButton // positionner le radiobouton par défaut
(
fenetrePrincipale
,ID_LATIN_ARABE // ID du premier radiobouton
,ID_ARABE_LATIN // ID du dernier radiobouton
,sensTranscoder == 1 ? ID_LATIN_ARABE : ID_ARABE_LATIN // radiobouton à positionner
);
// -------------------------------------
// Changer la couleur dans la zone texte
// -------------------------------------
case WM_CTLCOLOREDIT :
{
SetBkMode((HDC)wParam,OPAQUE);
if (GetDlgCtrlID((HWND)lParam) == ID_TEXTE)
SetTextColor((HDC)wParam,RGB(255,0,0)); // rouge
}
return (LRESULT)GetStockObject(WHITE_BRUSH);
// -------------------------
// Traiter la commande reçue
// -------------------------
case WM_COMMAND:
switch(LOWORD(wParam))
{
// --- Radiobouton Latin vers Arabe
case ID_LATIN_ARABE :
sensTranscoder = 1;
break;
// --- Radiobouton Arabe vers Latin
case ID_ARABE_LATIN :
sensTranscoder = 2;
break;
// --- Saisie dans la zone
case ID_TEXTE :
{
// --- Valider/invalider les boutons d'effacement et de transcodage
// --- en fonction de l'existance d'un texte à transcoder
GetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteEntree,LONGUEUR_MAXI_TEXTE);
BOOL b = (BOOL)(TexteEntree[0] != 0);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_EFFACER) ,b);
EnableWindow(GetDlgItem(fenetrePrincipale,ID_B_TRANSCODER),b);
}
break;
// --- Bouton pour effacer
case ID_B_EFFACER :
SetDlgItemText(fenetrePrincipale,ID_TEXTE,TEXT(""));
SetFocus(GetDlgItem(fenetrePrincipale,ID_TEXTE));
break;
// --- Bouton pour transcoder
case ID_B_TRANSCODER :
{
GetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteEntree,LONGUEUR_MAXI_TEXTE);
if (sensTranscoder == 1) LatinVersArabe(); else ArabeVersLatin();
SetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteSortie);
}
break;
// --- Bouton pour quitter
case IDCANCEL :
SendMessage(fenetrePrincipale,WM_DESTROY,0,0);
break;
}
return 0;
// --------------------
// Quitter le programme
// --------------------
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
// --- Retour du traitement par défaut pour les messages non traités
return DefWindowProc(fenetrePrincipale,msg,wParam,lParam);
}
// ==================================================
// Transcoder du latin vers l'arabe
// --------------------------------------------------
// TexteEntree = Texte saisi en caractères latin
// TexteSortie = Texte transcodé en caractères arabes
// ==================================================
void LatinVersArabe(void)
{
int iSortie = 0;
for (int iEntree=0 ; TexteEntree[iEntree] ; ++iEntree)
{
switch (TexteEntree[iEntree])
{
case 'A' : TexteSortie[iSortie++] = 1610; break;
case 'B' : TexteSortie[iSortie++] = 1611; break;
case 'C' :
{
if (TexteEntree[iEntree + 1] == 'H')
{
// --- CH
TexteSortie[iSortie++] = 1613; // code pour CH
++iEntree; // sauter le 'H' traité
}
else
{
// --- C
TexteSortie[iSortie++] = 1612;
}
}
break;
// ... Ici les autres caractères latins à transcoder en arabe
// --- Les caractères non reconnus sont conservés
default : TexteSortie[iSortie++] = TexteEntree[iEntree]; break;
}
}
TexteSortie[iSortie] = 0; // terminateur de la chaîne
}
// ==================================================
// Transcoder de l'arabe vers le latin
// --------------------------------------------------
// TexteEntree = Texte saisi en caractères arabes
// TexteSortie = Texte transcodé en caractères latins
// ==================================================
void ArabeVersLatin(void)
{
int iSortie = 0;
for (int iEntree=0 ; TexteEntree[iEntree] ; ++iEntree)
{
switch (TexteEntree[iEntree])
{
case 1610 : TexteSortie[iSortie++] = 'A'; break;
case 1611 : TexteSortie[iSortie++] = 'B'; break;
case 1612 : TexteSortie[iSortie++] = 'C'; break;
// ... ici les autres caractères arabes à transcoder en latin
// --- Les caractères non reconnus sont conservés
default : TexteSortie[iSortie++] = TexteEntree[iEntree]; break;
}
}
TexteSortie[iSortie] = 0; // terminateur de la chaîne
}