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

MFC Discussion :

Une barre de defilement dans un projet non document/view ?!?


Sujet :

MFC

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Une barre de defilement dans un projet non document/view ?!?
    Bonjour, je cherche à ajouter une barre de défilement horizontale à ma fenêtre client mais dans un projet qui ne supporte pas l'architecture document/View. J'ai essayé la méthode, indiquée dans les livres et sur de nombreux sites, qui s'applique à des projets document/View et qui consiste à dériver la classe CNomDeMonProjetView de la classe CScrollView au lieu de la classe CView. J'ai donc essayé de dériver la classe CChildView de CScrollView au lieu de CWnd mais ca ne compile pas... :-(
    J'espère que quelqu'un pourra m'aider, a+, Eljun09

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Cela ne compile pas ??
    Plus de précisions , merci

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    La méthode indiquée dans les livres dit de remplacer toutes les occurences de la classe CView par CScrollView. Elle dit d'appeler CScrollView::SetScrollSizes( avec quatres paramètres) dans CStageView::OnInitialUpdate(). Comme je voudrais ne pas utiliser le modele Document/View j'ai créé un projet MFC AppWizzard(exe) en cochant "Single Document" et en décochant "Document/View architecture support ?" et sans rien modifier d'autre. J'ai ensuite modifié toutes les occurences de la classe CWnd par CScrollView (pour derivé ma classe CChildView de CScrollView au lieu de CWnd). Au passage je me demande si je dois aussi modifier l'entête de la fonction OnSetFocus qui ne se trouve pas dans les fichiers relatifs à ma vue mais ceux relatifs à MainFrame ?!? Bref, je compile et j'obtient :

    ...\mainfrm.h(46) : error C2259: 'CChildView' : cannot instantiate abstract class due to following members:
    ...\childview.h(15) : see declaration of 'CChildView'
    ...\mainfrm.h(46) : warning C4259: 'void __thiscall CScrollView::OnDraw(class CDC *)' : pure virtual function was not defined
    c:\program files\microsoft visual studio\vc98\mfc\include\afxwin.h(3752) : see declaration of 'OnDraw'

    Voila, je t'ai indiqué ce que j'ai fait tu n'auras donc aucun mal, si tu le désires à obtenir le meme message d'erreur...
    En espérant que tu comprennes pourquoi je ne peux pas dérivé ma classe CChilView de CScrollView je te remercie de t'etre déjà penché sur le sujet... ciao, eljun09

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Il faut apparemment utiliser la macro DYNCREATE(CChildView,CScrollView) qui permet d'instancier en dynamique une classe d'objet...
    Mais si cela n'est pas la solution , pourquoi ne pas utiliser l'architecture Doc/View ? car sans ce mécanisme , il faut tout prendre en charge...

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Encore merci de m'accorder de votre temps ! Mais je n'ai toujours pas résolu mon problème. Je débute dans le visual c++. J'ai donc cherché dans mes livres (ceux publiés par microsoft) comment utiliser la macro DYNCREATE. En incérant DECLARE_DYNCREATE(CChildView) dans la déclaration de la classe CChildView et IMPLEMENT_DYNCREATE(CChildView, CScrollView) dans le fichier CChildView.cpp, rien n'a changé et j'obtenais les mêmes messages d'erreurs. Dans le livre il parle de devoir utiliser la macro RUNTIME_CLASS. J'ai donc cherché à comprendre comment l'utiliser...
    Dans mes diverses tentatives j'ai aussi essayé d'utiliser la macro DYNAMIC à la place et de créer dynamiquement un objet. Pour cela, j'ai déclaré la variable membre m_wndView de la classe MainFrame non pas comme une instance de la classe CChildView mais comme un pointeur vers un objet de cette classe (que j'ai nommé m_pwndView). Ainsi la compilation passait, mais il me restait à initialiser ce pointeur. J'ai donc voulu le faire dans le constructeur de MainFrame. J'y ai tappé les deux lignes de codes indiquées dans mon livre comme créant un objet dynamiquement :
    CMainFrame::CMainFrame()
    {
    CRuntimeClass *pRTC = RUNTIME_CLASS(CChildView) ;
    m_pwndView = (CChildView*)pRTC->CreateObject() ;
    }
    La compilation passait toujours mais, je ne sais pourquoi, la fonction CreateObject() me renvoie null donc par voie de conséquence mon pointeur vaut NULL et du coup lorsque je l'utilise j'ai un message d'erreur comme quoi j'accède à une zone mémoire invalide ce qui est tout à fait normal.
    Ce n'est qu'en commencant à tapper ce message que je me suis rendu compte que je n'utilisais alors plus la macro que vous m'aviez conseillé mais la macro DYNAMIC. J'ai donc essayé de faire le remplacement et je me suis retrouvé avec les mêmes erreurs qu'au tout début, c'est à dire celles qui m'ont amenées à poser la question initiale sur le forum.
    Avez vous une idée de comment je pourrais procéder maintenant ?!?

    Sinon, pourquoi ne pas utiliser une architecture document/view ? Et bien en fait, je dois prendre en entrée deux fichiers de mêmes noms mais avec des extentions différentes. Je veux donc que, quand l'utilisateur clic sur Fichier/Ouvir/Ok (après avoir selectionner un nom de fichier), le programme me renvoie uniquement le nom du fichier et me laisse la main pour ouvrir moi même les deux fichiers. Comme beaucoup de code nous est caché, je n'ai pas trouvé d'hiniber l'ouverture du fichier sélectionné et de placer mes propres instructions ce qui m'a ammené à me rabattre sur un projet sans modèle document/view étant donné que les actions ouvrir et enregistrer que je veux faire sont facilement implémentable gràce aux fenêtres communes de windows... L'inconvénient étant que toutes les techniques décrites dans les livres sont basées sur l'architecture document/view et donc j'ai beaucoup de difficultés à les appliquer comme vous pouvez d'ailleurs le voir !!!

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Sinon, pourquoi ne pas utiliser une architecture document/view ? Et bien en fait, je dois prendre en entrée deux fichiers de mêmes noms mais avec des extentions différentes. Je veux donc que, quand l'utilisateur clic sur Fichier/Ouvir/Ok (après avoir selectionner un nom de fichier),
    Si vous épluchez bien les livres consacrés à la question ( lesquels justement ? ) et le MSDN , vous sauriez qu'il faille redéfinir l'appel de ces fonctionnalités ( en anglais override method ) . Donc dans la classe document ou vue au choix avec ClassWizard il faut redéfinir le code de Nouveau Fichier soit CDocument::OnNewDocument() à redéfinir...
    Cela équivaut à une CDialog et la méthode OnOk() qui refermer ladite boite de dialogue lorsqu'on appuie sur entrée

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Je vous remercie, en effet, en redéfinissant la fonction membre OnOpenDocument de la classe Document j'arrive à récuperer le nom du fichier selectionné par l'utilisateur, je peux ainsi ouvrir les fichiers comme je le désire et en utilisant l'architecture document/view je n'aurais plus de problèmes pour le défilement...
    Je soupsçonne cependant que le fichier soit tout de même ouvert et que, par suite, l'application l'ouvre en fait deux fois. J'ai lu qu'en fait une instance de la classe CFile était créée lors du processus ainsi qu'une instance de la classe CArchive attachée à l'objet CFile. Ensuite c'est par l'intermédiaire de l'archive que se font toutes les manipulations. Je me demande alors s'il n'y aurait pas moyen, d'accéder directement à l'objet CFile déjà créé ce qui m'éviterai d'ouvrir plusieurs fois le même fichier...
    Cordialement, eljun09

    Si quelqu'un connait cependant la solution pour insérer une barre de défilement à un projet qui ne supporte pas l'architecture Document/View, je reste à l'écoute de toute proposition pour ma culture personnel ainsi que pour fournir une solution à ceux qui seraient confrontés au même problème et qui espereraient trouver une solution en venant ici...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Mettre une barre de defilement dans un userform
    Par Nokho dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/06/2022, 16h43
  2. Réponses: 4
    Dernier message: 25/11/2006, 18h52
  3. Mettre une barre de défilement dans une CheckListBox ?
    Par Invité dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/07/2005, 10h39
  4. barre de defilement dans une div
    Par barbarius dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/06/2005, 15h19

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