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

  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 397
    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 397
    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. 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. 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