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 :

[MFC] propertysheet


Sujet :

MFC

  1. #1
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut [MFC] propertysheet
    voila ma méthode :

    j'ai dans une fenêtre une déclaration d'onglet (des dialog-PropertyPage child sans bord, etc)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CTab_1 tab_onglet1;
    CTab_2 tab_onglet2;
    j'ai également la déclaration du PropertySheet qui les englobe :

    CSheet est une classe dérivant de PropertySheet, à laquelle je n'ai pas touché, si ce n'est un rajout de "Focus" sur le onpaint

    mais passons

    un PictureControle siege sur le dialog pour aider au positionnement visuel du Property : IDC_PLACEHOLDER

    Arrive le moment d'instanciation du propertysheet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // on récupère le pointeur sur la picture
    CWnd* tab_place = GetDlgItem(IDC_PLACEHOLDER); 
     
    // on créé le sheet
    tab = new CSheet("",tab_place,0);
     
    // on lui ajoute les 2 onglets
    tab->AddPage(&tab_onglet1);
    tab->AddPage(&tab_onglet2);
     
    // et on créé l'instance
    if (!tab->Create(tab_place, WS_CHILD | WS_VISIBLE, 0)) 
    { 
    	delete tab; 
    	tab = NULL; 
    	return; 
    }
     
    // positionnement physique dépendant de la position de la picture
    CRect r;
    tab_place->GetWindowRect(r);
    tab->SetWindowPos(NULL, 0, 0, r.Width(), r.Height(), SWP_NOZORDER | SWP_NOACTIVATE);
    Cependant le Create génère systématiquement une exception (violation d'accès)...


    j'ai fait quelque chose de mal ?


    je place cette init dans un paint (avec un booléen pour ne le faire qu'une fois). J'ai essayé aussi dans oninitdialog...

    mais systématiquement la première fois ça plante...

    Alors le résultat : l'appli tourne sans probleme... jusqu'à ce qu'on passe la fenêtre en second plan (genre on la recouvre avec un IE)... on ne peut alors plus la réafficher. Et lorsqu'on quitte, on a une serie d'exception

  2. #2
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #pragma once
     
    // CSheet
     
    class CSheet : public CPropertySheet
    {
    	DECLARE_DYNAMIC(CSheet)
     
    public:
    	CSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	CSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
    	CSheet(CWnd* pParentWnd = NULL);
    	virtual ~CSheet();
     
    protected:
    	DECLARE_MESSAGE_MAP()
     
    public:
    	afx_msg void OnPaint();
    	virtual BOOL OnInitDialog();
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    // Sheet.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "Sheet.h"
    #include ".\sheet.h"
     
     
    // CSheet
     
    IMPLEMENT_DYNAMIC(CSheet, CPropertySheet)
    CSheet::CSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
    	:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
    {
    }
     
    CSheet::CSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
    	:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
    {
    }
     
    CSheet::CSheet(CWnd* pParentWnd)
    	:CPropertySheet(AFX_IDS_APP_TITLE, pParentWnd)
    {
    }
     
    CSheet::~CSheet()
    {
    }
     
     
    BEGIN_MESSAGE_MAP(CSheet, CPropertySheet)
    	ON_WM_PAINT()
    END_MESSAGE_MAP()
     
     
    // Gestionnaires de messages CSheet
     
     
    void CSheet::OnPaint()
    {
    	CPaintDC dc(this);
    	GetActivePage()->SetFocus();
    }
     
    BOOL CSheet::OnInitDialog()
    {
    	BOOL bResult = CPropertySheet::OnInitDialog();
     
    	return bResult;
    }

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Première chose, cette initialisation n'a rien à fait dans le OnPaint(). C'est une initialisation donc --> OnInitDialog(). Mais bon, l'erreur de viens pas de là.
    Q: Quelles sont les valeurs des paramètres de Create quand ça plante?

  4. #4
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    bon, alors

    le parent passé à create est :

    0x0032b080 { CWnd hWnd = 0x000b067a { unused=???}}



    l'erreur elle même :
    Exception de première chance à 0x58b83216 dans ...exe : 0xC0000005 : Violation d'accès lors de l'écriture à l'emplacement 0x0050d7b4


    et enfin, cela se produit ligne 1026 du fichier dlgprop.cpp de windows à la ligne:
    HWND hWnd = (HWND)Propertysheet(&m_psh)

  5. #5
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    j'ai trouvé !
    après seulement 2 jours de recherche .. lol


    c'est :
    void CSheet::OnPaint()
    {
    CPaintDC dc(this);
    GetActivePage()->SetFocus();
    }


    le getactivepage()->setfocus() bloque le paint lorsque la fenetre n'a pas le focus, ce qui fait tout planter (plus d'affichage... le paint s'arrête et retente à chaque fois pour planter toujours au meme endroit)... un simple commentaire, et hop, tout marche...

    je ne sais meme plus pourquoi j'avais rajouté ça à la base, mais je vais m'en passer maintenant ^^

  6. #6
    Membre averti
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Par défaut
    ceci dit, ça ne change pas le fait que j'ai toujours une exception pour violation d'accès, mais j'ai déjà résolu le probleme initial de l'affichage

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

Discussions similaires

  1. [MFC] PropertySheet -> Focus
    Par Grey dans le forum MFC
    Réponses: 9
    Dernier message: 16/11/2005, 10h48
  2. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  3. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58
  4. Réponses: 2
    Dernier message: 10/06/2002, 11h03
  5. [MFC] ADO connection
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 10/06/2002, 07h36

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