Newsgroup: it.comp.programmare.win32
Titolo: Gestione calendario e pulsanti non standard in Visual c++.

Salve a tutti!
Sto realizzando una semplice applicazione in Vc++!
Vorrei includere nella mia applicazione (Interfaccia realizzata
utilizzando dialog box...) la gestione del calendario! In particolare
vorrei fare in modo che in un determinato giorno mi appaia una finestra
di avviso opportunamente configurata...(Che ad esempio mi ricordi che
in quel giorno devo....) Come potrei fare???
Vorrei inoltre abbellire la mia interfaccia cambiando il suo colore
(standard) o utilizzando pulsanti non tradizionali!
Vi ringrazio anticipatamente per la vostra gentilezza...A presto!

 (standard) o utilizzando pulsanti non tradizionali!
www.godeguru.com
 trovi una sezione VC++, Controls tutto ciň che riguarda la 
personalizzazione dei controlli standard. 

Innanzitutto ciao e grazie per la tua risposta!
Si vorrei realizzare un programma che funzioni come un'agendina
elettronica che possa essere opportunamente configurata e che mi
ricordi che ad esempio il 15 settembre è il compleanno di una mia
amica...
Per quando riguarda la personalizzazione dei controlli standard non
riesco a trovare il sito che mi hai suggerito (
www.godeguru.com???
).
Ciao e a presto!

 
www.codeguru.com
Dai un'occhiata anche a 
www.codeproject.com
-- 
Valter Minute
(the reply address of this message is invalid,
but you may be able to guess the right one)

 riesco a trovare il sito che mi hai suggerito (
www.godeguru.com???
).
hem... oggi sono dislessico, intendevo 
www.codeguru.com
.



Io ho fatto una cosa del genere, mi sono un po' fermato quando ho
dovuto realizzare i controlli degli appuntamenti.
Prima ho creato un calendario e gli ho attaccato una variabile di
controllo, poi un CListCtrl, in cui inserisco gli appuntamenti.
Salvo tutto in un file, tramite una Class che ho chiamato App.
Ok, fin qua tutto ok, poi però come fare per continuare a controllare
(ogni minuto direi) se l'appuntamento arriva?
In quale evento dell'applicazione devo mettere il controllo del tempo?
Mah,...
poi ci sarebbe anche il probelma di farlo diventare Tray icon...ma
magari dopo.

 (ogni minuto direi) se l'appuntamento arriva?
Al volo mi vengono in mente tre possibilità:
1) Impostare un timer (con SetTimer) ogni tot secondi (abbondanti direi) ed 
intercettare il msg WM_TIMER, nel quale andare a controllare le tue date di 
scadenza
2) Creare un working thread a bassissima priorità con degli Sleep esagerati
3) Implementare l'evento OnIdle ed andare a fare lo stesso controllo
Te le ho messe in ordine personale di preferenza:
la 1 è molto semplice da implementare
la 2 è sicuramente più elegante ma un tantino più complicata
la 3 non mi piace proprio... non so nemmeno perchè l'ho scritta!!!

la 3 non mi piace proprio... non so nemmeno perchè l'ho scritta!!!
Hmmm!
Direi che sono pienamente d'accordo con te per la 1!
La 2 non ho neanche capito cosa vuol dire.
E la tre sembra molto simile a un esperiemento che ho fatto 
utilizzando ContinueModal del dialog che ho creato.
Un po' funzionava però non riuscivo a prendere i minuti
con CTime tx
tx.GetMinute();
mi dava sempre 0...
boh!
Grazie
Filippo

 wrote:
Scusami avrei un'altra domandina da farti
Ho fatto come mi hai detto con il timer e funziona bene.
Però non capisco perchè se uso 
	SYSTEMTIME adesso;
	GetLocalTime(&adesso);
	adesso.wDayOfWeek mi dà 4 (oggi)
se uso invece
COleDateTime pippo;
pippo.GetDayOfWeek();
mi dà 5 (sempre oggi)
Grazie
Ciao
F

 mi dà 5 (sempre oggi)
GetDayOfWeek restituisce un numero tra 1 e 7
1=Domenica, 2=Lunedì, 3=Martedì, 4=Mercoledì, 5=Giovedì...
Quindi è tutto giusto!

 La 2 non ho neanche capito cosa vuol dire.
Programmazione multithreading:
- un working thread è un thread che gira in parallelo al tuo applicativo, 
con una priorità molto bassa (quindi non appesantisce tutti gli eventuali 
programmi che stanno girando).
- lo Sleep server per mettere delle pause al thread in modo che non carici 
la CPU mentre fa il suo loop di controllo (in pratica il TaskManager ti 
darebbe CPU sempre al 100% anche se il tuo PC sarebbe veloce e libero come 
sempre).



Ottimo! Allora basta che aumento di 1 la variabile e sono a posto!
(ma dove le hai imparate tutte queste cose??)
Ma tu lo sapevi che la funzione del Timer, se ne frega altamente se tu
apri un MessageBox in attesa di un Ok o Cancel?
Questo fa si che o ti sbrighi a dare ok, oppure la routine va avanti
(diciamo ogni 5 secondi) e se hai dei CFile aperti, va tutto in crash
:))
Che bello!
Ho provato anche a creare una classe e ad aprirla ma aspetta sempre
l'ok per procedere.
E intanto il Timer mi apre una procedura unguale e parallela ogni 5
secondi.
COme faccio per farlo andare avanti senza fermarlo sull'Ok / Cancel di
qualsiasi finestra? (che sarebbe quella che ti ricorda l'appuntamento)
Grazie Mille!
Ciao
F

 qualsiasi finestra? (che sarebbe quella che ti ricorda l'appuntamento)
Una soluzione non troppo elegante ma che funziona è quella di uccidere il 
timer per poi ricrearlo all'interno del tuo evento.
In pratica nell'OnTimer inserisci un KillTimer come prima cosa e un SetTimer 
al fondo.
Se invece vuoi veder apparire tutti i tuoi appuntamenti su finestre 
indipendenti (stile pop-up) puoi sempre creare più dialog indipendenti che 
ognuna cambia lo stato dell'evento alla quale è associato (tipo ... evento 
visualizzato e quindi eviti di far apparire una nuova finestra, evento da 
non visualizzare per tot minuti, etc.)
Non so se mi sono spiegato... però il risultato è sicuramente di effetto nel 
caso di eventi simultanei.

Ciao a tutti!
Visto che sono interessata anche io....
Perchè non mi fate capire qualche cosa anche a memagari con qualche
riga di codice ?
Grazie e a presto....

 riga di codice ?
muble muble...
Es. per implementare un timer:
- nella OnInitDialog della tua CDialog crei un timer
    SetTimer (0x01, 5000, NULL);
- nella CDialog (usando il ClassWizard, Add Windows Message Handler) 
intercetti il msg WM_TIMER, questo ti crea una funzione OnTimer nella tua 
CDialog
void CMyDialog::OnTimer(UINT nIDEvent)
{
    KillTImer (0x01);    //Killo il timer per evitare che si scateni mentre 
faccio le mie cosucce....
    if (nIDEvent == 0x01)
    {
        //...qua faccio le mie cosette...
    }
    SetTimer (0x01, 5000, NULL);    //Ripristino il timer...
    CDialog::OnTimer(nIDEvent);
}
Poi... esempio per creare finestre "al volo" :
  CDialog* pDialog = new CDialog ();
  pDialog->Create (IDD_DIALOG1);    //IDD_DIALOG1 è l'ID delle risorse dove 
hai disegnato la tua finestra
  pDialog->ShowWindow (SW_SHOW);
Quali altri esempi ti servono?

 wrote:
Interessante questa soluzione!
Io invece, da plebeo del codice, ne ho trovato un'altra.
Ho creato una finestra di dialogo  con un listcontrol nel quale scrivo
le cose.
Coè scrivo se il messaggio è da visualizzare, quando, come e perchè.
Poi nel timer, che io ho intercettato in DefWinProc...ma credo sia
uguale, ho messo un controllo a quello che è scritto nel CListControl,
in modo che anche se il timer va avanti io posso scrivere una bella X
in una colonna del controllo e non incorrere in problemi col CFile.
Poi con un array.....mi segno quello da scrivere ne file e lo scrivo
con comodo.
Come vi sembra?
Mi sono spiegato?
Vi metto qua un pezzo di codice :
switch (message)
	{
	case WM_TIMER: 
 
		switch (wParam) 
		{ 
			case 1:
			///////////////////////////////////////////
			ZeroMemory(&segn,800);
			COleDateTime 		 	 
			adesso=COleDateTime::GetCurrentTime();
			int Adesso=adesso.m_dt;
			totitem=m_lista.GetItemCount();
 
			for (int it=1;it<=totitem;it++)
			{
			L=TrovaLivello(it);//Assegno un livello
all'appuntamento
				TempoX=EstraiData(it);//Estraggo la
data dalla lista
				int AppTime=TempoX.m_dt;
				if (L!=0)
				{
					if (L==1) //Livello 1
					{
						if(Adesso==AppTime)
						{