begin process at 2012 05 27 15:11:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > CRÉATION DE CONTROLES AVEC CLASSE ET LIBRAIRIE PERSO SANS MFC

CRÉATION DE CONTROLES AVEC CLASSE ET LIBRAIRIE PERSO SANS MFC


 Information sur la source

Note :
Aucune note
Catégorie :API Niveau :Débutant Date de création :02/12/2004 Date de mise à jour :02/12/2004 18:18:40 Vu / téléchargé :4 063 / 337

Auteur : LaPatoshe

Ecrire un message privé
Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

 Description

Ce petit programme montre l'utilisation d'une librairie pour créer une instance de classe (des objets fenêtre),
qui s'afficheront à l'écran. Ces objets issus de la classe Cfeuille (déclarée dans la librairie 'LibClassFeuille.lib) contiendront
en plus des fonctions permettant la création des fenêtre et leur gestion, toutes les fonctions d'évènement qui leur sont propres.
La fonction API: LRESULT CALLBACK WinProc(HWND hWnd, UINT uMsg...) étant apparement interdite dans une classe, elle sera une
fonction de reception générale des messages, qui selon le HWND transmis répercutera ces messages vers une autre fonction
WinProc faisant partie intégrante des objets de fenêtre.


 Conclusion

Le programme principal 'CF1.cpp' compilé en 'ClasseFenetre.exe' dans le répertoire Debug & retail , va faire référence à la librairie LibClassFeuille.lib.
L'entête hFAC sera également appelé.
Le programme principal va créer deux fenêtres (2 instances de classe de Cfeuille) qui seront FenA et FenB
Elle va les faire apparaitre à la position 0,0 et avec 0 de longueur et 0 de hauteur via les fonctions FenA.Creer(hInstance, nSgoxCmd, pWa);
pWa va être un pointeur de type WNDPROC pointant sur la fonction de gestion générale des messages pour qu'ainsi, chaque objet feuille sache
quelle est la fonction générale de traitement des messages et l'atribue à lpfnWndProc, lpfnWndProc qui est un des élément de WNDCLASS.
On fera donc pointer pWa sur WinProcGeneral en disant pWa = WinProcGeneral;
Puis, dans WinProcGeneral, chaque message selon le hWnd reçu va envoyer toutes les informations (HWND, UINT, WPARAM et LPARAM à la fonction Winproc de l'objet
feuille intéressé.
Dans le programme présent, seul les messages de FenA sont traités pour montrer la différence. Ainsi, fermer la fenetreA terminera le programme alors que cela
ne fermera que la fenêtre si on ferme la fenetre B. cliquer dans la zone hDC de la fenetre A va la redimensionner en 100 par 100. La m^me chose dans la fenêtre B ne donne rien.
Dans et exemple, seul le click gauche de souris et la fermeture de fenêtre sont traitées.

Fichiers du programme:
Dans le repertoire ClasseFenetre, vous trouvrez la librairie LibClassFeuille, l'entête hFAC.h et le fchier programme CF1.cpp. le répertoire DEBUG contient le programme compilé en EXE
Dans le répertoire LibClassFeuille se trouve le fichier hFAC.h et cFAC.cpp qui sont les sources de la librairie

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

02 décembre 2004 18:18:41 :
J'ai rajouté deux répertoires Retail dans lesquels on trouve le fichier Lib compilé en Retail et le programme compilé dans le même mode

 Sources du même auteur

C/C++ SOUS WINDOWS TUTORIAL 3 : CREATION ET AFFICHAGE DE CON...
C/C++ SOUS WINDOWS SANS MFC - TUTORIAL 2 : ECRITURE DANS UNE...
Source avec Zip ENREGISTREMENT ET RESTITUTION DE TEXTE EN EDIT MULTILINE
Source avec Zip C/C++ SOUS WINDOWS SANS MFC TUTORIAL 1

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

Commentaires et avis

Commentaire de BruNews le 02/12/2004 15:23:17 administrateur CS

Salut,

quand on met le resultat de la compilation, faut toujours que soit la version RELEASE et non debug. Peut ainsi etre essaye par tous et est nettement moins volumineux.
Essaie de faire un upgrade de ta source, juste changer le zip avec version release dedans, merci d'avance.

Commentaire de _Jonathan le 02/12/2004 18:40:37

c'est pas possible d'intégrer la fonction WindProc dans la classe???
juste pour renseignement...

Commentaire de LaPatoshe le 02/12/2004 18:43:36

J'ai essayé de plusieurs façons sans succès. J'ai vu un forum sur un autre site dans lequel d'autres codeurs avaient des difficultés également et se servaient d'un système de pointeur de fonction pour parvenir à leurs fins.
Pour ma part, un message d'invalid Cast long et d'autres termes plus ou moins parlant apparaissaient lors de la compilation empêchant en même temps celle ci

Commentaire de BruNews le 02/12/2004 19:12:52 administrateur CS

Une fonction de callback telle WindProc doit etre declaree static dans la classe car son adresse doit etre connue a la compilation.

Commentaire de LaPatoshe le 02/12/2004 19:21:22

C'est effectivement comme cela que la chose était expliqué sur le forum dont je parlais. Ainsi, avoir une fonction 'static' dans une lib consacrée à une définition de classe je trouvais cela un peu déroutant, ce pourquoi vu le faible volume de code placé dedans, je l'ai placé dans le programme principal.

Commentaire de basted le 03/12/2004 10:23:26

Si tu souhaite intergrer ta callback dans une methode de t'on instance de classe fenetre, tu peut utiliser la template sigslot (http://sigslot.sourceforge.net/)

Je te passe l'archi template de l'espace de cette class mais voici un example typique de son utilisation:

#include "sigslot.h"

Class Window : public sigslot::has_slots<>
{
public:
    signal4<HWND, UINT, WPARAM , LPARAM> callback;

    // ... la suite de la classe de gestion de fenetre
}

Class Application : public sigslot::has_slots<>
{
    Window win;

    Application()
    {
        win.callback.connect(this,OnCallBack);
    }

    int OnCallBack(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
         // ... traitement des messages
         return FALSE; // on accept le passage eventuel a une autre call back
    }
}

Comme tu poura le remarquer, et si tu veut faire du "tous objet", rien ne t'empeche de gerer des evenement OnClick, OnMove etc ...

C'est plus zolie mais niveau efficasité c'est peut etre pas optimal ... j'ai pas encors fait de benchmark ni regardé le code assembleur generé mais la philosopie de la personne qui a fait la lib sigslot est d'eviter des bidouille asembleur pour travaillé dans la vtable, donc c'est portable

J'ai moi meme modifié cette lib pour quelle soit compilable sous Win32, et j'ai rajouté une gestions de de passage conditionel (avec la veur de retour) a la methode suivante (on peut faire plusieur connect a un objet signal?<...>)

Tu poura trouvé ma version du  fichier sigslot dans mon projet 3DControls (http://mignonsoft.free.fr/logiciel/3DControls/)

J'espere que ca peut t'aider

Commentaire de LaPatoshe le 03/12/2004 11:10:05

Merci, je vais regarder cela de plus près et essayer

Commentaire de _Jonathan le 03/12/2004 16:47:10

salut
je viens d'essayer d'integrer la fonction WindProc dans la classe Fenetre en static, mais je n'arrive pas a appeller une autre fonction de la classe via la fonction WindProc.

Fenetre.cpp:63: cannot call member function `int Fenetre::InitObjets(HWND__*)'
   without object

Commentaire de BruNews le 03/12/2004 17:04:04 administrateur CS

Faut conserver pointeur 'this' dans un membre du WNDCLASSEX a la creation et aller le rechercher quand besoin.

Commentaire de _Jonathan le 03/12/2004 17:16:32

Dans la classe Fenetre, j'ai rajouté en privé un pointeur vers une variable de type Fenetre.
A la premiere fonction de la classe appellée, j'y stocke this.
mais dans la fonction WindProc, je ne peut tjrs pas appeller d'autres fonctions.
Je l'ai peut etre mal utilisé...

Fenetre.cpp:65: invalid use of member `Fenetre::pt' in static member function

Commentaire de BruNews le 03/12/2004 17:32:31 administrateur CS

dans la zone de recherche au dessus, tu regles sur 'forum' et tu mets GWL_USERDATA en critere. Tu verras que ymca2003 a deja fait cet exemple plusieurs fois.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales