IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Créer une zone client spéciale (genre tableur)


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut Créer une zone client spéciale (genre tableur)
    Bonjour à tous,

    Depuis pas mal de temps je me suis rendu compte que les logiciels utilisaient des "controles" non-standards qui ne se trouvaient pas dans les headers de l'ApiWin32!

    Les tableurs par exemple, au départ je pensais que chaque case était un EDIT et qu'ils étaient stockés dans un tableau d'Edit du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HWND edits[100][100];
    pour un tableau à double entrée de 10000 cases.
    Mais de plus en plus je me rend bien compte que cela est impossible. Et puis il n'y a pas que cela!

    Par exemple, l'Edit de Word qui affiche une page en fond, j'imagine que ce n'est pas un simple objet EDIT. D'abord un EDIT ne peut afficher que du texte normal (j'ai réussi à changer la police de la totalité de son contenu mais c'est tout!)

    Voila je voudrais savoir comment s'y prendre pour créer de tels objets.

    Je sais que BUTTON ou EDIT ou encore STATIC ce sont des noms de classes. Mais je ne vois pas en quois je peux faire de tels objets en modifiant le contenu de la WNDCLASSEX!

    Merci d'avance de m'éclairer sur ce point obscur!

    Spartan03

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Note que tu as le rich edit qui est plus évolué que le edit.
    EDIT, BUTTON, STATIC ne sont que des classes de fenêtres. Les tableaurs, etc... créent leur propre classe de fenêtre qui répond à leur besoin.
    Pour un tableur, la classe va gérer WM_PAINT pour dessiner les cases. Elle va analyser les clics de souris pour déterminer quelle case a été cliquée, elle va ensuite créer un EDIT à l'emplacement de la case afin de permettre d'éditer la case. Une fois la case éditée, elle détruit l'EDIT et redessine le contenu de la case modifié.
    Tout ce qui est à l'écran, ce n'est que du dessin. Word dessine les caractères à l'écran à la place/police/couleur/... qu'il faut...*
    Un BUTTON dessine un petit carré qui donne un look 3D avec un texte au centre. Quand il est cliqué, il redessine le carré avec un look enfoncé...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Ok, ca je m'en doutait un petit peu.

    En fait, je me demandais comment créer une classe de fenetre qui fasse tout cela.
    Ce qui m'intéresserai c'est de créer une classe de fenetre qui dessine un tableau de deux colonnes et un nombre indéfini de lignes (pas plus de 10000) seulement je ne vois vraiment pas comment faire. Je suis complètement paumé sur le sujet.
    Est-ce qu'il me suffit de modifier le contenu d'une WNDCLASSEX (ou pas EX d'ailleurs) ou est ce que je dois créer un nouveau type genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class MA_CLASSE_DE_FENETRE{
    //mes membres et  mes méthodes
    };
    Est-ce qu'un simple EDIT (je préfère commencer par là) est une WNDCLASSEX avec des éléments modifiés et une foncton d'écoute des messages propre (en clair est il écrit quelque part WNDCLASSEX EDIT...)
    ou bien y'a t-il un type EDIT?

    Merci d'avance!

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu enregistres une classe avec RegisterClass. Ce qui est important dans une classe, c'est la procédure de fenêtre. C'est elle qui fait tout.
    Quelque part, dans le code de Windows, tu as une procédure qui fait tout ce qu'il faut pout que la classe EDIT se comporte comme elle se comporte. Le nom "EDIT" est spécifié dans WNDCLASS.lpszClassName.
    Pour dessiner des lignes, ben étudies les fonctions de GDI pour le dessin. Et puis tu boucles comme il faut pour dessiner des lignes et des colonnes, à la fin ça fait une grille.
    J'avais exploré le sujet y'a un certain temps, je vais essayer de penser à le retrouver mon code une fois chez moi

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Ok, alors si je comprends bien! Je dois faire une classe de fenetre normale avec une procedure (par exemple editProc pour un Edit)!

    A la récéption du message WM_CREATE je crée un rectangle qui occupe tout l'objet, puis si je clique dessus je crée un caret, lui donne des attributs par defaut (SetCaretBlinkTime...) et quand l'EDIT à le focus à la récéption des messages en Virtual Key Code, je crée une variable où stocker le texte et, grace à la fonction textOut (ou plutot drawText dans ce cas, vu qu'on a déja un rectangle, au cas ou en ait plusieurs lignes)j'affcihe le contenu de la variable avec les coordonnees de l'EDIT et en fonction de l'activation ou non de ES_MULTILINE je retourne à la ligne ou non!

    Mais comment faire pour que cette classe soit appelée avec CreateWindowEx?

    Je parle surtout au niveau de l'argument 4 de la fonction CreateWindowEx :

    Bon honnetement je n'ai aucune envie de faire mes propres option pour cet objet mais en revanche, comment va-t-il gérér la prsence ou non de barre de défilement, c'est le seul point qui reste assez obscur à mes yeux.
    Sinon, je me suis replongé dans la doc de la Graphic Device Interface et j'en ai déduis que pour mon application il me suffisait de savoir dessiner des rectangles et des lignes donc... Pas de problème de ce coté là!

    En tout cas beaucoup pour ton aide!

    Si tu veux m'envoyer des sources sache que je viens de changer mon adresse e-mail (normalement si tu clique sur le lien e-mail de ce forum, ca doit marcher!)

    Encore merci

    Spartan03

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu as à peu près compris je pense. Il faut un code d'initialisation qui va se charger d'appeler RegisterClass avec ta classe que tu as créé. Après cela, tu pourras faire un CreateWindow sur cette classe.
    C'est ce qui se passe avec les contrôles étendus. Pour utiliser le treeview / listview / etc..., il faut avant appeler InitCommonControls. Cette fonction va se charger de créer les classes en question. Si elle n'est pas appelée, les classes treeview / etc... seront inconnues.
    Pour la scrollbar, ben tu as une classe scrollbar qui te permet de faire ça.
    J'ai oublié de mettre en ligne mon ancien code. Je vais tacher d'y penser ce soir. Je ne sais pas trop jusqu'où j'étais allé, mais c'était un test perso hein, rien de bien fini / bien testé. J'avais simplement "étudié" le dessin il me semble, je ne gérais pas le texte dans les cases.
    Pour la saisie du texte, tu peux simuler le carret comme tu dis, ou bien utiliser un EDIT. J'avais utilisé un EDIT, c'est plus simple, et puis ça te gère tout seul le clic droit / copier-coller etc...
    Je me le note sur un papier promis

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Bon j'ai retrouvé mon truc. C'est pas du tout commenté, mais j'avais quand même pas mal avancé niveau affichage. Du coup je me suis dit que je pourrais essayer de le compléter un peu pour le rendre presque utilisable. Et puis en le restructurant un peu / en le commentant, ça pourrait faire un petit exemple sympa sur comment développer son propre contrôle.
    Donc je vais le retoucher un peu avant de le balancer

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Ok, merci!

    Si tu pouvais me donner l'url de la page ou te le publiera ça serait sympa!
    Je vais attaquer un petit test pour créer mon propre EDIT (dans un premier temps, ça sera déja pas mal!) puis j'essaierai de le faire avec un tableau (j'ai déjà quelques petites idée sur le fonctionnement de la procédure. Malheureusement ca risque de ne pas être portables vers d'autres applications).

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Oui biensûr. J'ai pas trop bossé dessus durant ces "mini vacances". J'espère terminer pour cette fin de semaine.

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2007, 11h07
  2. Créer une zone avec Scroll dans une page html
    Par youcef81 dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 04/12/2006, 10h53
  3. Créer une zone visible qu'après un clic sur une zone
    Par spec10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/11/2006, 04h00
  4. Créer une zone 3D
    Par Janitrix dans le forum 3D
    Réponses: 1
    Dernier message: 13/12/2005, 12h10
  5. Créer une zone de liste modifiable
    Par ALX79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/10/2005, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo