Introduzione MFC. CWinApp. CWinApp. Costruzione di Interfacce Lezione 16 Primi passi MFC. cignoni@iei.pi.cnr.it http://vcg.iei.pi.cnr.



Documenti analoghi
Registratori di Cassa

Menu. Menu. Risorse in linea. MFC framework. Il framework Document View. Costruzione di Interfacce Lezione 17 Primi passi MFC 2

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014)

Guida all uso di Java Diagrammi ER

PROCEDURE GENERALI ATTIVAZIONE MACRO

La prima applicazione Java. Creazione di oggetti - 1. La prima applicazione Java: schema di esecuzione. Gianpaolo Cugola - Sistemi Informativi in Rete

Gestione Risorse Umane Web

Come usare P-touch Transfer Manager

MANUALE D USO DELLA PIATTAFORMA ITCMS

Access. P a r t e p r i m a

La struttura dati ad albero binario

Presentation Draw. Guida dell utilizzatore

Guida all utilizzo del compilatore lcc-win32 per creare una applicazione console

Programmazione a Oggetti Lezione 10. Ereditarieta

MOCA. Modulo Candidatura. [Manuale versione 1.0 marzo 2013]

Cosa è un foglio elettronico

Guida. Macchina Scratch

DATA BASE ON LINE (BANCA DATI MODULI SPERIMENTALI)

MANUALE PORTALE UTENTE IMPRENDITORE

Il web server Apache Lezione n. 3. Introduzione

Capitolo 4 Pianificazione e Sviluppo di Web Part

dall argomento argomento della malloc()

Il compilatore Dev-C++

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Tutorial sugli ambienti di sviluppo: Eclipse e NetBeans

Java Virtual Machine

POSTECERT POST CERTIFICATA GUIDA ALL USO DELLA WEBMAIL

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

Modulo 4: Ereditarietà, interfacce e clonazione

CdL in Medicina Veterinaria - STPA AA

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

Funzioni. Il modello console. Interfaccia in modalità console

Approccio stratificato

STRUMENTI DI PRESENTAZIONE MODULO 6

Identificare le diverse parti di una finestra: barra del titolo, barra dei menu, barra degli strumenti, barra di stato, barra di scorrimento.

Esercizi su. Funzioni

Access. Microsoft Access. Aprire Access. Aprire Access. Aprire un database. Creare un nuovo database

Antonio Guerrieri UTILIZZO DEL COMPUTER E GESTIONE DEI FILE IN MS WINDOWS

Cominciamo dalla barra multifunzione, ossia la struttura a schede che ha sostituito la barra dei menu e la barra delle icone (Figura 1).

Introduzione al sistema operativo Il file system: file, directory,...

FAQ DI INSTALLAZIONE DI INAZIENDA Rev.2

Java: Compilatore e Interprete

GUARINI PATRIMONIO CULTURALE VERSIONE MSDE/SQL SERVER MANUALE DI INSTALLAZIONE GUARINI PATRIMONIO CULTURALE VERSIONE MSDE/SQL SERVER

Il calendario di Windows Vista

I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte.

Introduzione a Dev-C++

Creare e ripristinare immagine di sistema con Windows 8

Tricks & Tips. [Access] Tutorial - ActiveX - Controllo Tree View. - Michele de Nittis - Versione: 1 Data Versione: venerdì 30 agosto 2002

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Fondamenti di Informatica T-1 CdS Ingegneria Informatica a.a. 2011/2012. Introduzione a Visual Studio 2005/2008/2010

Sistema operativo: Gestione della memoria

Cos'é Code::Blocks? Come Creare un progetto Come eseguire un programma Risoluzione problemi istallazione Code::Blocks Che cos è il Debug e come si usa

P.C.T. Il Processo Civile Telematico Guida operativa all utilizzo del sistema GEO-C.T.U. (GEOWEB-LEXTEL) Versione 28 Giugno 2014 Release 2.0.

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

COMUNI-CHIAMO S.R.L. Via San Martino n. 26/1- Monte San Pietro P.IVA, C.F. e numero di iscrizione alla Camera di Commercio di Bologna

Progettaz. e sviluppo Data Base

FPf per Windows 3.1. Guida all uso

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Compilatore risorse display grafico LCD serie IEC-line

Funzioni in C. Violetta Lonati

ISTRUZIONI PER LA GESTIONE BUDGET

L analisi dei dati. Capitolo Il foglio elettronico

QG Gestione Assenze. Inserimento per Classe. Per la gestione delle assenze accedere dal Menu Giornaliere->Assenze e Giustificazioni

Manuale d uso Software di parcellazione per commercialisti Ver [05/01/2015]

MANUALE PARCELLA FACILE PLUS INDICE

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

ProgettAzione V anno Unità 3 - Architetture per applicazioni web Lezione: Esempio sviluppo applicazioni

ISTR Uso del Windows Messenger

Impostare il browser per navigare in sicurezza Opzioni di protezione

Presentazione della pratica online

BDX 3D-EDITOR (autore: Marco Bedulli) Scopo del software. Caratteristiche fondamentali. Linguaggi utilizzati. Navigazione 3D

PowerPoint 2007 Le funzioni

Dispensa di database Access

Biblioteca di Cervia NOZIONI BASE DI INFORMATICA

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Stampe in rete Implementazione corretta

Agenzia delle entrate on line. A cosa serve?

I TUTOR. Massimiliano Cattafi Ilaria Laurenti

MANUALE UTENTE Fiscali Free

File, Modifica, Visualizza, Strumenti, Messaggio

CAPITOLO 1 PREREQUISITI DI INSTALLAZIONE SOFTWARE RICAMBI CAPITOLO 2 PROCEDURA

Guida operativa. My Legal Corner. BestSoft SOFTWARE IN SANITÀ

Iniziativa Comunitaria Equal II Fase IT G2 CAM Futuro Remoto. Esercitazione. Creazione di Diagrammi di Gantt con Win Project

Il calcolatore - Applicazioni

Digital Persona Client/Server

Classificazione: DI PUBBLICO DOMINIO. LOMBARDIA INFORMATICA S.p.A.

MAGAZZINO FISCALE (agg. alla rel )

Definire gli attributi dei blocchi

Corso di Informatica

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Corso su LINQ Lezione 16. Introduzione

Servizi Remoti. Servizi Remoti. TeamPortal Servizi Remoti

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

Alla scoperta della nuova interfaccia di Office 2010

Portale Agenti Sambonet Paderno Industrie Pagina : 1 MANUALE PORTALE AGENTI

Transcript:

Introduzione Costruzione di Interfacce Lezione 16 Primi passi MFC cignoni@iei.pi.cnr.it http://vcg.iei.pi.cnr.it/~cignoni Microsoft Foundation Class Library (MFC) è un application framework per scrivere applicazioni per Windows. Le MFC sono implementate come un insieme di classi C++, molte delle quali rappresentano oggetti comuni come documenti, finestre, dialog box ecc. Come tutti i framework per programmare sotto windows nasconde bene come funziona davvero windows. 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 2 MFC Le MFC mettono a disposizione varie classi per rappresentare la struttura di una applicazione: Concetti fondamentali rappresentati tramite oggetti applicazione finestra documento vista Un applicazione è un istanza di un oggetto. 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 3 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 4 CWinApp La CWinApp class è la classe base da cui si deriva la classe per rappresentare un applicazione. Si definiscono funzioni membro per inizializzare la propria applicazione (ed ogni sua istanza) e per i vari compiti propri dell applicazione. CWinApp La classe CWinApp incapsula, l inizializzazione, l esecuzione e la terminazione di un applicazione in ambiente Windows Un applicazione deve avere uno (ed un solo) oggetto di una classe derivata da CWinApp (application object) Un application object ha membri per inizializzare e far girare l applicazione stessa L oggetto è costruito prima che le finestre dell app. vengano create. 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 5 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 6 1

Note storiche: WinMain Sequenza di esecuzione di un generico programma windows a basso livello Quando parte un applicazione windows l entry point è una funzione chiamata winmain, (equivalente del main di un programma c, o c++ in un ambiente windows console) int WINAPI WinMain( HINSTANCE hinstance, // handle to current instance HINSTANCE hprevinstance, // handle to previous instance (ora sempre 0) LPSTR lpcmdline, // command line int ncmdshow // show state ); WinMain dovrebbe inizializzare l applicazione, mostrare la finestra principale ed entrare nel ciclo principale (main loop) di raccolta/smistamento dei messaggi del s.o. che continua in eterno finchè non arriva un messaggio WM_QUIT Note storiche: Handle in pratica sono O puntatori O offset relativo ad una qualche tabella del sistema operativo, Aggiungono un livello di indirezione per accedere a vari oggetti in qualche modo relati al s.o. Di solito le variabili che sono handle a qualcosa iniziano sempre per H (hwnd, hbrush ecc) Note: Tutta colpa di windows30 Una bella spiegazione (utile soprattutto per i curiosi) la trovate sull help di dot.net cercando Give Me a Handle, and I'll Show You an Object (del 1993!) 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 7 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 8 Note storiche: Messaggi La gestione degli eventi da parte di un applicazione è fatta tramite messaggi: Ogni finestra ha, obbligatoriamente, una callback che serve a gestire i messaggi a lei diretti Il loop classico di un app win è quindi qualcosa del tipo: while( GetMessage( &msg, NULL, 0, 0 ) ) { DispatchMessage( &msg ); Dove GetMessage prende un messaggio dalla coda e DispatchMessage lo manda alla callback della finestra giusta Note storiche: multitasking Perchè i programmi di windows hanno questa #@$%# struttura? Cooperative multitasking, I processi devono accettare di smettere di lavorare Se un programma si pianta mentre processa un messaggio si pianta tutto windows In windows 3.0 le app windows erano ancora tutte cooperative multitasking (quelle dos ovviamente no, facevano preemptive mt) Windows 3.0 (95/98/Me) VS nt (2k XP) Per saperne di più cercate nell help happy anniversary windows 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 9 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 10 CWinApp In pratica fa partire in winmain e chiama: CWinApp.InitInstance() CWinApp.Run() Main loop messaggi CWinApp.OnIdle E in risposta ad un messaggio WM_QUIT chiamerà CWinApp.ExitInstance() Queste funzioni di CWinApp sono ovviamente virtual e overridabili (InitInstance deve essere overridden) 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 11 CWinApp InitInstance Scopo inizializzare l applicazione Una delle cose che si può fare a questo livello è creare la finestra principale dell applicazione Nella maggior parte dei casi questo verrà fatto automaticamente dal framework o dai wizard Uno dei membri di tale classe è CWnd* m_pmainwnd; Dovremo creare un oggetto derivato da CWnd e attaccarcelo 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 12 2

CWnd Classe di base per la rappresentazione di generiche finestre Da questa classe sono derivate sottoclassi per i più comuni tipi di finestre: Frame Window, Dialog, Views, Buttons CFrameWnd Classe Derivata da CWnd Fornisce le funzionalità e i membri per la gestione di una frame window (finestra con barra per il titolo, bottoni di chiusura, minimiz., maxim., bordo per il resize ecc.) Di solito si deriva una classe da CFrameWnd e vi si aggiunge variabili membro per mantenere dati specifici alla propria applicazione 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 13 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 14 Hello World con le MFC Due classi in gioco, finestra e applicazione Derivare la classe CHelloWnd da CFrameWnd Derivare la classe CHelloApp da CWinApp Definire una nuova funzione di inizializzazione per l applicazione che crei, mostri e faccia aggiornare la finestra. Dichiarare un istanza di un CHelloApp La minima applicazione #include <afxwin.h> // Define a window class derived from CFrameWnd class CHelloWindow : public CFrameWnd { public: CHelloWindow(){ Create(NULL,"Hello World!",WS_OVERLAPPEDWINDOW, rectdefault); ; // Define an application class derived from CWinApp class CHelloApp : public CWinApp{ public: virtual BOOL InitInstance(); ; // Construct the CHelloApp's m_pmainwnd data member BOOL CHelloApp::InitInstance(){ m_pmainwnd = new CHelloWindow(); m_pmainwnd->showwindow(m_ncmdshow); m_pmainwnd->updatewindow(); return TRUE; // HelloApp's constructor initializes and runs the app CHelloApp HelloApp; 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 15 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 16 Header precompilati Servono essenzialmente per velocizzare la compilazione di header enormi Stdafx.h Contiene tutti gli include di sistema standard e un bel po di #define utili Stdafx.cpp Necessario per fare gli header precompilati Contiene solo la riga #include Stdafx.h La davvero minima applicazione #include <afxwin.h> // Define an application class derived from CWinApp class CHelloApp : public CWinApp{ public: virtual BOOL InitInstance(); ; // Construct the CHelloApp's m_pmainwnd data member BOOL CHelloApp::InitInstance(){ m_pmainwnd = new CFrameWnd(); ((CFrameWnd *)m_pmainwnd)->create(null,"hello World!",WS_OVERLAPPEDWINDOW); m_pmainwnd->showwindow(m_ncmdshow); m_pmainwnd->updatewindow(); return TRUE; // HelloApp's constructor initializes and runs the app CHelloApp HelloApp; 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 17 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 18 3

Hello World 2 L esempio precedente era minimo Aggiungiamo: La stringa Hello World nel centro della finestra Una finestra di dialogo di about Hello World 2 Ancora una volta deriviamo due classi Una per l applicazione CHelloApp una per la finestra CHelloWindows La scritta nel mezzo della finestra deve essere disegnata dall applicazione: Gestione del messaggio ON_WM_PAINT Ecco perchè ci serviva derivare da cframewnd 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 19 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 20 Gestione Messaggi Filosofia di fondo: Il sistema avvisa l applicazione che è successo qualcosa mandandogli un messaggio l applicazione deve gestire i messaggi Le MFC incapsulano il meccanismo di base della gestione dei messaggi di Windows con una serie di MACRO MFC (Visual C++) e Messaggi Nella dichiarazione della classe afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() Nel file dove sono definiti i membri BEGIN_MESSAGE_MAP( CHelloWindow, CFrameWnd ) ON_WM_PAINT() END_MESSAGE_MAP() Tutte queste macro sono gestite bene dall ide del.net 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 21 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 22 Device Context Un device context è una struttura di Windows che contiene informazioni sulle proprietà e attributi di un device (e.g. schermo, stampante) Tutte le operazioni di disegno sono fatte attraverso un device context. I Device context permettono di disegnare in maniera deviceindependent sullo schermo, sulla stampante o su di un metafile. Se si vuole opengl occorre gestire anche i rendering context di OpenGL MFC e Device Context Esiste una classe generale delle mfc CDC e varie sottoclassi tipo CPaintDC o CClientDC L oggetto CDC fornisce funzioni membro per lavorare con un device context come la stampante, lo schermo o il display context associato con la client area di una finestra Tutte le operzioni di disegno devono essere fatte attraverso funzioni membro di un CDC 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 23 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 24 4

Scrivere in un CDC In risposta alla richiesta di ridisegnare la finestra si chiama la OnPaint() void CHelloWindow::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; GetClientRect(rect); dc.settextalign(ta_baseline TA_CENTER); dc.textout(rect.right/2,rect.bottom/2, Hello World"); Cambiamo font Nei DC ci sono una serie di oggetti correnti tra cui Font Brush Pen Sono usati per le varie operazioni di disegno Sono oggetti che vanno creati, e distrutti (volendo). 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 25 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 26 Hello World 3 CPaintDC dc(this); // device context for painting CFont font; VERIFY(font.CreatePointFont(720, "Comic sans MS", &dc)); CRect rect; GetClientRect(rect); // Do something with the font just created... CFont* def_font = dc.selectobject(&font); dc.settextalign(ta_baseline TA_CENTER); dc.textout(rect.right/2,rect.bottom/2, "Hello World"); dc.selectobject(def_font); L esempio precedente era minimo Aggiungiamo: Una finestra di dialogo di about Entrano in gioco le RISORSE // Done with the font. Delete the font object. font.deleteobject(); 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 27 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 28 Resource Files Le risorse (resource files) sono i dati (binari o ascii) che un compilatore di risorse o lo sviluppatore aggiungono al file eseguibile di una applicazione Risorse standard descrivono icone, cursori, bitmap, dialog box, fonts, testo di messaggi, ecc. Risorse definite dall applicazione possono contenere qualsiasi dato richiesto da una specifica applicazione. Ogni risorsa è associata ad un unico numero. Risorse e Visual C++ Il visual c++ mette a disposizione tool per la creazione e l integrazione di risorse in un applicazione. Oltre alla dialog box aggiungiamo le seguenti risorse: menu accellerator 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 29 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 30 5

Risorse Due file HelloMfc.rc Contiene effettivamente un po dei dati delle varie risorse (dialoghi ecc). Resource.h #define che servono per riferire poi le varie risorse Di solito deve essere incluso da tutti i file del progetto Tutte gestite in maniera ragionevole dall ide Di solito. In realtà dentro resource.h vengono anche nascosti dati dell IDE Dialog Box Sono definiti nelle risorse Ad ogni dialogo si associa una classe che lo gestisce. Per far vedere un dialogo si deve creare un oggetto di quel tipo e poi farlo partire Il modo più semplice per invocare un dialogo è quello di farlo modale: L applicazione che lo ha invocato è fermata (ragionevolment) finchè non si preme ok o cancel. CAboutDlg dlgabout; dlgabout.domodal(); 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 31 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 32 Conclusione L esempio visto oggi è semplicissimo, ma ha il difetto di non rientrare in nessuno degli standard di applicazione mfc (dialog based e document/view) Nessun wizard ci fa il setup dell applicazione da zero Alcune delle feature del IDE non funzionano benissimo Le app standard si integrano meglio nell ide ma sono VERBOSE. 13 Nov 2002 Costruzione di Interfacce - Paolo Cignoni 33 6