6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver

Slides:



Advertisements
Presentazioni simili
Questa guida spiega come:
Advertisements

Shell: variabili di sistema PATH HOME USER PWD SHELL HOSTNAME HOSTTYPE Per visualizzare il valore di tutte le variabili dambiente si usa il comando set.
Gestione dei Progetti Software 2 (a.a. 2004/05) - Lezione 51 Applet configurabili Grazie alla sezione parametri aggiuntivi del comando di HTML è possibile.
Dipartimento di Matematica
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
MultiSet, Liste Ordinate
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
GLUT & OpenGL Ing. Tommaso Coviello Politecnico di Bari
Introduzione al linguaggio C
Gerarchie di Oggetti Tutti i sistemi avanzati di grafica (PHIGS, OpenGL, DirectDraw, …) permettono di definire un modello come una gerarchia di oggetti.
Costruzione di Interfacce Lezione 11 Dal Java al C++ parte 2
11 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Xml for dummies Parte 2
Costruzione di Interfacce Lezione 6 Esercitazione Trasformazioni
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 27 Estensioni Opengl, Multitexturing,
Costruzione di Interfacce Lezione 10 Dal Java al C++ parte 1
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 26 XML read e write / Gl Selection e picking
1 Costruzione di Interfacce Primi passi in OpenGL
Costruzione di Interfacce Lezione 18 Qt Tutorial 2
Costruzione di Interfacce Lezione 19 Qt Tutorial Designer
Matrici di Proiezione Prospettica
Costruzione di Interfacce Lezione 5 Trasformazioni Affini
Costruzione di Interfacce Lezione 20 Qt + Opengl
Costruzione di Interfacce Lezione 12 C++STL
22 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 22 Texturing
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 24 Scene Graphs e Xml for dummies
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 30 MMeditor e collision detection
Costruzione di Interfacce Lezione 15 Rendering Locale e Globale
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball
1 Costruzione di Interfacce Primi passi in OpenGL
2 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 23 Scene Graphs, Object Loading
Costruzione di Interfacce Lezione 8 Rasterizzazione
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
1 Lezione XIII Lu 17-Nov-2005 Programmare le classi.
Sistemi Operativi GESTIONE DEI PROCESSI.
Lezione IX Laboratorio di Programmazione. Le Classi Una classe C++ è definita come segue: class Nomeclasse { private: // metodi e attrib. visibili solo.
DBMS ( Database Management System)
1 Programmazione grafica: lInterazione Daniele Marini.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
Picking - OpenGL Disegno della scena (display) Impostazione parametri selezione Ripristino parametri Loop Selezione.
Display list e scene graph Daniele Marini Dipartimento di Informatica e Comunicazione.
Corso di Programmazione Grafica e Laboratorio Daniele Marini
Display list e picking Daniele Marini Corso Di Programmazione Grafica e Laboratorio.
1 Programmazione grafica: l’Interazione Daniele Marini.
Esercizi.
1 Videopoker esempio di applicazione in java. 2 Videopoker Un giocatore, con un portofaglio iniziale il giocatore punta il banco da 5 carte il giocatore.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 29 ancora MMeditor,
Programmazione in linguaggio C
Oggetti in C# Lezione 2 Metodi e Static Oggetti in C# - Lezione 2.
Costruzione di Interfacce Lezione 18 MFC e OpenGL
25 Nov 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 21 Trackball, Generazione TexCoords
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Laboratorio di Servizi Web - XML - Ardissono 1 Rappresentazione ad oggetti di documenti XML Parser fanno analisi sintattica di documento XML ma, a meno.
Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 Xml for dummies Parte 2
1 SC che operano su processi Getpid, fork, exec, wait, waitpid, exit, dup, dup2.
La gestione degli eventi
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione 14 Marzo Esercizio dell’altra volta Definire un tipo di dato Abbonato i cui oggetti descrivono le informazioni relative ad un abbonato.
Esercitazione sull’ ordinamento 20 maggio 2003
Lezione 2 : Basi del linguaggio Variabili. Come visto nella lezione 1 le classi registrano il proprio stato nelle variabili  int cadenza = 0;  int velocita.
Stringhe in Java. Definire una stringa. Definire una stringa in Java Il modo più semplice e diretto per creare un oggetto di tipo String è assegnare alla.
* R AMAN K AZHAMIAKIN O SCAR Z G IOVANNI D E ITT M. B UONARROTI, T RENTO A NDROID D EVELOPMENT UI PERSONALIZZATE.
Claudio Rocchini, Visual Computing Group
Transcript della presentazione:

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni1 Costruzione di Interfacce Lezione 25 anatomia di uno screen saver

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni2 Uno screen saver deve fare almeno Screensaver Preview Dialogo di config Quale di queste tre cose deve fare è deciso in base alla command line con cui è invocato. /c dialogo config /p preview come finestra figlia di /s screen saver

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni3 InitInstance Per questo motivo aggiungiamo alla WinApp le seguenti funzioni void DoSaverSetting(void); void DoSaverPreview(void); void DoScreenSaver(void); void ReadSetting() La initinstance deve parsare la commandline e decidere cosa far partire Il parsing della command line va fatto abbastanza robusto (puo arrivare varie cose…)

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni4 InitInstace: Parsing BOOL CCISaverApp::InitInstance() { InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); int pos=0; CString tok=m_lpCmdLine.Tokenize(" :",pos); if(!tok.CompareNoCase("/s") || !tok.CompareNoCase("-s") || !tok.CompareNoCase("s")) { DoScreenSaver(); // Run as screen saver return TRUE; // and continue the message loop } else if ( !tok.CompareNoCase("/c") || !tok.CompareNoCase("-c") || !tok.CompareNoCase("c")) { DoSaverSetting(); // Run modal config dialog return FALSE; // and Now just terminate } else if ( !tok.CompareNoCase("/p") || !tok.CompareNoCase("-p") || !tok.CompareNoCase("p") ){ DoSaverPreview(); // Show the saver in a small win return TRUE; // and continue the message loop } return FALSE; // if no param terminate; }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni5 Strutturazione classi Ci servono due classi Una che sappia crearsi in maniera abbastanza flessibile, abbia un contesto opengl e sappia disegnare lo screen saver Una che sia capace di chiudersi non appena lutente fa qualcosa Deriveremo la seconda dalla prima. CGLWnd derivata da CWnd; CSaverWnd derivata da CGLWnd

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni6 CGLWnd Facciamo aggiungere allide una classe mfc derivata da cwnd Come membri al solito mettiamo HGLRC m_hRC; // Rendering device context of OpenGL HDC m_hDC; // Current device context float aspect; BOOL SetupPixelFormat( HDC hDC ); void glInit(); inline BOOL SetGL() Presi dal solito file txt…

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni7 CGLWnd Dobbiamo rifare la create, per poter rispondere alle varie necessità di creazione. BOOL CGLWnd::myCreate(DWORD dwExStyle, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) { TRACE("CGLWnd::myCreate\n"); // Register a class with no cursor LPCTSTR lpszClassName= AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW, ::LoadCursor( AfxGetResourceHandle(), MAKEINTRESOURCE(IDC_NULL_CURSOR) ) ); return CreateEx(dwExStyle, lpszClassName, _T(""), dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, pParentWnd->GetSafeHwnd(), NULL, NULL ); }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni8 Window Classes Una window class è un insieme di attributi che il sistema usa come template per creare una finestra. Ogni finestra è membro di una window class Tutte le window class sono specifiche di un processo Ogni window class ha una procedura associata che processa i messaggi di tutte le finestre di quella classe Un processo deve registrare una window class prima di poter creare una finestra di quella classe Registrare una window class associa una window procedure, uninsieme di stili, ecc ad un nome.

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni9 Cursore nullo Nella finestra dello screen saver non ci deve essere il cursore quindi Creare una risorsa con un cursore vuoto Usarla nella creazione della window class

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni10 Timer Il nostro screen saver non puousare il meccanismo della onidle per lanimazione perchè quando è invocato nel preview non ho accesso al thread iniziale. Quindi si usano timer… Aggiungiamo tra i membri BOOL m_bHasTimer; //flag for timer in this child window

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni11 OnCreate Overridiamo anche la OnCreate, dove facciamo tutte le init di gl e del timer int CGLWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; m_hDC = ::GetDC(m_hWnd); SetupPixelFormat(m_hDC); m_hRC = wglCreateContext(m_hDC); if(m_hRC==NULL){AfxMessageBox("OpenGL contest fail"); return -1; } if(!m_bHasTimer){//set timer SetTimer(1, 10, NULL); m_bHasTimer = TRUE; } Invalidate(); return 0; }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni12 OnSize La solita void CGLWnd::OnSize(UINT nType, int cx, int cy) { TRACE("CGLWnd::OnSize()\n"); CRect rect; if(SetGL()){ glMatrixMode (GL_PROJECTION); glLoadIdentity (); aspect=(float)cx/(float)cy; glViewport (0, 0, (GLsizei) cx, (GLsizei) cy); }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni13 OnPaint OnDraw è propria delle viste, qui siamo un po`più a basso livello. Si disegna nella onpaint. void CGLWnd::OnPaint() { CPaintDC dc(this); // device context for painting SetGL(); glPushMatrix(); glRotatef(30*clock()/1000.0f,0,0,1); glClearColor(.4,.3,.3,1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1); glBegin(GL_LINE_LOOP); glVertex2f(.3f,-.3f);glVertex2f(-.3f,-.3f); glVertex2f(-.3f,.3f);glVertex2f(.3f,.3f); glEnd(); glPopMatrix(); SwapBuffers(m_hDC); }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni14 CSaverWnd Passiamo ora a scrivere la classe che deve incapsulare il fatto che la nostra finestra opengl Parte massimizzata Non appena lutente fa qualcosa si distrugge Deriviamo CSaverWnd da CGLWnd E riscriviamo la Create

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni15 Crea la finestra grande quanto lo schermo, senza decorazioni, che stia sopra alle altre BOOL CSaverWnd::Create() { TRACE("CSaverWnd::Create()\n"); CRect rect(0, 0, ::GetSystemMetrics(SM_CXSCREEN), ::GetSystemMetrics(SM_CYSCREEN) ); return CGLWnd::myCreate(WS_EX_TOPMOST, WS_VISIBLE|WS_POPUP, rect, NULL, 0); }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni16 Messaggi da intercettare Per far terminare lo screen saver: OnActivate OnActivateApp OnKeyDown On{L/M/R}ButtonDown OnMouseMove OnSysKeyDown In risposta ai quali basta fare:

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni17 Altri messaggi void CSaverWnd::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID == SC_SCREENSAVE) || (nID == SC_CLOSE))return; CGLWnd::OnSysCommand(nID, lParam); } void CSaverWnd::OnDestroy(){ PostQuitMessage(0); CGLWnd::OnDestroy(); } BOOL CSaverWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){ SetCursor(NULL); return TRUE; // per notificare che abbiamo gestito noi il messaggio }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni18 Lapp Si deve ora scrivere le funzioni che fanno partire tutto. void CCISaverApp::DoScreenSaver(void) { TRACE("CCISaverApp::DoScreenSaver()\n"); m_psvwnd = new CSaverWnd; ReadSetting(); m_psvwnd->Create(); m_pMainWnd = m_psvwnd; TRACE("exiting CCISaverApp::DoScreenSaver(void)\n"); }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni19 Gestione della preview void CCISaverApp::DoSaverPreview(void) { CString tok,cmdln=m_lpCmdLine; int pos=0; tok=cmdln.Tokenize(" ",pos); TRACE("Second token in command line is '%s'\n",tok); CWnd* pParent = CWnd::FromHandle((HWND)atol(tok)); ASSERT(pParent != NULL); CGLWnd* pWnd = new CGLWnd(); ReadSetting(); CRect rect; pParent->GetClientRect(&rect); pWnd->myCreate(NULL, WS_VISIBLE|WS_CHILD, rect, pParent,0); m_pMainWnd = pWnd; }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni20 Preview nel dialogo Settings Nel dialogo della classe CISaverDlg aggiungiamo una finestra di preview. Aggiungiamo un membro CGLWnd m_glwnd; Nelle risorse, nel template del dialog aggiungere uno static text control della dimensione che ci interessa con id IDC_IMAGE Nella OnInitDialog aggiungiamo: CRect rect; GetDlgItem(IDC_IMAGE)->GetWindowRect(&rect); ScreenToClient(&rect); m_glwnd.myCreate(WS_EX_TOPMOST, WS_VISIBLE|WS_CHILD, rect, this, IDC_IMAGE);

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni21 un po di interfaccia… Mettiamo nel dialogo una variabile CString m_filename associata all ledit control lhandler della pressione del bottone.. void CCISaverDlg::OnBnClickedButtonBrowse() { CFileDialog fd(true,"*.txt","test.txt"); if(fd.DoModal()==IDOK) { m_filename=fd.GetFileName(); UpdateData(false); }; }

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni22 Note finali Per mettere lestensione a *.scr basta modificare le opzioni del linker Per la stringa che si vede nella descrizione degli screen saver basta fare una risorsa stringa IDS_DESCRIPTION di valore 1

6 Dicembre 2002Costruzione di Interfacce - Paolo Cignoni23 Salvare setting Di solito si usa il registro Conviene chiudere tutto in una classe e tenuta in winapp e passarla alla dialog. In CWinApp BOOL WriteProfileInt( sezione, entry, val); BOOL WriteProfileString( sezione, entry, str); Bool GetProfileString( sezione, entry, default,buf,sizebuf) Int GetProfileInt (sezione, entry, default);