Transcodage arabe anglais [Résolu]

Signaler
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
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 !!!!

voila ou j'en suis :

#include <windows.h>
#include <stdio.h>

#define ID_B_TRADUIRE 0
#define ID_B_QUITTER 1
#define ID_B_TEST 2
#define ID_ANGAR  3
#define ID_ARANG  4

HINSTANCE instance;

LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM);

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

    classeFenetre.style = 0;
    classeFenetre.lpfnWndProc = procedureFenetrePrincipale;
    classeFenetre.cbClsExtra = 0;
    classeFenetre.cbWndExtra = 0;
    classeFenetre.hInstance = NULL;
    classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW);
    classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
    classeFenetre.lpszMenuName =  NULL;
    classeFenetre.lpszClassName = "classeF";

    // On prévoit quand même le cas où ça échoue
    if(!RegisterClass(&classeFenetre)) return FALSE;

    fenetrePrincipale = CreateWindow("classeF", "Transcodage arabe anglais", WS_OVERLAPPEDWINDOW,
                                   CW_USEDEFAULT, CW_USEDEFAULT, 400, 300,
                                                   NULL, NULL, cetteInstance, NULL);
    if (!fenetrePrincipale) return FALSE;

    ShowWindow(fenetrePrincipale, modeDAffichage);
    UpdateWindow(fenetrePrincipale);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

//variables globales
HINSTANCE cetteInstance;
HWND hEdit[1]; //handle des deux contrôles d'édition

//Afficher un contrôle d'édition d'une ligne
HWND afficheEditUneLigne (HWND fenetrePrincipale)
{
HWND hEdit=CreateWindow(
                        "EDIT",
                        "Modifiez le texte SVP",
                         WS_VISIBLE|WS_CHILD|WS_BORDER|ES_CENTER ,
                        30, 80, 383, 30,fenetrePrincipale,NULL,instance,NULL);

return hEdit;
}
//Traitement des messages
void msgCtl(HWND fenetrePrincipale,UINT msg, WPARAM wParam, LPARAM lParam)
{
UINT motBas =  LOWORD(wParam);
HWND hCtl= (HWND) lParam;
int nombreLignes=0;
char lignes[70]={0},nLignes[5]={0};

}
//Traitement des notifications
void NotificationControle(HWND fenetrePrincipale,UINT msg, WPARAM wParam, LPARAM lParam)
{
UINT motHaut= HIWORD(wParam);
HWND hCtl= (HWND) lParam;

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;
}
}

LRESULT CALLBACK  Procedure (HWND fenetrePrincipale, UINT msg, WPARAM wParam, LPARAM lParam)
{

        switch (msg)

    {
        //afficher les contrôles d'édition à la réception du message WM_CREATE
        case WM_CREATE:
               hEdit[0]=afficheEditUneLigne (fenetrePrincipale);

        default:
            return DefWindowProc(fenetrePrincipale, msg, wParam, lParam);
        }
}
LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND boutons[5] = {NULL};

    switch (msg)
    {
        case WM_CREATE:
                boutons[0] = CreateWindow("BUTTON", "Traduire", WS_CHILD | WS_VISIBLE,
        5, 145, 383, 30, fenetrePrincipale, (HMENU)ID_B_TRADUIRE, instance, NULL);
                boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE,
        5, 185, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL);

                HWND hGroup = CreateWindow("BUTTON","*** Votre Choix : ***",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
        10,5,383,60,fenetrePrincipale,NULL,instance,NULL);
    {
        HWND hControle;
                hControle = CreateWindow("BUTTON","anglais/arabe",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
        20,25,120,30,fenetrePrincipale,(HMENU)ID_ANGAR,instance,NULL);
                hControle = CreateWindow("BUTTON","arabe/anglais",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
        260,25,120,30,fenetrePrincipale,(HMENU)ID_ARANG,instance,NULL);
                 return 0;
    }
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case ID_B_TRADUIRE:
                    MessageBox(fenetrePrincipale, "Il n'y a rien à traduire", "Bonjour.", MB_ICONINFORMATION);
                    break;

                case ID_B_QUITTER:
                    SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
                    break;

                case ID_B_TEST:
                    SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0);
                    break;
            }
            return 0;

        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;

        default:
            return DefWindowProc(fenetrePrincipale, msg, wParam, lParam);
    }
}

merci de votre aide

64 réponses

Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

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);



    fp = fopen("C:\\proj\\a.txt","w");
    if(fp != NULL)
    {
          fprintf(fp,"%s",&ascii_code);
          fclose(fp);
    }
    return 0;
}

merci de votre aide !
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonjour,

Après suppression de choses inutiles, voici un petit réaménagement qui fonctionne (sous Visual C++ 6.0) :

#include <stdio.h>
#include <windows.h>



#define ID_ANGAR      1000
#define ID_ARANG      1001
#define ID_TEXTE      1002
#define ID_B_EFFACER  1003
#define ID_B_TRADUIRE 1004






// --- Variables globales
HINSTANCE instanceGlobale = NULL;
int       sensTraduction  = 1; // 1=ANGAR 2=ARANG



#define   LONGUEUR_MAXI_TEXT  100
char      Text[LONGUEUR_MAXI_TEXT];






// --- Prototypes des fonctions locales
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK procedureFenetrePrincipale(HWND,UINT,WPARAM,LPARAM);
void TraduireANGAR(void);
void TraduireARANG(void);




 




 



// ===================
// Fonction principale
// ===================



int WINAPI WinMain
(
    HINSTANCE cetteInstance
   ,HINSTANCE precedenteInstance
   ,LPSTR     lignesDeCommande
   ,int       modeDAffichage
)
{
   HWND     fenetrePrincipale;
   WNDCLASS classeFenetre;
   MSG      msg;



  
   // --- Mémo de l'instance globale
   instanceGlobale = cetteInstance;



  
   // --- Enregistrer la classe de la fenêtre principale
   classeFenetre.style         = 0;
   classeFenetre.lpfnWndProc   = procedureFenetrePrincipale;
   classeFenetre.cbClsExtra    = 0;
   classeFenetre.cbWndExtra    = 0;
   classeFenetre.hInstance     = instanceGlobale;
   classeFenetre.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
   classeFenetre.hCursor       = LoadCursor(NULL,IDC_ARROW);
   classeFenetre.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   classeFenetre.lpszMenuName  = NULL;
   classeFenetre.lpszClassName = "classeF";
   if (! RegisterClass(&classeFenetre)) return 0;






   // --- Créer la fenêtre principale
   fenetrePrincipale = CreateWindow
   (
       "classeF"
      ,"Traduction Arabe/Anglais"
      ,WS_OVERLAPPEDWINDOW
      ,CW_USEDEFAULT,CW_USEDEFAULT // x,y
      ,400,220                     // largeur,hauteur
      ,(HWND)NULL
      ,(HMENU)NULL
      ,instanceGlobale
      ,(LPVOID)NULL
   );
   if (fenetrePrincipale == NULL) return 0;
   ShowWindow(fenetrePrincipale,modeDAffichage);
   UpdateWindow(fenetrePrincipale);






   // --- Traiter les messages de la fenêtre
   while (GetMessage(&msg,NULL,0,0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return msg.wParam;
}




 




 



// =============================================
// Traiter les messages de la fenêtre principale
// =============================================



LRESULT CALLBACK procedureFenetrePrincipale
(
    HWND   fenetrePrincipale
   ,UINT   msg
   ,WPARAM wParam
   ,LPARAM lParam
)
{
   static HWND boutonANGAR    = NULL;
   static HWND boutonARANG    = NULL;
   static HWND zoneTexte      = NULL;
   static HWND boutonEffacer  = NULL;
   static HWND boutonTraduire = NULL;
   static HWND boutonQuitter  = NULL;



   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
         );




         // --- Radiobouton de sélection du sens de traduction
         boutonANGAR = CreateWindow
         (
             "BUTTON"
            ,"Anglais vers Arabe"
            ,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
            ,20,25  // x,y
            ,140,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_ANGAR
            ,instanceGlobale
            ,NULL
         );
         boutonARANG = CreateWindow
         (
             "BUTTON"
            ,"Arabe vers Anglais"
            ,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
            ,230,25 // x,y
            ,140,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_ARANG
            ,instanceGlobale
            ,NULL
         );
         CheckRadioButton(fenetrePrincipale,ID_ANGAR,ID_ARANG
                         ,sensTraduction == 1 ? ID_ANGAR : ID_ARANG);




         // --- Zone de texte
         zoneTexte = CreateWindow
         (
             "EDIT"
            ,"Modifiez le texte SVP"
            ,WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_CENTER
            ,10,70  // x,y
            ,335,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_TEXTE
            ,instanceGlobale
            ,NULL
         );
         SendMessage(GetDlgItem(fenetrePrincipale,ID_TEXTE),EM_LIMITTEXT
                    ,(WPARAM)LONGUEUR_MAXI_TEXT,(LPARAM)0);




         // --- Bouton pour effacer
         boutonEffacer = CreateWindow
         (
             "BUTTON"
            ,"C"
            ,WS_CHILD | WS_VISIBLE
            ,355,70 // x,y
            ,30,30  // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_EFFACER
            ,instanceGlobale
            ,NULL
         );




         // --- Bouton pour traduire
         boutonTraduire = CreateWindow
         (
             "BUTTON"
            ,"Traduire"
            ,WS_CHILD | WS_VISIBLE
            ,10,110 // x,y
            ,375,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_TRADUIRE
            ,instanceGlobale
            ,NULL
         );




         // --- Bouton pour quitter
         boutonQuitter = CreateWindow
         (
             "BUTTON"
            ,"Quitter"
            ,WS_CHILD | WS_VISIBLE
            ,10,150 // x,y
            ,375,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)IDCANCEL
            ,instanceGlobale
            ,NULL
         );
      }
      return 0;






      // --- 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");
}






Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

merci beaucoup ...
maintenant que j'ai le fond il me reste a travailler la forme ;-) !

comment fais t on pour :
afficher l'écriture arabe?
ecrire de droite a gauche?

merci de votra aide
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

ok donc si j'utilse ce style ( mon xp accepte la langue arabe) , le script affichera bien les caracteres arabes au lieu des petits carré?
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Je ne sais pas du tout si c'est suffisant ! Essayez avec ça au niveau de la création de la zone de texte :

         // --- Zone de texte
         zoneTexte = CreateWindowEx
         (
             WS_EX_RTLREADING
            ,"EDIT"
            ,"Modifiez le texte SVP"
            ,WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_CENTER
            ,10,70  // x,y
            ,335,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_TEXTE
            ,instanceGlobale
            ,NULL
         );

Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

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?
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Pour la cohabitation entre 2 langues aussi différentes, il faudrait avoir l'aide de quelqu'un qui a déjà réaliser un tel programme !

En ce qui concerne la fenêtre DOS, je n'ai pas ça ici (compilation avec Visual C++ 6.0) !

Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

j'ai essayé de moficier cette partie du code de l'interface

// ====================================
// Traduction de l'anglais vers l'arabe
// ====================================


void TraduireANGAR(void)
{
   sprintf(Text,"%c",fopen("C:\\proj\\a.txt","r"));
}

mais lorsque j'execute cela me donne des caracteres au hasard ( ?, à @, $ ...)
pourquoi?
aidez moi svp?
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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



Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

merci mais j'avais déja un progamme similaire :
#include <stdlib.h>
#include <stdio.h>


int main(void)
{
    int ascii_code;
    FILE *fp;
    printf("veuillez saisir le code ascii d'un mot ou lettre arabe: ");
    scanf("%d",&ascii_code);


    fp = fopen("C:\\proj\\a.txt","w");
    if(fp != NULL)
    {
          fprintf(fp,"%s",&ascii_code);
          fclose(fp);
    }
    return 0;
}

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 !
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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 !

Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

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 ,

je ne sais pas si c'est plus clair
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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 !

Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

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 :-$ ...
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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 ?

Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

oui en fait c'est du latin/arabe car par la suite on devait réaliser un vrai traducteur mais bon pas le temps donc on e limite a la 1e étape ...


en fait j'ai actuellement 2 parties :


la fenetre graphique


et la derniere étape qui consite a afficher une lettre correspondant au code ascii entrée en console.


IL faut donc fusionner ces 2 programme ainsi que d'autre fonction pour avoir cette demarche :


lettre latine>code ascii> code ascii (du caractere arabe)>lettre 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 ...
 
merci beaucoup de votre aide !
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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 !

#define UNICODE
#include <stdio.h>
#include <windows.h>



#define ID_LATIN_ARABE   1000
#define ID_ARABE_LATIN   1001
#define ID_TEXTE         1002
#define ID_B_EFFACER     1003
#define ID_B_TRANSCODER  1004






// --- Variables globales
HINSTANCE instanceGlobale = NULL;
int       sensTranscoder  = 1; // 1=Latin ver Arabe, 2=Arabe vers latin



#define   LONGUEUR_MAXI_TEXTE  100
TCHAR     TexteEntree[LONGUEUR_MAXI_TEXTE];
TCHAR     TexteSortie[LONGUEUR_MAXI_TEXTE];






// --- Prototypes des fonctions locales
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK procedureFenetrePrincipale(HWND,UINT,WPARAM,LPARAM);
void LatinVersArabe(void);
void ArabeVersLatin(void);




 




 



// ===================
// Fonction principale
// ===================



int WINAPI WinMain
(
    HINSTANCE cetteInstance
   ,HINSTANCE precedenteInstance
   ,LPSTR     lignesDeCommande
   ,int       modeDAffichage
)
{
   HWND       fenetrePrincipale;
   WNDCLASSEX classeFenetre;
   MSG        msg;



  
   // --- Mémo de l'instance globale
   instanceGlobale = cetteInstance;



  
   // --- Enregistrer la classe de la fenêtre principale
   classeFenetre.cbSize        = sizeof(WNDCLASSEX);
   classeFenetre.style         = 0;
   classeFenetre.lpfnWndProc   = procedureFenetrePrincipale;
   classeFenetre.cbClsExtra    = 0;
   classeFenetre.cbWndExtra    = 0;
   classeFenetre.hInstance     = instanceGlobale;
   classeFenetre.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
   classeFenetre.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);
   classeFenetre.hCursor       = LoadCursor(NULL,IDC_ARROW);
   classeFenetre.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   classeFenetre.lpszMenuName  = NULL;
   classeFenetre.lpszClassName = TEXT("classeF");
   if (! RegisterClassEx(&classeFenetre)) return 0;






   // --- Créer la fenêtre principale
   fenetrePrincipale = CreateWindow
   (
       TEXT("classeF")
      ,TEXT("Transcodage Arabe/Latin")
      ,WS_OVERLAPPEDWINDOW
      ,CW_USEDEFAULT,CW_USEDEFAULT // x,y
      ,400,185                     // largeur,hauteur
      ,(HWND)NULL
      ,(HMENU)NULL
      ,instanceGlobale
      ,(LPVOID)NULL
   );
   if (fenetrePrincipale == NULL) return 0;
   ShowWindow(fenetrePrincipale,modeDAffichage);
   UpdateWindow(fenetrePrincipale);






   // --- Traiter les messages de la fenêtre
   while (GetMessage(&msg,NULL,0,0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return msg.wParam;
}




 




 



// =============================================
// Traiter les messages de la fenêtre principale
// =============================================



LRESULT CALLBACK procedureFenetrePrincipale
(
    HWND   fenetrePrincipale
   ,UINT   msg
   ,WPARAM wParam
   ,LPARAM lParam
)
{
   static HWND boutonLATIN_ARABE = NULL;
   static HWND boutonARABE_LATIN = NULL;
   static HWND zoneTexte         = NULL;
   static HWND boutonEffacer     = NULL;
   static HWND boutonTranscoder  = NULL;
   static HWND boutonQuitter     = NULL;



   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
         );




         // --- 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
            ,140,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
            ,230,25 // x,y
            ,140,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_ARABE_LATIN
            ,instanceGlobale
            ,NULL
         );
         CheckRadioButton(fenetrePrincipale,ID_LATIN_ARABE,ID_ARABE_LATIN
                         ,sensTranscoder == 1 ? ID_LATIN_ARABE : ID_ARABE_LATIN);




         // --- Zone de texte
         zoneTexte = CreateWindow
         (
             TEXT("EDIT")
            ,TEXT("Modifiez le texte SVP")
            ,WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_CENTER
            ,10,70  // x,y
            ,335,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_TEXTE
            ,instanceGlobale
            ,NULL
         );
         SendMessage(GetDlgItem(fenetrePrincipale,ID_TEXTE),EM_LIMITTEXT
                    ,(WPARAM)LONGUEUR_MAXI_TEXTE,(LPARAM)0);




         // --- Fonte dans la zone de texte
         HFONT hFont = CreateFont
         (
             -MulDiv(15,GetDeviceCaps(GetDC(fenetrePrincipale),LOGPIXELSY),72) // hauteur
            ,0                        // largeur
            ,0                        // inclinaison du texte
            ,0                        // orientation
            ,FW_NORMAL                // graisse
            ,(DWORD)false             // italique
            ,(DWORD)false             // souligné
            ,FALSE                    // barré
            ,ANSI_CHARSET             // jeu de caractères
            ,OUT_DEFAULT_PRECIS       // précision du tracé
            ,CLIP_DEFAULT_PRECIS      // précision du rognage
            ,PROOF_QUALITY            // qualité
            ,DEFAULT_PITCH | FF_SWISS // pitch et famille
            ,TEXT("Arial")            // nom de la fonte
         );
         SendMessage(GetDlgItem(fenetrePrincipale,ID_TEXTE),WM_SETFONT,(WPARAM)hFont,(LPARAM)true);




         // --- Bouton pour effacer
         boutonEffacer = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("C")
            ,WS_CHILD | WS_VISIBLE
            ,355,70 // x,y
            ,30,30  // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_EFFACER
            ,instanceGlobale
            ,NULL
         );




         // --- Bouton pour transcoder
         boutonTranscoder = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("Transcoder")
            ,WS_CHILD | WS_VISIBLE
            ,10,110 // x,y
            ,185,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_TRANSCODER
            ,instanceGlobale
            ,NULL
         );




         // --- Bouton pour quitter
         boutonQuitter = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("Quitter")
            ,WS_CHILD | WS_VISIBLE
            ,200,110 // x,y
            ,185,30  // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)IDCANCEL
            ,instanceGlobale
            ,NULL
         );
      }
      return 0;






      // --- 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".

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>








 
<description>
Transcodage Latin/Arabe
</description>



<dependency>
   <dependentAssembly>
     
   </dependentAssembly>
</dependency>










Jean-François
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

je ne saurais comment vous remercier !


cependant il reste quelque points a éclaircir, 
par exemple pour représenter un CH , une seule lettre arabe suffit ... comment faire?

voila mon msn ce sera plus pratique :
[mailto:elmarokinhodu76@hotmail.co elmarokinhodu76@hotmail.co]m

 et encore mille merci !
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
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 !

#define UNICODE
#include <stdio.h>
#include <windows.h>



#define ID_LATIN_ARABE   1000
#define ID_ARABE_LATIN   1001
#define ID_TEXTE         1002
#define ID_B_EFFACER     1003
#define ID_B_TRANSCODER  1004





// --- Variables globales
HINSTANCE instanceGlobale = NULL;
int       sensTranscoder  = 1; // 1=Latin ver Arabe, 2=Arabe vers latin



#define   LONGUEUR_MAXI_TEXTE  100
TCHAR     TexteEntree[LONGUEUR_MAXI_TEXTE];
TCHAR     TexteSortie[LONGUEUR_MAXI_TEXTE];





// --- Prototypes des fonctions locales
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK procedureFenetrePrincipale(HWND,UINT,WPARAM,LPARAM);
void LatinVersArabe(void);
void ArabeVersLatin(void);




 




 



// ===================
// Fonction principale
// ===================



int WINAPI WinMain
(
    HINSTANCE cetteInstance
   ,HINSTANCE precedenteInstance
   ,LPSTR     lignesDeCommande
   ,int       modeDAffichage
)
{
   HWND       fenetrePrincipale;
   WNDCLASSEX classeFenetre;
   MSG        msg;



  
   // --- Mémo de l'instance globale
   instanceGlobale = cetteInstance;



  
   // --- Enregistrer la classe de la fenêtre principale
   classeFenetre.cbSize        = sizeof(WNDCLASSEX);
   classeFenetre.style         = 0;
   classeFenetre.lpfnWndProc   = procedureFenetrePrincipale;
   classeFenetre.cbClsExtra    = 0;
   classeFenetre.cbWndExtra    = 0;
   classeFenetre.hInstance     = instanceGlobale;
   classeFenetre.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
   classeFenetre.hIconSm       = LoadIcon(NULL,IDI_APPLICATION);
   classeFenetre.hCursor       = LoadCursor(NULL,IDC_ARROW);
   classeFenetre.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   classeFenetre.lpszMenuName  = NULL;
   classeFenetre.lpszClassName = TEXT("classeF");
   if (! RegisterClassEx(&classeFenetre)) return 0;





   // --- Créer la fenêtre principale
   fenetrePrincipale = CreateWindow
   (
       TEXT("classeF")
      ,TEXT("Transcodage Arabe/Latin")
      ,WS_OVERLAPPEDWINDOW
      ,CW_USEDEFAULT,CW_USEDEFAULT // x,y
      ,400,185                     // largeur,hauteur
      ,(HWND)NULL
      ,(HMENU)NULL
      ,instanceGlobale
      ,(LPVOID)NULL
   );
   if (fenetrePrincipale == NULL) return 0;
   ShowWindow(fenetrePrincipale,modeDAffichage);
   UpdateWindow(fenetrePrincipale);





   // --- Traiter les messages de la fenêtre
   while (GetMessage(&msg,NULL,0,0))
   {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
   return msg.wParam;
}




 




 



// =============================================
// Traiter les messages de la fenêtre principale
// =============================================



LRESULT CALLBACK procedureFenetrePrincipale
(
    HWND   fenetrePrincipale
   ,UINT   msg
   ,WPARAM wParam
   ,LPARAM lParam
)
{
   static HWND boutonLATIN_ARABE = NULL;
   static HWND boutonARABE_LATIN = NULL;
   static HWND zoneTexte         = NULL;
   static HWND boutonEffacer     = NULL;
   static HWND boutonTranscoder  = NULL;
   static HWND boutonQuitter     = NULL;



   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
         );



        
         // --- Zone de texte
         zoneTexte = CreateWindow
         (
             TEXT("EDIT")
            ,TEXT("Modifiez le texte SVP")
            ,WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_CENTER
            , 10,70 // x,y
            ,335,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_TEXTE
            ,instanceGlobale
            ,NULL
         );
         SendMessage // renseigner la taille maxi saisissable
         (
             GetDlgItem(fenetrePrincipale,ID_TEXTE)
            ,EM_LIMITTEXT
            ,(WPARAM)LONGUEUR_MAXI_TEXTE
            ,(LPARAM)0
         );



        
         // --- Fonte dans la zone de texte
         HFONT hFont = CreateFont
         (
             -MulDiv(17
                    ,GetDeviceCaps(GetDC(fenetrePrincipale),LOGPIXELSY)
                    ,72)              // hauteur (16 points ici)
            ,0                        // largeur
            ,0                        // inclinaison du texte
            ,0                        // orientation
            ,FW_NORMAL                // graisse
            ,(DWORD)false             // italique
            ,(DWORD)false             // souligné
            ,FALSE                    // barré
            ,ANSI_CHARSET             // jeu de caractères
            ,OUT_DEFAULT_PRECIS       // précision du tracé
            ,CLIP_DEFAULT_PRECIS      // précision du rognage
            ,PROOF_QUALITY            // qualité
            ,DEFAULT_PITCH | FF_SWISS // pitch et famille
            ,TEXT("Arial")            // nom de la fonte
         );
         SendMessage // forcer la fonte
         (
             GetDlgItem(fenetrePrincipale,ID_TEXTE)
            ,WM_SETFONT
            ,(WPARAM)hFont
            ,(LPARAM)true
         );



        
         // --- Bouton pour effacer
         boutonEffacer = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("C")
            ,WS_CHILD | WS_VISIBLE
            ,355,70 // x,y
            , 30,30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_EFFACER
            ,instanceGlobale
            ,NULL
         );



        
         // --- Bouton pour transcoder
         boutonTranscoder = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("Transcoder")
            ,WS_CHILD | WS_VISIBLE
            , 10,110 // x,y
            ,185, 30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)ID_B_TRANSCODER
            ,instanceGlobale
            ,NULL
         );



        
         // --- Bouton pour quitter
         boutonQuitter = CreateWindow
         (
             TEXT("BUTTON")
            ,TEXT("Quitter")
            ,WS_CHILD | WS_VISIBLE
            ,200,110 // x,y
            ,185, 30 // largeur,hauteur
            ,fenetrePrincipale
            ,(HMENU)IDCANCEL
            ,instanceGlobale
            ,NULL
         );
      }
      return 0;





      // -------------------------------------
      // 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;



         case 1613 :
         {
            TexteSortie[iSortie++] = 'C';
            TexteSortie[iSortie++] = 'H';
         }
         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
}



Jean-François