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
A voir également:

64 réponses

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

oh merci beaucoup pour votre aide, sincerement je vous suis tres reconnaisant.
D'autant plus que je me demandais comment fair pour certaine lettre ( P , V, X ) qui n'existent pas en arabe ...

merci!
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
En tout cas bon transcodage maintenant ! Et que tout fonctionne bien !

Pour les lettres qui n'ont pas de correspondances en arabe, il suffit de mettre un "case" vide :
case 'P' : break;
Pour ne rien placer en sortie.

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

OK,


pourriez vous me rajouter sur msn car j'ai quelque petites questions a vous poser:


#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] = 1575; break;
         case 'B' : TexteSortie[iSortie] = 1576; break;


         case 'C' :
         {
            if (TexteEntree[iEntree + 1] == 'H')
            {
               // --- CH
               TexteSortie[iSortie++] = 1588; // code pour CH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- C
               TexteSortie[iSortie++] = 1612;
            }
         }
         break;
         case 'D' : TexteSortie[iSortie] = 1583; break;
         case 'E' : TexteSortie[iSortie] = 1600; break;
         case 'F' : TexteSortie[iSortie] = 1601; break;
         case 'G' : TexteSortie[iSortie] = 1575; break;
         case 'H' : TexteSortie[iSortie] = 1581; break;
         case 'I' : TexteSortie[iSortie] = 1575; break;
         case 'J' : TexteSortie[iSortie] = 1580; break;
         case 'K' : TexteSortie[iSortie] = 1603; break;
         case 'L' : TexteSortie[iSortie] = 1604; break;
         case 'M' : TexteSortie[iSortie] = 1605; break;
         case 'N' : TexteSortie[iSortie] = 1606; break;
         case 'O' : TexteSortie[iSortie] = 1575; break;
         case 'P' : TexteSortie[iSortie] = 1575; break;
         case 'Q' : TexteSortie[iSortie] = 1602; break;
         case 'R' : TexteSortie[iSortie] = 1585; break;
         case 'S' : TexteSortie[iSortie] = 1589; break;
         case 'T' : TexteSortie[iSortie] = 1591; break;
         case 'U' : TexteSortie[iSortie] = 1575; break;
         case 'V' : TexteSortie[iSortie] = 1575; break;
         case 'W' : TexteSortie[iSortie] = 1608; break;
         case 'X' : TexteSortie[iSortie] = 1575; break;
         case 'Y' : TexteSortie[iSortie] = 1610; break;
         case 'Z' : TexteSortie[iSortie] = 1586; 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 1575 : TexteSortie[iSortie++] = 'A'; break;
         case 1576: TexteSortie[iSortie++] = 'B'; break;
         case 1612 : TexteSortie[iSortie++] = 'C'; break;


         case 1588 :
         {
            TexteSortie[iSortie++] = 'C';
            TexteSortie[iSortie++] = 'H';
         }
         break;


         // ... ici les autres caractères arabes à transcoder en latin
         case 1583 : TexteSortie[iSortie] = 'D'; break;
         case 1600 : TexteSortie[iSortie] = 'E'; break;
         case 1601 : TexteSortie[iSortie] = 'F'; break;
         case 1581 : TexteSortie[iSortie] = 'H'; break;
         case 1675 : TexteSortie[iSortie] = 'I'; break;
         case 1580 : TexteSortie[iSortie] = 'J'; break;


         // --- Les caractères non reconnus sont conservés
         default  : TexteSortie[iSortie++] = TexteEntree[iEntree]; break;
      }
   }
   TexteSortie[iSortie] = 0; // terminateur de la chaîne
}


par exemple lorsque j'execute ceci aucune lettre ne fonctionne a part le CH , (désolé je ne sais pas comment rajouter de la couleur au post).
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Il manque l'incrémentation de l'indice iSortie : TexteSortie[iSortie++] = ...
Dans les 2 fonctions de transcodage sauf à la mise en place du zéro terminateur où c'est inutile.

Je n'utilise pas de messager  comme MSN ! 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 !

Jean-François
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Je constate que seules les lettres majuscules sont utiles, il serait bon :

- Soit d'ajouter un toupper() pour traiter le caractère à transcoder dans la fonction LatinVersArabe()
  (remplacer switch(TexteEntree[iEntree]) par switch(toupper(TexteEntree[iEntree])))

- Soit d'ajouter le style ES_UPPERCASE aux styles lors de la création de la zone de texte :
 WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_CENTER | ES_UPPERCASE

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

VOILA LA FIN

sincérement je vous remercie de la part de tout mon groupe de travail ... je ne sais pas comment j'aurais pu faire sans vous !
je vais tenter de reproduire le modele que vous m'avez fourni pour toutes les lettres particulieres et au besoin je vous recontacterai.
quoi qu'il en soit je vous ferait parvenir une partie de mon projet car c'est un peu le votre également.

ENCORE MERCI
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonne fin de projet !

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

je viens de voir votre dernier message ,
a quoi sert le troupper?


sert il a traiter les minuscule/majuscules sans disctinction ?


 


autre question, peut etre la derniere, pour la gestion des espace ..


j'ai rajouter cette ligne :


case ' ' : TexteSortie[iSortie] = 160; break;

ainsi que l'équivalent dans l'autre sens mais cela ne semble pas fonctionner je ne vois pas pourquoi ...
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
toupper() = to upper = vers majuscule ! cela retourne le caractère en majuscule (au niveau du traitement, pas de l'affichage contrairement au style ES_UPPERCASE).

Dans Latin vers  Arabe :
case ' ' : TexteSortie[iSortie++] = 160; break;
il manque le ++ et y-a-t'il bien un espace entre les deux apostrophes ?

Dans le sens Arabe vers Latin :
case 160 : TexteSortie[iSortie++] = ' '; break;
avec un espace entre les apostrophes.

Remarque :

TexteSortie[iSortie++] = caractère;
est équivalent à :
TexteSortie[iSortie] = caractère;
++iSortie;

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

voila le code que j'ai actuellement :

#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 | ES_UPPERCASE
            , 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 ' ' : TexteSortie[iSortie++] = 160; break;
         case 'A' : TexteSortie[iSortie] = 1575; break;
         case 'B' : TexteSortie[iSortie] = 1576; break;


         case 'C' :
         {
            if (TexteEntree[iEntree + 1] == 'H')
            {
               // --- CH
               TexteSortie[iSortie++] = 1588; // code pour CH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- C
               TexteSortie[iSortie++] = 1612;
            }
         }
         break;
         case 'D' : TexteSortie[iSortie] = 1583; break;
         case 'E' : TexteSortie[iSortie] = 1600; break;
         case 'F' : TexteSortie[iSortie] = 1601; break;
         case 'G' :
         {
            if (TexteEntree[iEntree + 1] == 'H')
            {
               // --- GH
               TexteSortie[iSortie++] = 1594; // code pour CH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- C
               TexteSortie[iSortie++] = 1580;
            }
         }
         break;
         case 'H' : TexteSortie[iSortie] = 1581; break;
         case 'I' : TexteSortie[iSortie] = 1616; break;
         case 'J' : TexteSortie[iSortie] = 1580; break;
         case 'K' : TexteSortie[iSortie] = 1603; break;
         case 'L' : TexteSortie[iSortie] = 1604; break;
         case 'M' : TexteSortie[iSortie] = 1605; break;
         case 'N' : TexteSortie[iSortie] = 1606; break;
         case 'O' : TexteSortie[iSortie] = 1615; break;
         case 'Q' : TexteSortie[iSortie] = 1602; break;
         case 'R' : TexteSortie[iSortie] = 1585; break;
         case 'S' : TexteSortie[iSortie] = 1589; break;
         case 'T' : TexteSortie[iSortie] = 1591; break;
         case 'U' : TexteSortie[iSortie] = 1575; break;
         case 'V' : TexteSortie[iSortie] = 1584; break;
         case 'W' : TexteSortie[iSortie] = 1608; break;
         case 'Y' : TexteSortie[iSortie] = 1610; break;
         case 'Z' : TexteSortie[iSortie] = 1586; break;


         // ... Ici les autres caractères latins à transcoder en arabe


         // --- Les caractères non reconnus sont conservés
         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 1575 : TexteSortie[iSortie++] = 'A'; break;
         case 1576: TexteSortie[iSortie++] = 'B'; break;
         case 1612 : TexteSortie[iSortie++] = 'C'; break;


         case 1588 :
         {
            TexteSortie[iSortie++] = 'C';
            TexteSortie[iSortie++] = 'H';
         }
         break;
         case 1583 : TexteSortie[iSortie] = 'D'; break;
         case 1600 : TexteSortie[iSortie] = 'E'; break;
         case 1601 : TexteSortie[iSortie] = 'F'; break;
         case 1581 : TexteSortie[iSortie] = 'H'; break;
         case 1616 : TexteSortie[iSortie] = 'I'; break;
         case 1580 : TexteSortie[iSortie] = 'J'; break;
         case 1603 : TexteSortie[iSortie] = 'K'; break;
         case 1604 : TexteSortie[iSortie] = 'L'; break;
         case 1605 : TexteSortie[iSortie] = 'M'; break;
         case 1606 : TexteSortie[iSortie] = 'N'; break;
         case 1615 : TexteSortie[iSortie] = 'O'; break;
         case 1602 : TexteSortie[iSortie] = 'Q'; break;
         case 1585 : TexteSortie[iSortie] = 'R'; break;
         case 1589 : TexteSortie[iSortie] = 'S'; break;
         case 1591 : TexteSortie[iSortie] = 'T'; break;
         case 1584 : TexteSortie[iSortie] = 'V'; break;
         case 1608 : TexteSortie[iSortie] = 'W'; break;
         case 1610 : TexteSortie[iSortie] = 'Y'; break;
         case 1586 : TexteSortie[iSortie] = 'Z'; break;
         case 160 : TexteSortie[iSortie++] = ' '; break;
         // --- Les caractères non reconnus sont conservés
         default  : TexteSortie[iSortie++] = TexteEntree[iEntree]; break;
      }
      ++iSortie;
   }
   TexteSortie[iSortie] = 0; // terminateur de la chaîne
}






lorsque je transcode successivement anglais/arabe Arabe/anglais plusieur fois cela me donne des truc bizarre :

bob > ÈõÈ > BõOB > ÈõOõÈ > BõOOÈOB etc ...

d'autre part, est il possible de limiter a une fois le nombre de trnascvodage dans le meme sens ?
par exemple interdire le arabe/latin deux fois de suite parce que cela donne des résultat surprenant ...
Messages postés
58
Date d'inscription
vendredi 18 janvier 2008
Statut
Membre
Dernière intervention
6 février 2009

En fait j'ai résolu mon probleme, il y'avait un conflit au niveau de iSortie++ et iSortie ...
j'ai tout homogénéisé et plus de probleme
:-)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Bonjour,

On peut invalider le bouton de transcodage pour éviter d'en faire plusieurs à la suite mais je n'ai pas du tout ce problème ici ! Une fois transcodé, d'autre appuis sur le bouton ne changent rien au texte puisque les caractères ne sont plus reconnus (ils ne font plus partie de la même gamme de codes ASCII) et sont donc conservés.

Bien faire attention aux iSortie++. Il doit y en avoir partout sauf sur la mise en place du zéro terminateur où c'est inutile (on peut en mettre un aussi mais cela donnera une incrémentation qui ne servira à rien).

Dans le dernier code posté, à part le problème des iSortie++, surveiller les commentaires placés : il y a des commentaires concernant C et CH dans le traitement de la lettre G, cela ne va pas simplifier la relecture et la maintenance du programme ! Et dans la conversion ArabeVersLatin() il vaudrait mieux placer les case dans l'ordre des codes ASCII arabes; là aussi cela simplifiera la lecture et la maintenance.

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

oui , pour les commentaires je sais qu'il y a encore des petites erreures mais je suis en train de corriger cela.

et pour l'ordre des lettre en arabes , je prefere le laisser dans l'ordre alphabetique français, je trouve cela plus facil pour s'y reperer ...

en tout cas merci beaucoup pour votre aide.

je susi actuellement en train de peaufiner les détails :
- cmment fixer la taille de la fenetre? interdire les agrandissement?
- changer l'icone de la fenetre? (en haut a gache)

il ne me reste plus qu'à rédiger mon rapport, et a préparer le poster du projet :p

encore merci, bonne journée
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Voilà une version modifiée (les modifs sont en rouge) avec :
- Le non-redimensionnement de la fenêtre (style dans CreateWindow()).
- L'utilisation d'icône(s) associée(s) au programme (visible dans l'explorateur de fichiers) et à la barre de titre.
- Lorsque le programme fonctionne correctement il n'y a pas de problème si on appuie plusieurs fois de suite sur le bouton "Transcoder". Par contre ce que j'ai modifié dans cette version, c'est l'alternance automatique dans le sens du transcodage : Quand on appuie sur "Transcoder", le transcodage se réalise et le sens s'inverse comme cela si on appuie à nouveau sur "Transcoder" on retrouve le texte de départ !

#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(instanceGlobale,TEXT("ICONE_PROGRAMME"));
   classeFenetre.hCursor       = LoadCursor(NULL,IDC_ARROW);
   classeFenetre.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
   classeFenetre.lpszMenuName  = NULL;
   classeFenetre.lpszClassName = TEXT("classeF");
   classeFenetre.hIconSm       = NULL;
   if (! RegisterClassEx(&classeFenetre)) return 0;





   // --- Créer la fenêtre principale
   fenetrePrincipale = CreateWindow
   (
       TEXT("classeF")
      ,TEXT("Transcodage Arabe/Latin")
      ,WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX
      ,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:
      {
         // --- Changer l'icône de la barre de titre
         SetClassLong
         (
             fenetrePrincipale
            ,GCL_HICON
            ,(long)LoadIcon(instanceGlobale,TEXT("ICONE_PROGRAMME"))
         );





         // --- 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 | ES_UPPERCASE
            , 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 (1er paramètre)
            ,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 // utiliser la fonte créée
         (
             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 :
         {
            // --- Lire/Transcoder/Montrer
            GetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteEntree,LONGUEUR_MAXI_TEXTE);
            if (sensTranscoder == 1) LatinVersArabe(); else ArabeVersLatin();
            SetDlgItemText(fenetrePrincipale,ID_TEXTE,TexteSortie);




            // --- Alterner automatiquement le sens du transcodage et le positionner            if (sensTranscoder 1) sensTranscoder 2; else sensTranscoder = 1;
            CheckRadioButton
            (
                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
            );
         }
         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 ' ' : TexteSortie[iSortie++] =  160; break;
         case 'A' : TexteSortie[iSortie++] = 1575; break;
         case 'B' : TexteSortie[iSortie++] = 1576; break;



         case 'C' :
         {
            if (TexteEntree[iEntree + 1] == 'H')
            {
               // --- CH
               TexteSortie[iSortie++] = 1588; // code pour CH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- C
               TexteSortie[iSortie++] = 1612;
            }
         }
         break;



         case 'D' : TexteSortie[iSortie++] = 1583; break;
         case 'E' : TexteSortie[iSortie++] = 1600; break;
         case 'F' : TexteSortie[iSortie++] = 1601; break;



         case 'G' :
         {
            if (TexteEntree[iEntree + 1] == 'H')
            {
               // --- GH
               TexteSortie[iSortie++] = 1594; // code pour GH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- G
               TexteSortie[iSortie++] = 1580;
            }
         }
         break;



         case 'H' : TexteSortie[iSortie++] = 1581; break;
         case 'I' : TexteSortie[iSortie++] = 1616; break;
         case 'J' : TexteSortie[iSortie++] = 1580; break;
         case 'K' : TexteSortie[iSortie++] = 1603; break;
         case 'L' : TexteSortie[iSortie++] = 1604; break;
         case 'M' : TexteSortie[iSortie++] = 1605; break;
         case 'N' : TexteSortie[iSortie++] = 1606; break;
         case 'O' : TexteSortie[iSortie++] = 1615; break;
         case 'Q' : TexteSortie[iSortie++] = 1602; break;
         case 'R' : TexteSortie[iSortie++] = 1585; break;
         case 'S' : TexteSortie[iSortie++] = 1589; break;
         case 'T' : TexteSortie[iSortie++] = 1591; break;
         case 'U' : TexteSortie[iSortie++] = 1575; break;
         case 'V' : TexteSortie[iSortie++] = 1584; break;
         case 'W' : TexteSortie[iSortie++] = 1608; break;
         case 'Y' : TexteSortie[iSortie++] = 1610; break;
         case 'Z' : TexteSortie[iSortie++] = 1586; break;



         // --- 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  160 : TexteSortie[iSortie++] = ' '; break;
         case 1575 : TexteSortie[iSortie++] = 'A'; break;
         case 1576 : TexteSortie[iSortie++] = 'B'; break;
         case 1612 : TexteSortie[iSortie++] = 'C'; break;



         case 1588 :
         {
            TexteSortie[iSortie++] = 'C';
            TexteSortie[iSortie++] = 'H';
         }
         break;



         case 1583 : TexteSortie[iSortie++] = 'D'; break;
         case 1600 : TexteSortie[iSortie++] = 'E'; break;
         case 1601 : TexteSortie[iSortie++] = 'F'; break;



         case 1594 :
         {
            TexteSortie[iSortie++] = 'G';
            TexteSortie[iSortie++] = 'H';
         }
         break;



         case 1581 : TexteSortie[iSortie++] = 'H'; break;
         case 1616 : TexteSortie[iSortie++] = 'I'; break;
         case 1580 : TexteSortie[iSortie++] = 'J'; break;
         case 1603 : TexteSortie[iSortie++] = 'K'; break;
         case 1604 : TexteSortie[iSortie++] = 'L'; break;
         case 1605 : TexteSortie[iSortie++] = 'M'; break;
         case 1606 : TexteSortie[iSortie++] = 'N'; break;
         case 1615 : TexteSortie[iSortie++] = 'O'; break;
         case 1602 : TexteSortie[iSortie++] = 'Q'; break;
         case 1585 : TexteSortie[iSortie++] = 'R'; break;
         case 1589 : TexteSortie[iSortie++] = 'S'; break;
         case 1591 : TexteSortie[iSortie++] = 'T'; break;
         case 1584 : TexteSortie[iSortie++] = 'V'; break;
         case 1608 : TexteSortie[iSortie++] = 'W'; break;
         case 1610 : TexteSortie[iSortie++] = 'Y'; break;
         case 1586 : TexteSortie[iSortie++] = 'Z'; break;



         // --- Les caractères non reconnus sont conservés
         default  : TexteSortie[iSortie++] = TexteEntree[iEntree]; break;
      }
   }
   TexteSortie[iSortie] = 0; // terminateur de la chaîne
}


L'utilisation de l'icône nécessite l'ajout d'un fichier de ressources insérer dans le projet. Il doit contenir :

// Programme de transcodage Latin/Arabe
// Fichier des ressources




// --- Icone
ICONE_PROGRAMME  ICON  "icone.ico"




// --- Manifest XP
#ifndef CREATEPROCESS_MANIFEST_RESOURCE_ID
#define CREATEPROCESS_MANIFEST_RESOURCE_ID  1
#endif



#ifndef RT_MANIFEST
#define RT_MANIFEST 24
#endif



CREATEPROCESS_MANIFEST_RESOURCE_ID  RT_MANIFEST  "manifest.xml"


1) L'icône utilisée ici s'appelle icone.ico et se trouve dans le répertoire du projet (sinon ajouter le chemin d'accès adéquat).
2) La partie "Manifest XP" correspond à l'intégration du look XP directement dans l'exécutable créé, sans avoir besoin de promener le fichier "toto.exe.manifest" avec le programme "toto.exe" (si le programme créé se nomme ainsi !). Il faut simplement renommer le fichier manifest utilisé précédemment "toto.exe.manifest" en "manifest.xml" et le déplacer du répertoire de l'exécutable vers le répertoire du projet pour qu'il soit pris en compte à la compilation.



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

bonjour,
maintenant que la premiere étape est finie je me dis que je peux espérer finir la 2e pour viser une bonne note.
Cependant je sais que je n'y arriverais pas tout seul, j'aurais aimé ne pas avoir a vous demander un code tout pres mais le temps manque énormément.
Si vous avez le temps, et uniquement si cela ne vous dérange pas j'aimerais savoir si vous pouviez intégrer une fonction traduction qui prendra comme exemple uniquement quelques mots.

comment je vois la fenetre?
-la traduction ne se fera que de anglais vers arabe
-un troisieme radio bouton traduction ou un champs Edit dédié a la traduction

par exemple j'entre Write. 
Le logiciel me donne 'Kataba' 
ainsi que le transcodage arabe de Kataba (qui sera donc basé sur le scipt qui fonctionne déja parfaitement).

enfin voila, si vous avez du temps avant Lundi je vous serai tres reconaissant sinon sachez que je le suis déja énormément pour tout ce que vous avez fait pour nous.

Cordialement ,

Amin 
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
C'est pas très compliqué à ajouter et là il va y avoir un fichier externe contenant le dictionnaire des traductions !!! par contre une petite liste de traductions ne serait pas de trop pour tester (les 2 mots séparés par un espace) :

write kataba
... ...

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

write kataba
door 'el bab'
blue azraq
house manzil
ball 'al kora'
chair korssy

voila merci encore
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Voilà ce que cela donne (avec quelques modifs : renommage de variables, centrage de la fenêtre sur l'écran au lancement et fonte de caractère plus esthétique dans la fenêtre) :

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





// --- Identificateurs
#define ID_RBTN_LA         1000 // radiobouton "Latin vers Arabe"
#define ID_RBTN_AL         1001 // radiobouton "Arabe vers Latin"
#define ID_TEXTE           1002 // zone de texte
#define ID_BTN_EFFACER     1003 // bouton "Effacer"
#define ID_BTN_TRADUIRE    1004 // bouton "Traduire"
#define ID_BTN_TRANSCODER  1005 // bouton "Transcoder"
// bouton "Quitter" avec le code standard IDCANCEL





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



#define   LONGUEUR_MAXI_TEXTE  100
TCHAR     szEntree[LONGUEUR_MAXI_TEXTE];
TCHAR     szSortie[LONGUEUR_MAXI_TEXTE];





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




 




 



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



int WINAPI WinMain
(
    HINSTANCE hInstance     // E:instance courante
   ,HINSTANCE hInstancePrec // E:instance précédente
   ,LPSTR     pszCommande   // E:ligne de commande(s)
   ,int       iAffichage    // E:mode d'affichage
)                           // S:code retour
{
   // --- Mémo de l'instance globale
   hInstanceGlobale = hInstance;



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





   // --- Créer la fenêtre principale
   HWND hFenetre = CreateWindowEx
   (
       0
      ,TEXT("classeF")
      ,TEXT("Transcodage Arabe/Latin")
      ,WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX
      ,CW_USEDEFAULT,CW_USEDEFAULT // x,y
      ,400,185                     // largeur,hauteur
      ,(HWND)NULL
      ,(HMENU)NULL
      ,hInstanceGlobale
      ,(LPVOID)NULL
   );
   if (hFenetre == NULL) return 0;
   ShowWindow(hFenetre,iAffichage);
   UpdateWindow(hFenetre);





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




 




 



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



LRESULT CALLBACK FenetreProc
(
    HWND   hFenetre // E:handle de la fenêtre
   ,UINT   Msg      // E:message à traiter
   ,WPARAM wParam   // E:paramètre WPARAM
   ,LPARAM lParam   // E:paramètre LPARAM
)                   // S:code retour
{
   switch (Msg)
   {
      // ---------------------------
      // Creer la fenêtre principale
      // ---------------------------



      case WM_CREATE:
      {
         // --- Changer la petite icône dans la barre de titre
         SetClassLong
         (
             hFenetre
            ,GCL_HICON
            ,(long)LoadIcon(hInstanceGlobale,TEXT("ICONE_PROGRAMME"))
         );





         // --- Centrer la fenêtre sur l'écran
         // --- 1) Lire les dimensions de l'écran
         RECT Ecran;
         SystemParametersInfo(SPI_GETWORKAREA,0,&Ecran,0);



         // --- 2) Lire les dimensions de la fenêtre
         WINDOWPLACEMENT Fenetre;
         Fenetre.length = sizeof(WINDOWPLACEMENT);
         GetWindowPlacement(hFenetre,&Fenetre);



         // --- 3) Déplacer la fenêtre au centre de l'écran
         int iLargeur = Fenetre.rcNormalPosition.right  - Fenetre.rcNormalPosition.left;
         int iHauteur = Fenetre.rcNormalPosition.bottom - Fenetre.rcNormalPosition.top;
         int iX       = (Ecran.right  - iLargeur) / 2;
         int iY       = (Ecran.bottom - iHauteur) / 2;
         MoveWindow(hFenetre,iX,iY,iLargeur,iHauteur,(BOOL)FALSE);



        
         // --- Fonte pour les textes de la fenêtre
         HFONT hFonte = CreateFont
         (
            -MulDiv
             (
                 10
                ,GetDeviceCaps(GetDC(hFenetre),LOGPIXELSY)
                ,72
             )                        // hauteur (1er paramètre)
            ,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
         );





         // --- GROUPBOX autour de la sélection du sens de transcodage
         HWND hGroupbox = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Sens du transcodage")
            ,WS_CHILD | WS_VISIBLE | BS_GROUPBOX
            , 10,10 // x,y
            ,375,50 // largeur,hauteur
            ,hFenetre
            ,NULL
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hGroupbox,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte



        
         // --- Radioboutons de sélection du sens de transcodage
         HWND hRB1 = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Latin vers Arabe")
            ,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
            , 25,30 // x,y
            ,130,20 // largeur,hauteur
            ,hFenetre
            ,(HMENU)ID_RBTN_LA
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hRB1,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte
         HWND hRB2 = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Arabe vers Latin")
            ,WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
            ,250,30 // x,y
            ,130,20 // largeur,hauteur
            ,hFenetre
            ,(HMENU)ID_RBTN_AL
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hRB2,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte
         CheckRadioButton // positionner le radiobouton par défaut
         (
             hFenetre
            ,ID_RBTN_LA // ID du premier radiobouton
            ,ID_RBTN_AL // ID du dernier radiobouton
            ,iSensTranscoder == 1 ? ID_RBTN_LA : ID_RBTN_AL // radiobouton à positionner
         );



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



        
         // --- Fonte dans la zone de texte
         // --- (différente de la fonte des autres textes)
         HFONT hFonteTexte = CreateFont
         (
             -MulDiv
             (
                 17
                ,GetDeviceCaps(GetDC(hFenetre),LOGPIXELSY)
                ,72
             )                        // hauteur (1er paramètre)
            ,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 // utiliser la fonte créée
         (
             GetDlgItem(hFenetre,ID_TEXTE)
            ,WM_SETFONT
            ,(WPARAM)hFonteTexte
            ,(LPARAM)true
         );



        
         // --- Bouton pour effacer
         HWND hEffacer = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("C")
            ,WS_CHILD | WS_VISIBLE
            ,355,70 // x,y
            , 30,30 // largeur,hauteur
            ,hFenetre
            ,(HMENU)ID_BTN_EFFACER
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hEffacer,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte



        
         // --- Bouton pour tranduire
         HWND hTraduire = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Traduire")
            ,WS_CHILD | WS_VISIBLE
            , 10,110 // x,y
            ,125, 30 // largeur,hauteur
            ,hFenetre
            ,(HMENU)ID_BTN_TRADUIRE
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hTraduire,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte



        
         // --- Bouton pour transcoder
         HWND hTranscoder = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Transcoder")
            ,WS_CHILD | WS_VISIBLE
            ,140,110 // x,y
            ,120, 30 // largeur,hauteur
            ,hFenetre
            ,(HMENU)ID_BTN_TRANSCODER
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hTranscoder,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte



        
         // --- Bouton pour quitter
         HWND hQuitter = CreateWindowEx
         (
             0
            ,TEXT("BUTTON")
            ,TEXT("Quitter")
            ,WS_CHILD | WS_VISIBLE
            ,265,110 // x,y
            ,120, 30 // largeur,hauteur
            ,hFenetre
            ,(HMENU)IDCANCEL
            ,hInstanceGlobale
            ,NULL
         );
         SendMessage(hQuitter,WM_SETFONT,(WPARAM)hFonte,(LPARAM)true); // fonte
      }
      return 1;





      // -------------------------------------
      // 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_RBTN_LA :
         iSensTranscoder = 1;
         break;



        
         // --- Radiobouton "Arabe vers Latin"
         case ID_RBTN_AL :
         iSensTranscoder = 2;
         break;



        
         // --- Saisie dans la zone
         case ID_TEXTE :
         {
            // --- Valider/invalider certains boutons
            // --- en fonction de l'existance d'un texte à transcoder
            GetDlgItemText(hFenetre,ID_TEXTE,szEntree,LONGUEUR_MAXI_TEXTE);
            BOOL b = (BOOL)(szEntree[0] != 0);
            EnableWindow(GetDlgItem(hFenetre,ID_BTN_EFFACER)   ,b);
            EnableWindow(GetDlgItem(hFenetre,ID_BTN_TRADUIRE)  ,b);
            EnableWindow(GetDlgItem(hFenetre,ID_BTN_TRANSCODER),b);
         }
         break;



        
         // --- Bouton "Effacer"
         case ID_BTN_EFFACER :
         SetDlgItemText(hFenetre,ID_TEXTE,TEXT(""));
         SetFocus(GetDlgItem(hFenetre,ID_TEXTE));
         break;



        
         // --- Bouton "Traduire"
         case ID_BTN_TRADUIRE :
         {
            // --- Lire/Traduire/Montrer
            GetDlgItemText(hFenetre,ID_TEXTE,szEntree,LONGUEUR_MAXI_TEXTE);
            Traduire(hFenetre);
            SetDlgItemText(hFenetre,ID_TEXTE,szSortie);
         }
         break;



        
         // --- Bouton "Transcoder"
         case ID_BTN_TRANSCODER :
         {
            // --- Lire/Transcoder/Montrer
            GetDlgItemText(hFenetre,ID_TEXTE,szEntree,LONGUEUR_MAXI_TEXTE);
            if (iSensTranscoder == 1) LatinVersArabe(); else ArabeVersLatin();
            SetDlgItemText(hFenetre,ID_TEXTE,szSortie);



            // --- Alterner automatiquement le sens du transcodage et le positionner            if (iSensTranscoder 1) iSensTranscoder 2; else iSensTranscoder = 1;
            CheckRadioButton
            (
                hFenetre
               ,ID_RBTN_LA // ID du premier radiobouton
               ,ID_RBTN_AL // ID du dernier radiobouton
               ,iSensTranscoder == 1 ? ID_RBTN_LA : ID_RBTN_AL // radiobouton à positionner
            );
         }
         break;





         // --- Bouton "Quitter"
         case IDCANCEL :
         SendMessage(hFenetre,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(hFenetre,Msg,wParam,lParam);
}




 




 



// ==========================================================
// Traduire la saisie
// ----------------------------------------------------------
// szEntree = Texte saisi en caractères latins
// szSortie = Texte traduit en caractères latins
// ----------------------------------------------------------
// Le fichier "Dictionnaire.txt" contient les couples de mots
// <mot non arabe>,<mot arabe en caractères latins>
// Ex: write,kataba
// ==========================================================



void Traduire
(
   HWND hFenetre // E:handle de la fenêtre
)
{
   // --- Copier la saisie dans le texte en sortie
   // --- pour les cas d'erreur
   wcscpy(szSortie,szEntree);



     
   // --- Ouvrir le fichier dictionnaire
   FILE* pf = fopen("Dictionnaire.txt","rt");
   if (pf == NULL)
   {
      MessageBox
      (
          hFenetre
         ,TEXT("Erreur à l'ouverture du fichier dictionnaire\n(fichier dictionnaire non trouvé ?)")
         ,TEXT("Erreur")
         ,MB_OK | MB_ICONERROR
      );
      return;
   }





   // --- Parcourir le fichier dictionnaire
   // --- pour y chercher la saisie
   TCHAR szLigne[256];
   bool  bTrouve = false;
   int   iCompteur = 0;
   while (fgetws(szLigne,256,pf) != NULL)
   {
      // --- Pointer la virgule séparatrice
      ++iCompteur;
      TCHAR* pSep = wcschr(szLigne,L',');
      if (pSep == NULL)
      {
         // --- Ligne incorrecte (pas de virgule trouvée)
         TCHAR szMessage[100];
         swprintf(szMessage,TEXT("La ligne %d du dictionnaire est incorrecte\n(pas de virgule séparatrice)"),iCompteur);
         MessageBox(hFenetre,szMessage,TEXT("Erreur"),MB_OK | MB_ICONERROR);
         continue;
      }



      // --- Chercher si la saisie est égale au premier mot de la ligne
      if (wcsnicmp(szEntree,szLigne,(size_t)(pSep - szLigne)) == 0)
      {
         // --- La saisie est égale au premier mot de la ligne
         // --- Copier le mot arabe et quitter la lecture du fichier
         wcscpy(szSortie,pSep + 1);
         bTrouve = true;
         break;
      }
   }
   if (! bTrouve)
   {
      MessageBox
      (
          hFenetre
         ,TEXT("Le mot saisi n'existe pas dans le dictionnaire")
         ,TEXT("Traduction")
         ,MB_OK | MB_ICONWARNING
      );
   }





   // --- Fermer le fichier dictionnaire
   fclose(pf);
}




 




 



// ===============================================
// Transcoder du latin vers l'arabe
// -----------------------------------------------
// szEntree = Texte saisi en caractères latins
// szSortie = Texte transcodé en caractères arabes
// ===============================================



void LatinVersArabe(void)
{
   int iSortie = 0;
   for (int iEntree=0 ; szEntree[iEntree] ; ++iEntree)
   {
      switch (szEntree[iEntree])
      {
         case ' ' : szSortie[iSortie++] =  160; break;
         case 'A' : szSortie[iSortie++] = 1575; break;
         case 'B' : szSortie[iSortie++] = 1576; break;



         case 'C' :
         {
            if (szEntree[iEntree + 1] == 'H')
            {
               // --- CH
               szSortie[iSortie++] = 1588; // code pour CH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- C
               szSortie[iSortie++] = 1612;
            }
         }
         break;



         case 'D' : szSortie[iSortie++] = 1583; break;
         case 'E' : szSortie[iSortie++] = 1600; break;
         case 'F' : szSortie[iSortie++] = 1601; break;



         case 'G' :
         {
            if (szEntree[iEntree + 1] == 'H')
            {
               // --- GH
               szSortie[iSortie++] = 1594; // code pour GH
               ++iEntree; // sauter le 'H' traité
            }
            else
            {
               // --- G
               szSortie[iSortie++] = 1580;
            }
         }
         break;



         case 'H' : szSortie[iSortie++] = 1581; break;
         case 'I' : szSortie[iSortie++] = 1616; break;
         case 'J' : szSortie[iSortie++] = 1580; break;
         case 'K' : szSortie[iSortie++] = 1603; break;
         case 'L' : szSortie[iSortie++] = 1604; break;
         case 'M' : szSortie[iSortie++] = 1605; break;
         case 'N' : szSortie[iSortie++] = 1606; break;
         case 'O' : szSortie[iSortie++] = 1615; break;
         case 'Q' : szSortie[iSortie++] = 1602; break;
         case 'R' : szSortie[iSortie++] = 1585; break;
         case 'S' : szSortie[iSortie++] = 1589; break;
         case 'T' : szSortie[iSortie++] = 1591; break;
         case 'U' : szSortie[iSortie++] = 1575; break;
         case 'V' : szSortie[iSortie++] = 1584; break;
         case 'W' : szSortie[iSortie++] = 1608; break;
         case 'Y' : szSortie[iSortie++] = 1610; break;
         case 'Z' : szSortie[iSortie++] = 1586; break;



         // --- Les caractères non reconnus sont conservés
         default  : szSortie[iSortie++] = szEntree[iEntree]; break;
      }
   }
   szSortie[iSortie] = 0; // terminateur de la chaîne
}




 




 



// ===============================================
// Transcoder de l'arabe vers le latin
// -----------------------------------------------
// szEntree = Texte saisi en caractères arabes
// szSortie = Texte transcodé en caractères latins
// ===============================================



void ArabeVersLatin(void)
{
   int iSortie = 0;
   for (int iEntree=0 ; szEntree[iEntree] ; ++iEntree)
   {
      switch (szEntree[iEntree])
      {
         case  160 : szSortie[iSortie++] = ' '; break;
         case 1575 : szSortie[iSortie++] = 'A'; break;
         case 1576 : szSortie[iSortie++] = 'B'; break;
         case 1612 : szSortie[iSortie++] = 'C'; break;



         case 1588 :
         {
            szSortie[iSortie++] = 'C';
            szSortie[iSortie++] = 'H';
         }
         break;



         case 1583 : szSortie[iSortie++] = 'D'; break;
         case 1600 : szSortie[iSortie++] = 'E'; break;
         case 1601 : szSortie[iSortie++] = 'F'; break;



         case 1594 :
         {
            szSortie[iSortie++] = 'G';
            szSortie[iSortie++] = 'H';
         }
         break;



         case 1581 : szSortie[iSortie++] = 'H'; break;
         case 1616 : szSortie[iSortie++] = 'I'; break;
         case 1580 : szSortie[iSortie++] = 'J'; break;
         case 1603 : szSortie[iSortie++] = 'K'; break;
         case 1604 : szSortie[iSortie++] = 'L'; break;
         case 1605 : szSortie[iSortie++] = 'M'; break;
         case 1606 : szSortie[iSortie++] = 'N'; break;
         case 1615 : szSortie[iSortie++] = 'O'; break;
         case 1602 : szSortie[iSortie++] = 'Q'; break;
         case 1585 : szSortie[iSortie++] = 'R'; break;
         case 1589 : szSortie[iSortie++] = 'S'; break;
         case 1591 : szSortie[iSortie++] = 'T'; break;
         case 1584 : szSortie[iSortie++] = 'V'; break;
         case 1608 : szSortie[iSortie++] = 'W'; break;
         case 1610 : szSortie[iSortie++] = 'Y'; break;
         case 1586 : szSortie[iSortie++] = 'Z'; break;



         // --- Les caractères non reconnus sont conservés
         default  : szSortie[iSortie++] = szEntree[iEntree]; break;
      }
   }
   szSortie[iSortie] = 0; // terminateur de la chaîne
}


Le fichier contenant les traductions doit s'appeler "Dictionnaire.txt" (si vous préférez un autre nom, modifiez la fonction Traduire()) et il doit se trouver dans le répertoire courant lors de l'exécution du programme (sinon il y a un message d'erreur). Il doit avoir la structure suivante :

write,kataba
door,el bab
blue,azraq
house,manzil
ball,al kora
chair,korssy

Les mots sont séparés par une virgule et il n'y a pas d'espaces inutiles.

Si un mot à traduire n'existe pas dans le fichier, il y a un message d'erreur.
Si une virgule n'est pas trouvée sur une ligne, il y a un message d'erreur.



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 il y a une erreur au niveau de cette ligne :

      swprintf(szMessage,TEXT("La ligne %d du dictionnaire est incorrecte\n(pas de virgule séparatrice)"),iCompteur);
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
1
Je n'ai pas d'erreur ici (ni warning) ! elle dit quoi cette erreur ?

Sinon vous pouvez mettre cette ligne en commentaire le temps de tester. Elle concerne juste le formatage du message d'erreur dans le cas où une virgule n'est pas trouvée sur une ligne du fichier dictionnaire.

Jean-François