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 :

Pb Handle, GetDlgItem() et TimerProc


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut Pb Handle, GetDlgItem() et TimerProc
    Bonjour à tous!

    J'aimerai utiliser la fonction GetDlgItem dans une de mes fonctions CALLBACK timerproc. Comme il faut lui donner en argument le handle de la fenêtre j'ai chercher à utiliser la fonction GetSafeHwnd().

    Alors j'ai fait comme ca:
    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
     
    InstantResult::InstantResult(CWnd* pParent /*=NULL*/)
    	: CDialog(InstantResult::IDD, pParent)
    {
    	HWND hwnd;
    	hwnd = GetSafeHwnd();
    	m_IdTimer=::SetTimer(hwnd,0,1000,TimerProc);  // création d'un timer qui bat à la seconde
    	m_IdTimer2=::SetTimer(hwnd,1,500,TimerProc2);  // création d'un timer qui bat à la seconde
     
    }
     
    VOID CALLBACK TimerProc(HWND /*hwnd*/,UINT /*uMsg*/,UINT_PTR /*idEvent*/,DWORD /*dwTime*/)
    {
      // timer function
     
    	unsigned char NoAuthmov[1]={141}; // not allowed to move command
    			WriteFile(hcom,NoAuthmov, 1, &m, NULL);
     
    }
     
    VOID CALLBACK TimerProc2(HWND hwnd ,UINT /*uMsg*/,UINT_PTR /*idEvent*/,DWORD /*dwTime*/)
    {
     
    			CCom::PurgeTx();
    			CCom::ReadBuffer();
     
    			CEdit* editFiD=(CEdit*) GetDlgItem(hwnd,IDC_EDIT4);
    			editFiD->SetWindowText(data);
     
    }
    Je ne comprends pas ce que j'ai fait de travers...

    A l'exécution j'ai un .exe has triggered a breakpoint et la ligne surlignée est Debug Break;
    }

    et

    CWnd::SetWindowtext
    ENSURE(this)

    Voyez vous sinon un autre moyen d'utiliser GetDlgItem dans mon timerproc ?
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tu es dans une CDialog , alors pourquoi tu n'utilises pas la gestion du timer associé a une fenêtre MFC ?
    http://cpp.developpez.com/faq/vc/ind...=CWnd#SetTimer
    note: cette utilisation résoudra ton problème d'accès a GetDlgItem...

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Euhhh je veux bien réessayer mais dans un post, stephdin m'avait dit ca :

    utilises la fonction globale SetTimer() en indiquant une procédure et non la méthode SetTimer() de la classe CWnd

    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    m_IdTimer=::SetTimer(NULL,0,1000,TimerProc);  // création d'un timer qui bat à la seconde
     
    ...
     
    KillTimer(m_IdTimer);  // pour arreter le timer
     
    ...
     
    VOID CALLBACK TimerProc(HWND /*hwnd*/,UINT /*uMsg*/,UINT_PTR /*idEvent*/,DWORD /*dwTime*/)
    {
      // ici la procédure du timer
    }

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    J'ai donc fait ca en m'inspirant de ta faq:
    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
     
    InstantResult::InstantResult(CWnd* pParent /*=NULL*/)
    	: CDialog(InstantResult::IDD, pParent)
    {
    	OnStartTimer();
    	OnTimer(1);
     
    }
    void InstantResult::OnStartTimer() 
    {
    	m_nTimer =SetTimer(1, 2000, 0);
    }
     
    void InstantResult::OnStopTimer() 
    {
        KillTimer(m_nTimer);  
    }
     
    void InstantResult::OnTimer(UINT nIDEvent) 
    {
        switch(nIDEvent)
        {
            case 1:AfxMessageBox(_T("cakette"));
            default:break;
        }    
        // Call base class handler.
        InstantResult::OnTimer(nIDEvent);
    }
    et j'ai le problème Debug Assertion Failed qui pointe dans afxwin2.inl sur la ligne SetTimer.
    Si je fais continuer lors de l'erreur j'ai bien mon message.
    D'où cela peut il venir ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    mais dans ce dernier cas tu n'étais pas dans une fenêtre MFC

    tu n'as toujours pas compris qu'il y a deux manières de voir les timers:
    soit par l'api win32 : la solution dont tu parles.
    soit ce que propose les fenêtres MFC qui n'est qu'un encapsulation de l'api win32.
    dans ton cas ici présent c'est cette solution qui est préférable.
    pourquoi s'embêter avec une callback alors que la fenetre MFC le gère ?

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    normal...
    une fenêtre est valide graphiquement a partir du déclenchement de la méthode:
    OnInitDialog pour une boîte de dialogue.
    OnInitialUpdate pour une vue.
    pas dans le constructeur, m_hwnd est null....
    initialise ton timer dans OnInitDialog.

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 126
    Par défaut
    Ok j'ai fait alors ma fonction OnInitDialog :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BOOL InstantResult::OnInitDialog()
    {
     
    	CCom::ClosePortCom();
    	CCom::InitPortCom();
    	OnStartTimer();
     
    	OnTimer(1);
     
    	return(TRUE);
    }
    Mais c'est bizarre pcq ma MessageBox est affichée avant que je ne sois sur ma fenêtre. Est ce normal ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/07/2003, 11h52
  2. Manipulation des handle contexte
    Par rockbiker dans le forum DirectX
    Réponses: 1
    Dernier message: 09/05/2003, 18h51
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 12h29
  5. pb de handle en C
    Par deedje dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 16h19

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