Newsgroup: it.comp.lang.c++
Titolo: Dialog automatiche in Visual C++

Con il termine "Dialog automatiche" intendo una dialog che riesca a
fare dei conti (delle operazioni in genereche richiedono un po' di
tempo per essere eseguite) subito dopo che e' apparsa sullo schermo.
In altre parole mi piacerebbe molto far partire una dialog (che svolge
delle operazioni di calcolo) immediatamente senza premere alcun
bottone.
Spero che qualche "anima buona" mi sappia dire come fare. Ringrazio
fin da ora tutti quelli che mi sapranno dare una risposta in
proposito.

va' bene, ma in base a quale criterio ?
Devi scusarmi perche' come al solito non mi sono fatto capire. 
Cerchero' di spiegarmi meglio allegando anche il codice che ho
scritto. La dialog la faccio partire selezionando una voce sul menu
(fin qui tutto bene). Questa dialog ha due bottoni: Start e Cancel.
Nel mezzo presenta un numero intero (IDC_NUM_PERCENT) a cui associo il
valore di "m_num". Quando premo Start parte il timer e il numero sulla
dialog si incrementa fino al suo massimo valore (subito dopo la
finestra scompare). Questo e' quello che succede. 
A questo punto vorrei far partire l'incremento del numero senza
premere alcun tasto sulla dialog, cioe' appena visualizzo sullo
schermo la dialog (dopo aver selezionato sul menu la voce che mi
richiama la dialog stessa) il timer parte da solo e parte anche
l'incremento di "m_num" senza dover premere "Start". 
 
Grazie per il vostro interessamento e aiuto.
FILE: PROVAVW.CPP
/////////////////////////////////////////////////////////////////////////////
void CProvaView::OnProvaVai()
{
	CAnalisi dlg;
	dlg.m_num = 0;
	dlg.DoModal();
}
FILE: ANALISI.H
/////////////////////////////////////////////////////////////////////////////
// analisi.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CAnalisi dialog
class CAnalisi : public CDialog
{
private:
  long m_lCount;
  static long m_lMaxCount;
// Construction
public:
	int  m_num;
 
	CAnalisi(CWnd* pParent = NULL);	// standard constructor
// Dialog Data
	//{{AFX_DATA(CAnalisi)
	enum { IDD = IDD_ANALISI };
		// NOTE: the ClassWizard will add data members here
	//}}AFX_DATA
// Implementation
protected:
	virtual void DoDataExchange(CDataExchange* pDX);	//
DDX/DDV support
	// Generated message map functions
	//{{AFX_MSG(CAnalisi)
	afx_msg void OnTimer(UINT nIDEvent);
	afx_msg void OnStart();
	virtual void OnCancel();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};
FILE: ANALISI.CPP
/////////////////////////////////////////////////////////////////////////////
// analisi.cpp : implementation file
//
#include "stdafx.h"
#include "Prova.h"
#include "analisi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
long NEAR CAnalisi::m_lMaxCount;
/////////////////////////////////////////////////////////////////////////////
// CAnalisi dialog
CAnalisi::CAnalisi(CWnd* pParent /*=NULL*/)
	: CDialog(CAnalisi::IDD, pParent)
{
  m_lCount = 0L;
	m_lMaxCount = 50L;
	//{{AFX_DATA_INIT(CAnalisi)
		// NOTE: the ClassWizard will add member
initialization here
	//}}AFX_DATA_INIT
}
void CAnalisi::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAnalisi)
		// NOTE: the ClassWizard will add DDX and DDV calls
here
	//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAnalisi, CDialog)
	//{{AFX_MSG_MAP(CAnalisi)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_START, OnStart)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAnalisi message handlers
void CAnalisi::OnTimer(UINT nIDEvent)
{
	// TODO: Add your message handler code here and/or call
default
 
 		SetDlgItemInt(IDC_NUM_PERCENT, m_num);
		UpdateData(FALSE);  
}
void CAnalisi::OnCancel()
{
	// TODO: Add extra cleanup here
    TRACE("Entering CAnalisi::OnCancel\n");
    if (m_lCount == 0L) { // prior to Start button
      CDialog::OnCancel();
    }
    else 
    { // computation in progress
			m_lCount = m_lMaxCount;  // force exit 
    }
}
void CAnalisi::OnStart()
{
	// TODO: Add your control notification handler code here
    MSG Message;
    int nTemp;
    SetTimer(1, 100, NULL); // 1/10 second
 
    GetDlgItem(IDC_START)->EnableWindow(FALSE);
    for (m_lCount = 0L; m_lCount < m_lMaxCount; m_lCount++) {
       m_num = m_lCount;
        for (nTemp = 0; nTemp < 30000; nTemp++) {} // per perdere
tempo
        if (::PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
          ::TranslateMessage(&Message);
          ::DispatchMessage(&Message);
        }
    }
 
    KillTimer(1);
    CDialog::OnOK();
}

proposito.
Prego ^_^
    _.._        _.._    << HH Creation© >>
  ,','"_:./\/\,'_ `.`.  
 /_:--:_ ( oo ) _:--:_\  §orrow The Prince 
/'      `'`vv'`'      `\

l'incremento di "m_num" senza dover premere "Start". 
ora e' piu' chiaro ! A parte il fatto che io riscriverei il tutto in
modo diverso cercando di evitare il loop della OnStart(), mi pare che
potresti agire in due modi: 
1) definire un messaggio user ed effettuare una PostMessage() di
questo messaggio nella OnInitDialog(), nell'handler del tuo messaggio
user metti il codice della OnStart(). In questo modo il conteggio
parte immediatamente dopo la creazione della dialog, se vuoi
aggiungere un piccolo ritardo puoi usare il secondo sistsema.
2) Usare un timer in piu' da attivare nella OnInitDialog(), la prima
volta che si attiva lo elimini ed attivi la OnStart()
Gianpaolo Bottin
- Live Long and Prosper -