Timer in Progress Control

SCIPIO-AEMILIANUS

aka Dubdidadu
So schon wieder ich!

Ich hab eine Dialogbasierende Anwendung.
Beim Start wird ein Dialogfenster geöffnet.
In diesem Fenster ist eine Progress Bar(Fortschrittsanzeige).
Die soll langsam zunehmen. Und zwar soll sie als Fortschritt einen Timer benutzen.
Mein Problem ist nicht der Timer oder die ProgressBar dazu hab ich schon was hier im Forum gefunden und beide Funktionieren.
Der Timer killt nach 10 Sekunden das Fenster und bei der ProgressBar nimmt der auch mit Hilfe von
Code:
*name der Progressbar*->SetPos(20)
die Position 20 ein.

Mein Problem ist wie ich die beiden zusammen tue und ein konstantes Update der Progress Bar hab.
 
Hallo,

so ganz verstehe ich dein Problem nicht. Welches Fenster wird denn nach 10 sek gekillt?

Ich setze mal den Fall, du hast ein Timerintervall von 10 Sekunden und da soll die Progressbar immer um 20 weitergeschaltet werden.
Dann brauchst du eine Funktion OnTimer (überschreiben) und eine Variable, die bei jedem Auslösen des Timers um 1 hochzählt. mit dieser Variablen berechnest du den Progressbar-Wert und setzt ihn. Wenn das Ende der Progressbar erreicht ist, KillTimer() nicht vergessen, denn Timer gibts nicht viel bei Windows.
Sollte dein Problem doch anders liegen, erläuter es mal etwas genauer.

Mfg

langer
 
Hallo,
ich hatte letzte Woche mit der Fortschrittsanzeige zu kämpfen.
Hier mein Vorschlag für dein Problem:

Code:
// test3Dlg.h : Headerdatei
// Ctest3Dlg Dialogfeld
class Ctest3Dlg : public CDialog
{
...
public:
	CProgressCtrl m_progressCtrl;
protected:
	UINT m_nTimer;
	UINT_PTR m_nTimerIDEvent;
	UINT m_nApproximateTime; //Kill-Zeit
	UINT m_nRangeUpper;
	int m_z;

	inline void InitProgressCtrl();
	inline void InitTimer();

public:
	afx_msg void OnNcDestroy();
	afx_msg void OnTimer(UINT nIDEvent);
};
inline void Ctest3Dlg::InitProgressCtrl()
{
	m_progressCtrl.SetRange(0, m_nRangeUpper); 
	m_progressCtrl.SetStep(1);
	m_progressCtrl.SetPos(0);

}
inline void Ctest3Dlg::InitTimer()
{
	int uElapse = (double)(m_nApproximateTime *1000)/(double)(m_nRangeUpper); 
	m_nTimer = SetTimer(m_nTimerIDEvent, uElapse, 0);
}

// test3Dlg.cpp : Implementierungsdatei
//
....
Ctest3Dlg::Ctest3Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(Ctest3Dlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_nApproximateTime = 10;//default //10 sec
	m_nRangeUpper = 10;
	m_nTimerIDEvent = 1;
	m_z = 0;
	m_nTimer = -1;
}

BEGIN_MESSAGE_MAP(Ctest3Dlg, CDialog)
...................
        ON_WM_NCDESTROY()
	ON_WM_TIMER()
END_MESSAGE_MAP()


// Ctest3Dlg Meldungshandler

BOOL Ctest3Dlg::OnInitDialog()
{
.................
	// TODO: Hier zusätzliche Initialisierung einfügen
	InitTimer();
	InitProgressCtrl();

	
	return TRUE;  
}

void Ctest3Dlg::OnNcDestroy()
{
	KillTimer(m_nTimerIDEvent);
	CDialog::OnNcDestroy();
}

void Ctest3Dlg::OnTimer(UINT nIDEvent)
{
	if (m_nTimer == nIDEvent)
	{
		m_progressCtrl.StepIt();
		m_z++;
	}
	CDialog::OnTimer(nIDEvent);
        
        if (m_z >= m_nApproximateTime)
	{
		DestroyWindow();
	}
	
}
 
Ich habs hingekriegt danke titanic.
War eig nicht so schwer.
Ich hab eine Variabel erstellt, die bei jedem timeout um 1 addiert wurde und diese Variabel hab ich gleichzeitig bei SetPos() benutzt.
 

Neue Beiträge

Zurück