Forum de la C-P-F

Version complète: [Win API] Un carnet d'adresses
Vous regardez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Nous somme un prochain jour... Smile Voici déjà la fonction qui dessine la fenêtre du deuxième onglet :dessinerOnglets2



Code C :

void dessineronglets2(hwnd hwndonglet2, config *p_data)
{
    static hdc hdc=null;
    static paintstruct ps;

    hdc = beginpaint(hwndonglet2,&ps);
    dessinerrectanglesimple (hdc,190, 13 , 350,74,p_data->couleur[2],p_data->couleur[2]);
    dessinerrectanglesimple (hdc,190, 74, 350,132,p_data->couleur[3],p_data->couleur[3]);
    dessinerrectanglesimple (hdc,190, 132 , 350,193,p_data->couleur[2],p_data->couleur[2]);
    dessinerrectanglesimple (hdc,190, 193, 350,245,p_data->couleur[3],p_data->couleur[3]);
    setbkmode(hdc,transparent);
    ecriretexte (hdc,200,50, "texte 1" ,"arial", 12,7,1, null,500,false, false,
                                  false,false,p_data->couleur[4]);
    ecriretexte (hdc,200,105, "texte 2" ,"arial", 12,7,1, null,500,false, false,
                                  false,false,p_data->couleur[5]);
    endpaint(hwndonglet2, &ps);
}
 

et voici une fonction que j'ai crã©ã©e et que j'utilise dans tous mes codes pour ecrire un texte :ecriretexte

Code C :

void ecriretexte (hdc hdcecrire,int x, int y, char phrase[] ,char police[], long hauteur, long largeur,
                                  long espace, long orientation,long epaisseur,byte italique, byte souligne,
                                  byte barre,byte famillepolice,colorref couleurtexte)
{
    hfont newfont, oldfont;
    logfont lf;
                lf.lfheight = hauteur;
                lf.lfwidth = largeur;
                lf.lfescapement= espace;
                lf.lforientation=orientation;
                lf.lfweight=epaisseur;
                lf.lfitalic =italique;
                lf.lfunderline=souligne;
                lf.lfstrikeout =barre;
                lf.lfpitchandfamily=variable_pitch;
                lstrcpy(lf.lffacename,(lpctstr)police);

         newfont = createfontindirect(&lf);
         oldfont = (hfont)selectobject(hdcecrire,newfont);

         settextcolor(hdcecrire, couleurtexte);
         textout(hdcecrire, x, y,(lpctstr) phrase, lstrlen((lpctstr)phrase));

         selectobject(hdcecrire,oldfont);
         deleteobject(newfont);

}
 
Bonjour,
comme pour la fonction de réponse aux messages envoyés à la procédure de la fenêtre de l'onglet 1, je ne vais pas montrer l'organigramme. En effet, j'avais prévu d' utiliser une ressource pour cette partie du programme et l'organigramme ne correspond plus.

Voici le code de cette fonction :

Code C :

void messagesonglet2 (hwnd hwndonglet2,wparam wparam,lparam lparam, config *p_data)
{
    char texte[40];
    getwindowtext(lparam,texte,40);
   if(hiword(wparam)==bn_clicked)
    {
        if(!strncmp((lptstr)texte,"couleur de page 1",strlen("couleur de page 1")))
         {
            changercouleur (hwndonglet2,&(p_data->couleur[2]));
         }
       if(!strncmp((lptstr)texte,"couleur de page 2",strlen("couleur de page 2")))
         {
            changercouleur (hwndonglet2,&(p_data->couleur[3]));
         }
        if(!strncmp((lptstr)texte,"couleur de texte 1",strlen("couleur de texte 1")))
         {
            changercouleur (hwndonglet2,&(p_data->couleur[4]));
         }
        if(!strncmp((lptstr)texte,"couleur de texte 2",strlen("couleur de texte 2")))
         {
            changercouleur (hwndonglet2,&(p_data->couleur[5]));
         }

    }

}
 


Pour chaque option : changer la couleur du papier 1, du papier 2, du texte 1 du texte 2, on utilise la fonction changerCouleur vue ici même un peu plus haut.
J'en ai terminé avec le traitement de l'option configuration du menu.

Bonne journée Smile
Bonjour,
ce matin je n'ai pas trop le temps mais si je peux je mettrai la suite du programme dans la journée.
à++ Smile
Dure journée hier... donc je n'ai pas pu passer. Je vais me rattraper. Voyons ce que je pourrais mettre en ligne aujourd'hui ?

Nous en somme toujours depuis pas mal de temps à la fonction de réponse aux messages envoyés par le menu à la fenêtre principale.
Nous avons déjà vu le traitement des options suivantes:
- IDM_NOUVEAU : ouvrir un nouveau carnet d'adresses
- IDM_OUVRIR : ouvrir un carnet d'adresses existant
- IDM_QUITTER : quitter l'application
- IDM_NOUVELLEFICHE : ouvrir une nouvelle fiche
- IDM_RETOUR : retour à la couverture du carnet d'adresse
- IDM_AIDE : ouvrir la fenêtre d'aide.
- IDM_OPTIONS : configurer l'affichage de l'application.

Je vais présenter rapidement la réponse à l'option IDM_APROPOS et on aura fini de faire le tour du menu de la fenêtre principale.
ET on en aura terminé avec la procédure de la fenêtre princiaple.
Je passerai ensuite à la procédure de la couverture du carnet d'adresses.
Lorsqu'on clique sur l'option à propos du menu, une boite de dialogue s'ouvre tout simplement. Cette fenêtre est définie dans la ressource ainsi:

Code C :

dialog2 dialog
   10, 10, 160, 120
          style ws_popup | ws_visible | ws_caption | ws_sysmenu
                                        caption "a propos du carnet d'adresses "
begin
    ltext "carnet d'adresses 0.0.1", -1, 10, 10, 150, 10
    ltext "© acryline", -1, 10, 20, 150, 10
    ltext "ce programme est fourni sans aucune garantie comme prã©vu par la loi.", -1, 10, 35, 150, 50
    ltext "vous pouvez le redistribuer selon les termes de la licence publique gã©nã©rale gnu.", -1, 10, 60, 150, 50
    defpushbutton "ok", id_ok, 56, 95, 42, 12
end
 


voici sa procã©dure :


Code C :

bool apientry dialog2proc(hwnd hdlg,uint umsg,wparam wparam,lparam lparam)
{

    switch (umsg)
    {
      case wm_initdialog:
      return true;

      case wm_command:
      if (loword(wparam) == id_ok) // bn_click  pas traitã©.
        {
            enddialog(hdlg,0);
        }
      return true;

     case wm_close:
      enddialog(hdlg,0);
     return true;

        default:
        return false;
    }
}

 


passons maintenant ã  la procã©dure de la couverture du carnet d'adresses (fenãªtre fille de la fenãªtre principale de l'application):



Code C :

lresult callback  proccouv(hwnd hwndcouv, uint umsg, wparam wparam, lparam lparam)
{
static onglets onglets={0};
  switch (umsg)
    {
        case wm_create:
            creerongletsliste(hwndcouv,&onglets,28);
            sendmessage(getwindowlong(hwndcouv,gwl_hwndparent),wm_handle,hwndcouv,0);
        return 0;

        case wm_command:
        messagesonglets(hwndcouv,&onglets,wparam,lparam);

        return 0;

        case wm_paint:
        dessinercouverture (hwndcouv);
        return 0;

        case wm_destroy:
         destroywindow(hwndcouv);
        return 0;

        default:
        return defwindowproc(hwndcouv, umsg, wparam, lparam);

    }

}
 
Bonjour

Sur la couverture, à droite, il y a 27 onglets pour accéder aux classement alphabétique des fches. Ces onglets ici sont des boutons plats.
Ils sont créés à la reception du message WM_CREATE dans la procédure de la couverture. Dans ce but,J'ai créé la fonction creerOngletsListe que je vais présenter ci-dessous. Après cette fontion j'envoie le handle de la couverture à la procédure principale pour que l'application l'utilise dans le cadre d'une reconfiguration.

Fonction creerOngletsListe:


Code C :

void creerongletsliste(hwnd hwnd,onglets *p_onglets,long niveau)
{
    long i=0,largeur=0,hauteur=0;
    lettre alpha={0};
    //supprimer les onglets
    for (i=0;i<27;i++) destroywindow(p_onglets->honglet[i]);

    dimfenetre (&largeur,&hauteur);
    tableaulettres(&alpha);

    for(i=0;i<27;i++)
    {
        if (i<=niveau && i!=28)
        {
         p_onglets->honglet[i] =createwindow("button",(lpctstr)&alpha.lettre[i],
                                                ws_visible | ws_child | ws_border,
                        largeur-30,(i*17),30, 17,hwnd,null,hinstance, null);

        }
        if (i> niveau || i==28)
        {
        p_onglets->honglet[i] =createwindow("button",(lpctstr)&alpha.lettre[i],
                                                ws_visible | ws_child ,
                        largeur-30,(i*17),30, 17,hwnd,null,hinstance, null);

        }
    }
}
 
Bonjour, je ne suis pas venue poster aujourd'hui parce que j'ai nettoyé mon pc. Maintenant il est tout propre Smile
Il faut que j'installe deux logiciels et je pourrai continuer la présentation de mon carnet d'adresses . A bientôt
Aujourd'hui sans doute pour une toute petite fonction qui va remplir le tableau des lettres des onglets.

Voilà, les logiciels nécessaires sont installés et configurés, voici la fonction en question :


Code C :

void tableaulettres(lettre *p_alpha)
{
 long i=0;
 for (i=0;i<27;i++)
 {
    p_alpha->lettre[i][1]='';
 }
    p_alpha->lettre[0][0]=46;
 for (i=1;i<27;i++)
 {
    p_alpha->lettre[i][0]=64+i;
 }
}

 


Pour passer ce tableau facilement à des fonction j'ai créé la structure LETTRE dans le header.
Bonjour, aujourd'hui je dessine la couverture mais sans organigramme parce qu'il était bcp trop compliqué et ne correspond plus à ma fonction. Ensuite il restera à présenter la fonction de réponse aux messages envoyés à la couverture.

Code C :

void dessinercouverture (hwnd hwndcouv)
{
static hdc hdc=null;
static paintstruct ps;
long largeur=0,hauteur=0;
static colorref couleurreliure = 0, couleurcouv=0, couleurpapier1=0, couleurtexte1=0;
dimfenetre(&largeur,&hauteur);
chargerconfig (&couleurreliure, sizeof(char)*10,sizeof(colorref));
chargerconfig (&couleurcouv, sizeof(char)*10 +sizeof(colorref),sizeof(colorref));
chargerconfig (&couleurpapier1, sizeof(char)*10 +sizeof(colorref)*2,sizeof(colorref));
chargerconfig (&couleurtexte1, sizeof(char)*10 +sizeof(colorref)*4,sizeof(colorref));
hdc = beginpaint(hwndcouv,&ps);
dessinerrectanglesimple (hdc,0, 0, largeur/15,hauteur,couleurreliure,couleurreliure);
dessinerrectanglesimple (hdc,largeur/15, 0, largeur-30,hauteur,couleurcouv,couleurcouv);
dessinerrectanglesimple (hdc,largeur-30, 17*27, largeur,hauteur,couleurpapier1,couleurpapier1);
dessinerrectanglesimple (hdc,largeur/4, hauteur/8, largeur-(largeur/4),
                        (hauteur/2)-(hauteur/8),rgb(255,255,255),rgb(255,255,255));
ecriretexte (hdc,largeur/4 +((largeur/2)-165)/2, hauteur/4-10, "carnet d'adresses"
                ,"comic sans ms", 18, 7,2,0,800,false,
                   false, false,false,couleurtexte1);
endpaint(hwndcouv, &ps);
}
 


donc voici la fonction messagesonglets pour rã©pondre aux messages envoyã©s ã  la couverture :



Code C :

void messagesonglets(hwnd hwndcouv,onglets *p_onglets,wparam wparam,lparam lparam)
{
    hwnd hwnd=null;
    long i=0;
    hwnd=(hwnd)getwindowlong( hwndcouv,gwl_hwndparent);

    if (hiword(wparam)==bn_clicked)
    {
       for (i=0;i<27;i++)
        {
            if (lparam == (lparam)p_onglets->honglet[i])
            {
                 static bool t[3]={false,true,false};
                  modifiertemoins(hwnd,t);
                  menuajour (hwnd,mf_enabled,mf_enabled);
                  sendmessage(hwnd,wm_create,i,0);
                 return true;
            }
        }
    }
    else return false;
}

 


Avec SendMessage, on envoie le numéro de l'onglet choisi, i à la procédure principale qui va créer la fenêtre liste en focntion de ce
numéro.
Bonjour,
je suis en pleine découverte de LINUX en ce moment et je n'ai pas encore tous les outils pour vous présenter
la suite de mon logiciel. Je passerai soit ce soir soit demain. A bientôt ! Smile
coucou,
bon je n'ai quasiment rien à dire alors comme je vois un petit truc je réponds, histoire que tu ne te désespères pas de faire un long monologue :-.

Bref juste pour te faire remarquer un petit pb dans ta fonction messagesOnglets
Code C :
void messagesonglets(hwnd hwndcouv,onglets *p_onglets,wparam wparam,lparam lparam)
{
    ...
    if (hiword(wparam)==bn_clicked){
       for (i=0;i<27;i++){
            if (lparam == (lparam)p_onglets->honglet[i]){
                 ...
                 return true;
            }
        }
    }
    else return false;
}

J'ai fait exprès de ne laisser que ce qui n'est pas très "beau". Tu vois?
En fait ta fonction est censé ne rien renvoyer et tu renvois en réalité un booléen.
Ah exact ! Smile Merci !

Aujourd'hui je vais vous présenter la procédure de la nouvelle fiche : ProcFiche



Et le code :
Code C :

lresult callback  procfiche(hwnd hwndfiche, uint umsg, wparam wparam, lparam lparam)
{
   static bouton bouton={0};

  switch (umsg)
    {
        case wm_create:
        creerboutonsfiche(hwndfiche,&bouton);
        creereditfiche(hwndfiche,&bouton);
        creercombofiche(hwndfiche,&bouton);
        updatewindow(hwndfiche);
        return 0;

        case wm_command:
        messagesboutonsfiches(hwndfiche,&bouton, wparam,lparam);
        return 0;

        case wm_paint:
        dessinerfiche(hwndfiche, "nouvelle fiche");
        return 0;

        case wm_destroy:
        destroywindow(hwndfiche);
        return 0;

        default:
        return defwindowproc(hwndfiche, umsg, wparam, lparam);

    }

}

 


On dessine une fiche quand on veut créer une nouvelle entrée dans le carnet d'adresse ou quand on veut consulter
les coordonnées de quelqu'un. Dans une fiche il y aura des boutons des contrôles d'édition pour les texte et des combo-box pour
les choix multiples (anniversaire, groupe).
La fenêtre sera dessinée ou redessiné à la reception du message WM_PANT.
Comme pour les autres fenêtre j'ai créé une fonction de réponse aux messages.
Pages: 1 2 3 4 5 6 7
URLs de référence