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] Simuler une suite d'évènements utilisateurs


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Par défaut [MFC] Simuler une suite d'évènements utilisateurs
    Bonjour,

    Dans une application modale, je souhaite simuler une suite d'évènements après l'ouverture de la fenêtre principale :
    clique sur un bouton qui ouvre une fenêtre puis clique sur un bouton de le fenêtre qui vient de s'ouvrir puis fermeture de cette fenêtre puis fermeture de la fenêtre principale.
    L'idéal serait que tout se fasse "silencieusement", sans que quelque chose apparaisse à l'écran.
    J'utilise les fonctions OnButton() et OnClose() dans le premier OnPaint() de la fenêtre principale mais c'est la panique quand je fais le DoModal() qui doit ouvrir une nouvelle fenêtre : certaines variables ne sont pas initialisées, plantage sur certaines fonctions, application qui reste chargée alors que rien n'est visible...
    Quel est la bonne méthode ?

    D'avance merci !

  2. #2
    Membre confirmé Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Par défaut
    J'ai essayé une petite application toute simple :
    Une fenêtre principale avec un bouton Cancel et un bouton Open.
    Une fenêtre popup avec un bouton Cancel.
    Un clic sur le bouton Open ouvre la fenêtre de popup.

    Tout fonctionne bien en mode normal (clic sur Open, clic sur Cancel dans le popup qui vient d'apparaître, clic sur Cancel de la fenêtre principale pour quitter), mais en simulation ces actions provoquent un plantage juste à la fin du DoModal() qui ouvre le popup.
    J'ai l'impression qu'il ne faut pas passer par OnPaint(), mais comment faire pour être sûr que tout soit bien initialisé avant de lancer la simulation ?

    TestModalSimulationDlg.h (fenêtre principale)
    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
    class CTestModalSimultationDlg : public CDialog
    {
    // Construction
    public:
    	CTestModalSimultationDlg(CWnd* pParent = NULL);	// standard constructor
     
    // Dialog Data
    	//{{AFX_DATA(CTestModalSimultationDlg)
    	enum { IDD = IDD_TESTMODALSIMULTATION_DIALOG };
    		// NOTE: the ClassWizard will add data members here
    	//}}AFX_DATA
     
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CTestModalSimultationDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support
    	//}}AFX_VIRTUAL
     
    public:
    	bool m_bFirstPaint;
    	bool m_bDoSilent;
     
    // Implementation
    protected:
    	HICON m_hIcon;
     
    	// Generated message map functions
    	//{{AFX_MSG(CTestModalSimultationDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	afx_msg void OnButtonOpen();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    TestModalSimulationDlg.cpp (fenêtre principale)
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    CTestModalSimultationDlg::CTestModalSimultationDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CTestModalSimultationDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CTestModalSimultationDlg)
    		// NOTE: the ClassWizard will add member initialization here
    	//}}AFX_DATA_INIT
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void CTestModalSimultationDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CTestModalSimultationDlg)
    		// NOTE: the ClassWizard will add DDX and DDV calls here
    	//}}AFX_DATA_MAP
    }
     
    BEGIN_MESSAGE_MAP(CTestModalSimultationDlg, CDialog)
    	//{{AFX_MSG_MAP(CTestModalSimultationDlg)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_BUTTON_OPEN, OnButtonOpen)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CTestModalSimultationDlg message handlers
     
    BOOL CTestModalSimultationDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	SetIcon(m_hIcon, TRUE);			// Set big icon
    	SetIcon(m_hIcon, FALSE);		// Set small icon
     
    	m_bFirstPaint = true;
     
    //	m_bDoSilent = true;
    	m_bDoSilent = false;
     
    	return TRUE;  // return TRUE  unless you set the focus to a control
    }
     
    void CTestModalSimultationDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
     
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
     
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
     
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    	if(m_bFirstPaint)
    	{
    		m_bFirstPaint = false;
     
    		if(m_bDoSilent)
    		{
    			OnButtonOpen();
    			OnCancel();
    			m_bDoSilent = false;
    		}
    	}
    }
     
    HCURSOR CTestModalSimultationDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
     
     
    void CTestModalSimultationDlg::OnButtonOpen() 
    {
    	CPopupDlg oPopupDlg;
    	oPopupDlg.m_bDoSilent = m_bDoSilent;
    	oPopupDlg.DoModal();
    }

    PopupDlg.h (popup)
    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
    class CPopupDlg : public CDialog
    {
    // Construction
    public:
    	CPopupDlg(CWnd* pParent = NULL);   // standard constructor
     
    // Dialog Data
    	//{{AFX_DATA(CPopupDlg)
    	enum { IDD = IDD_DIALOG1 };
    	CEdit	m_EditString;
    	//}}AFX_DATA
     
     
    // Overrides
    	// ClassWizard generated virtual function overrides
    	//{{AFX_VIRTUAL(CPopupDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    	//}}AFX_VIRTUAL
     
    public:
    	bool m_bFirstPaint;
    	bool m_bDoSilent;
     
    // Implementation
    protected:
     
    	// Generated message map functions
    	//{{AFX_MSG(CPopupDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	virtual void OnCancel();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    PopupDlg.cpp (popup)
    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
    52
    53
    54
    55
    56
    CPopupDlg::CPopupDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CPopupDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CPopupDlg)
    	//}}AFX_DATA_INIT
    }
     
     
    void CPopupDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CPopupDlg)
    	DDX_Control(pDX, IDC_EDIT1, m_EditString);
    	//}}AFX_DATA_MAP
    }
     
     
    BEGIN_MESSAGE_MAP(CPopupDlg, CDialog)
    	//{{AFX_MSG_MAP(CPopupDlg)
    	ON_WM_PAINT()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
     
    /////////////////////////////////////////////////////////////////////////////
    // CPopupDlg message handlers
     
    void CPopupDlg::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
     
    	if(m_bFirstPaint)
    	{
    		m_bFirstPaint = false;
     
    		if(m_bDoSilent)
    		{
    			m_bDoSilent = false;
    			OnCancel();
    		}
    	}
     
    	// Do not call CDialog::OnPaint() for painting messages
    }
     
    BOOL CPopupDlg::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	m_bFirstPaint = true;
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
     
    void CPopupDlg::OnCancel() 
    {
    	CDialog::OnCancel();
    }

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Houlalalalalala!

    Mais pourquoi tu nous fais ça dans le OnPaint() ??
    Surtout l'appel à OnCancel(), c'est pas sûr qu'il soit apprécié ici...
    Si tu tiens à ce que quelque chose se passe directement, mets ça dans le OnInitDialog()...

    Et si tu veux qui rien n'apparaisse à l'écran, il me semble qu'il y a une manoeuvre spéciale à faire en MFC pour créer une boite de dialogue non-visible... Se référer à la FAQ ou aux articles sur le site.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Par défaut
    Je ne sais plus d'où ça vient, mais il me semble que les variables membres de la classe ne sont pas forcément initialisé dans OnInInitDialog(). Bon...

    J'ai tout mis dans la fonction OnInInitDialog() et ça semble fonctionner

    Merci beaucoup !

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Pour créer facilement des scénarios utilisateurs de ce genre, jette un oeil à auto-it:
    http://www.hiddensoft.com/autoit3/

  6. #6
    Membre confirmé Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Par défaut
    Je vais regarder ça. Merci !

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

Discussions similaires

  1. remplir une combo suite à un évènement ajax avec dwr
    Par coco-sup dans le forum Struts 1
    Réponses: 6
    Dernier message: 23/01/2013, 14h48
  2. Simuler l'appui sur une touche sans évènement
    Par pc.bertineau dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/02/2008, 16h40
  3. Réponses: 2
    Dernier message: 02/08/2007, 21h55
  4. Fermer une fenêtre suite à un évènement
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 40
    Dernier message: 07/02/2007, 17h05
  5. Fonction activé suite à un événement réalisé "pendant" une seconde!
    Par Martyin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/10/2006, 18h45

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