Corso di Visual C++

Le modalità di mappatura I

 

Finora, nelle nostre funzioni di disegno, come unità di misura abbiamo utilizzato i pixel ( o punti video ).

Quando utilizziamo questa unità di misura diciamo che utilizziamo la modalità di mappatura di default chiamata MM_TEXT, in questo caso particolare diciamo anche che lavoriamo in coordinate di dispositivo.

Ad esempio nell'istruzione pDC->Rectangle ( CRect(0,0,100,100) ) disegniamo un quadrato sullo schermo di lato 100 unità e con l'angolo superiore sinistro nell'origine del sistema di coordinate ( coincidente con l'angolo in alto a sinistra del monitor ).

Questa modalità di mappatura se può risultare sufficiente per l'output su schermo non lo è affatto per l'output su altri dispositivi come plotter o stampanti. Infatti il quadrato di 100x100 avrà dimensioni differenti se visualizzato su un video a 640x480, su uno a 1280x1024, su una stampante ad aghi a 180 dpi o su una laser a 600 dpi.

 

Per ovviare a questo problema sarebbe molto comodo poter utilizzare un sistema di misura reale come ad esempio quello metrico o quello anglosassone in pollici. In effetti esistono delle modalità di mappatura che permettono ciò e queste si dividono in due categorie principali: quelle a scala fissa e quelle a scala variabile.

Le modalità di mappatura a scala fissa hanno come comune denominatore l'orientamento degli assi cartesiani: i valori positivi delle X sono verso destra e quelli delle Y verso l'alto, l'origine è posizionata di default nell'angolo superiore sinistro. Il fatto che i valori delle Y crescano verso l'alto significa che, se non si modifica la posizione dell'origine, gli oggetti visibili sullo schermo hanno tutti coordinate Y negative.

Ciò che distingue le modalità di mappatura a scala fissa è solo il fattore di scala, vediamoli:

Modalità di mappatura

Unità logica

MM_LOENGLISH

0,01 pollici

MM_HIENGLISH

0,001 pollici

MM_LOMETRIC

0,1 millimetri

MM_HIMETRIC

0,01 millimetri

MM_TWIPS

1/1440 pollici

La modalità MM_TWIPS viene per lo più utilizzata per avere un controllo preciso e immediato dell'output su stampante; un'unità twip è infatti 1/20 di punto ( un punto è 1/72 di pollice ) e i punti in tipografia sono le unità di default per i caratteri. Ad esempio l'altezza di un carattere di 10 punti è 10x20 = 200 twip.

È importante ora fare una importante distinzione tra i tipi di coordinate per non finire in futuro in errori di difficile interpretazione e correzione. I tipi di coordinate sono tre: di dispositivo, logiche e fisiche.

Le coordinate di dispositivo sono quelle realmente utilizzate per l'output finale su schermo, dopo aver effettuato tutte le dovute conversioni dagli altri sistemi. Un punto in coordinate di dispositive equivale esattamente ad un pixel della scheda video e l'origine del sistema è posizionato in alto a sinistra e i versi delle X e delle Y sono positivi rispettivamente verso destra e verso il basso.

Noi utilizzeremo molto spesso anche le coordinate di dispositivo perché sebbene le coordinate passate alle funzioni CDC siano sempre logiche, quelle passate per definire oggetti CWnd, CRect ed altri non lo sono.

Un caso particolare si ha però quando viene utilizzata la modalità di mappatura MM_TEXT; in questo caso un punto logico equivale ad un punto di dispositivo, inoltre anche gli assi di riferimento hanno lo stesso orientamento. Per di più nel caso in cui non si sposti l'origine del sistema di riferimento si ha che i due sistemi di riferimento sono del tutto ambivalenti.

Le coordinate logiche sono quelle utilizzate nelle varie modalità di mappatura e sono quelle passate a molte funzioni di disegno.

CDC mette a disposizione funzioni per la conversione da logico a dispositivo ( CDC::DptoLP ) e viceversa da dispositivo a logico ( CDC::LPtoDP ).

Le coordinate fisiche sono quelle che l'utente utilizza nel programma. Infatti a nessuno interessa sapere a quante unità MM_LOMETRIC o MM_HIMETRIC corrisponde un cerchio di raggio 3 cm! Egli semplicemente vuole il cerchio da 3 cm., e sono poi fatti nostri disegnarglielo correttamente!.

La conversione tra coordinate fisiche e logiche deve avvenire manualmente, ma è semplicissima: ad esempio 10 cm in MM_LOMETRIC sono 1000 unità logiche, mentre in MM_HIENGLISH sono circa 3937 unità logiche.

Nella prossima parte continueremo a parlare delle modalità di mappatura ed esamineremo quelle a scala variabile.

Se intanto volete iniziare a fare degli esperimenti, sappiate che la modalità di mapping può essere cambiate tramite la funzione SetMapMode di CDC. Cercate anche di studiare dall'MSDN le funzioni SetWindowExt e SetViewportExt di cui parleremo nella prossima puntata.

 

Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet