Timer en mfc

dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004 - 4 mai 2004 à 15:48
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 5 mai 2004 à 18:51
bonjour, pourriez me fournir un exemple simple de timer cree sous mfc. J'ai regarder dans le forum mais je n'y comprend rien.
Pour moi Settimer, une fois appele, apelle une fonction processtimer executer toute les xx ms.....
les exemples ici me paraissent tres compliques!!!!

pouvez vous m'aider!!!!!!!!!!!!!!!
merci

9 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
4 mai 2004 à 18:45
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
{
// appélée régulièrement
}

// création du timer toutes les dwTimeOut ms TimerProc sera appelé.
int nId=SetTimer(NULL, 0, dwTimeOut, TimerProc);

// destruction:
KillTimer(NULL, nId);
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
5 mai 2004 à 10:22
je te remercie mais je ne sais pas si le timer se lance actuellement car je fais incrementer une variable a l'interieure et elle ne change pas d'etat.

Autre chose: dans une telle fonction de timer, il n'est pas possible d'appeler une fonction d'une classe ? car j'ai essayer mais ca me dit que la fonction est non static. si je la met static, mes variable Cedit ... ne sont plus reconnues comment faire?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2004 à 11:33
la variable que tu modifie est-elle globale ou locale à la fct TimerProc (dans le second cas c'est normal que ça marche pas).

TimerProc ne peut avoir accès qu'a des variables globales, il faut donc mettre en global l'objet en question.

Si tu est en MFC, tu peut utilser SetTimer(IdTimer, dwTimeOut, NULL) dans la classe dérivant de CWnd dont tu souhaite accéder aux membres. Dans ce cas, OnTimer sera appelée. (classwizard->MemberFct WM_TIMER)
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
5 mai 2004 à 11:37
la variable est une variable globale dans une classe. le probleme est que je ne peux acceder a cette classe via le timer. A moins peut etre de faire comme tu dis.
Peut tu me donner plus de precision (faut t'il intecepter le message WM_TIMER et comment?)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2004 à 11:52
On reprend depuis le début :
- Ton timer va te servir à quoi ?
- A quelles variables de quelles classes doit-it accéder ?
- Type des classes (perso ou dérivé de CWnd, CDialog, CFrameWnd...) ?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2004 à 11:59
HBITMAP ResizeBmp(HBITMAP hBmpSrc, SIZE newSize)
{
// taille actuelle
BITMAP bmpInfo;
GetObject(hBmpSrc, sizeof(BITMAP), &bmpInfo);
SIZE oldSize;
oldSize.cx = bmpInfo.bmWidth;
oldSize.cy = bmpInfo.bmHeight;

// selection source ds un DC
HDC hdc = GetDC(NULL);
HDC hDCSrc = CreateCompatibleDC(hdc);
HBITMAP hOldBmpSrc = (HBITMAP)SelectObject(hDCSrc, hBmpSrc);

// création bitmap dest et sélection ds un DC
HDC hDCDst = CreateCompatibleDC(hdc);
HBITMAP hBmpDst = CreateCompatibleBitmap(hdc, newSize.cx, newSize.cy);
HBITMAP hOldBmpDst = (HBITMAP)SelectObject(hDCDst, hBmpDst);

// resize
StretchBlt(hDCDst, 0, 0, oldSize.cx, oldSize.cy, hDCSrc, 0, 0, newSize.cx, newSize.cy, SRCCOPY);

// libération ressources
SelectObject(hDCSrc, hOldBmpSrc);
SelectObject(hDCDst, hOldBmpDst);
DeleteDC(hDCSrc);
DeleteDC(hDCDst);
ReleaseDC(NULL, hdc);

return hBmpDst;
}
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2004 à 12:00
oupps, je me suis gouré de sujet...
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
5 mai 2004 à 15:04
en fait voila le probleme:

Grace a une fenetre de dialogue, j'affiche et je met a jour les positions d'un robot que je commande.
(progressbar, edit....)

actuellemnt, lorsque j'appui sur un bouton, je lance un mouvement, je vais ensuite relire la position du robot et je met a jour mon affichage (ceci ce fait dans une boucle while avec un sleep de 200 ms)
Le probleme c qu'il arrive que l'affichage de ma boite de dialogue plante et je ne vois alors plus rien. (si j'ouvre une autre fenetre alors que je suis dans un while)
je pensais donc me servir d'un timer pour mettre a jour mes barres de progression et mes fenetres edit toutes les ms pendant le mouvement. Peut etre que ca resoudrait le probleme?

Le timer servira donc a adapter et faire avancer si tu veux des barres de progression et des edit dans ma fenetre de dialogue. je dois donc avoir acces aux variables Cedit et Cprogressbar de ma fentres principale.
Donc je dois acceder a la classe de ma fenetre principale qui est derivee de Cdialog.

Vois tu un peu mieux le truc?
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 mai 2004 à 18:51
voici un petit chrono qui doit pouvoir de servir de base pour ton prog.
le dialog IDD_TIMER contien un contrôle static (IDC_STC_TIMER) et 3 boutons (IDC_BTN_START, IDC_BTN_STOP et IDCANCEL).

TestTimerDlg.h
//*****************************************************************************
// TestTimerDlg.h :
//
//*****************************************************************************

#ifndef AFX_TESTTIMERDLG_H_INCLUDED_
#define AFX_TESTTIMERDLG_H_INCLUDED_

//*****************************************************************************
// Classe CTestTimerDlg.
//*****************************************************************************
class CTestTimerDlg : public CDialog
{
//=============================================================================
// Membres privés.
//=============================================================================
private :

// police de caractères pour l'affichage
CFont	m_Font;

// début du chrono
DWORD	m_dwStartTime;

//=============================================================================
// Méthodes publiques.
//=============================================================================
public :
// constructeur
CTestTimerDlg(CWnd* pParent = NULL);

//=============================================================================
// Données de la boîte de dialogue.
//=============================================================================
//{{AFX_DATA(CTestTimerDlg)
enum { IDD = IDD_TESTTIMER };
CButton	m_BtnStop;
CButton	m_BtnStart;
CStatic	m_StcTimer;
//}}AFX_DATA

//=============================================================================
// Méthodes virtuelles redéfinies.
//=============================================================================
//{{AFX_VIRTUAL(CTestTimerDlg)
protected :
virtual void DoDataExchange(CDataExchange* pDX);
//}}AFX_VIRTUAL

//=============================================================================
// Traitement des messages.
//=============================================================================
protected :
//{{AFX_MSG(CTestTimerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnBtnStart();
afx_msg void OnBtnStop();
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

#endif	// AFX_TESTTIMERDLG_H_INCLUDED_



TestTimerDlg.cpp:
//*****************************************************************************
// TestTimerDlg.cpp :
//
//*****************************************************************************

#include "StdAfx.h"
#include "TestTimer.h"
#include "TestTimerDlg.h"

//=============================================================================
// Table des messages.
//=============================================================================
BEGIN_MESSAGE_MAP(CTestTimerDlg, CDialog)
//{{AFX_MSG_MAP(CTestTimerDlg)
ON_BN_CLICKED(IDC_BTN_START, OnBtnStart)
ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//*****************************************************************************
// Constructeur
//*****************************************************************************
CTestTimerDlg::CTestTimerDlg(CWnd* pParent)
: CDialog(CTestTimerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestTimerDlg)
//}}AFX_DATA_INIT
}

//*****************************************************************************
//*****************************************************************************
void CTestTimerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestTimerDlg)
DDX_Control(pDX, IDC_BTN_STOP, m_BtnStop);
DDX_Control(pDX, IDC_BTN_START, m_BtnStart);
DDX_Control(pDX, IDC_STC_TIMER, m_StcTimer);
//}}AFX_DATA_MAP
}

//*****************************************************************************
// OnInitDialog :
//*****************************************************************************
BOOL CTestTimerDlg::OnInitDialog()
{
// appel fonction de la classe de base
CDialog::OnInitDialog();

// chargement et affectation icone (grande et petite)
HICON hIcon = LoadIcon(::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_APPICON));
SetIcon(hIcon, TRUE);
SetIcon(hIcon, FALSE);

// état des boutons
m_BtnStart.EnableWindow(TRUE);
m_BtnStop.EnableWindow(FALSE);
m_BtnStart.SetFocus();

// création police de caractère et affectation
CFont* pCurFont = m_StcTimer.GetFont();
LOGFONT lg;
pCurFont->GetLogFont(&lg);
lg.lfHeight = -40;
lg.lfWeight	= FW_BOLD;
m_Font.CreateFontIndirect(&lg);
m_StcTimer.SetFont(&m_Font);

// retour
return TRUE;
}

//*****************************************************************************
// OnBtnStart :
//*****************************************************************************
void CTestTimerDlg::OnBtnStart()
{
// création timer
SetTimer(0x100, 100, NULL);
m_dwStartTime = GetTickCount();
m_StcTimer.SetWindowText(_T("0"));

// état des boutons
m_BtnStart.EnableWindow(FALSE);
m_BtnStop.EnableWindow(TRUE);
m_BtnStop.SetFocus();
}

//*****************************************************************************
// OnBtnStop :
//*****************************************************************************
void CTestTimerDlg::OnBtnStop()
{
// destruction timer
KillTimer(0x100);

// état des boutons
m_BtnStart.EnableWindow(TRUE);
m_BtnStop.EnableWindow(FALSE);
m_BtnStart.SetFocus();
}

//*****************************************************************************
// OnTimer :
//*****************************************************************************
void CTestTimerDlg::OnTimer(UINT nIDEvent) 
{
// mise à jour du chrono
TCHAR szText[16];
itoa((GetTickCount()-m_dwStartTime)/1000, szText, 10);
m_StcTimer.SetWindowText(szText);
}

0