Carti la Retele Petri
Сети Петри в моделировании и управлении [А.А. Лескин] Содержание
Haas P. Stochastic Petri nets. Modelling, stability, simulation(Springer,2002)
Сети Петри (Котов)
Retele Petri - Kotov V.E. - Download
Cuprins:
Предисловие
ОСНОВНЫЕ ПОНЯТИЯ
§ 1.1. Системы, процессы, сети
§ 1.2. Формальное определение сети Петри
СВОЙСТВА СЕТЕЙ ПЕТРИ И ИХ АНАЛИЗ
§ 2.1. Основные свойства сетей Петри
§ 2.2. Проблемы ограниченности и безопасности
§ 2.3. Проблемы Я-вкпючения и Д-эквивапентности
§ 2.4. Проблемы достижимости и живости
ЯЗЫКИ СЕТЕЙ ПЕТРИ
§ 3.1. Помеченные сети и классы языков сетей Петри
§ 3.2. Характеризация классов языков сетей Петри
§ 3.3. Разрешимые и неразрешимые свойства языков сетей Петри
ПОДКЛАССЫ СЕТЕЙ ПЕТРИ
§ 4.1. Ординарные сети Петри § 4.2. Автоматные сети и синхронизационные графы
§ 4.3. СвободныеЧ:ети
ОБОБЩЕНИЯ СЕТЕЙ ПЕТРИ
§ 5.1. Счетч и новые автоматы
§ 5.2. Ингибиторные сети и сети с приоритетами
§ 5.3. Раскрашенные, синхронные и самомодифицируемые сети
РЕГУЛЯРНЫЕ И ИЕРАРХИЧЕСКИЕ СЕТИ
§ 6.1. Алгебра регулярных сетей
§ 6.2. Некоторые свойства регулярных сетей
§ 6.3. Иерархические сети
§ 6.4. Сравнение иерархических сетей с другими классами сетей
§ 6.5. Сети с ожиданием и строго иерархические сети
СЕТИ-СИСТЕМЫ И СЕТИ-ПРОЦЕССЫ
§ 7.1. Процессы
§ 7.2. Сетевое представление параллельных процессов
§ 7.3. Сетевое представление последовательно-альтернативных процессов
§ 7.4. Сетевое представление параллельно-альтернативных процессов
§ 7.5. Развертка сетей Петри в сети-процессы
§ 7.6. Сетевое представление параллельных процессов с конкуренцией
СЕТИ ПЕТРИ И ПРОГРАММИРОВАНИЕ
§ 8.1. Сети Петри и семантика структур управления
§ 8.2. Потоковые сети
§ 8.3. Типы управления § 8.4. Петри-машина
Заключение
Литература
Словарь терминов
Structura lexicală a limbajului Java
Setul de caractere
Limbajului Java lucrează în mod nativ folosind setul de caractere Unicode. Acesta este un standard internaţional care înlocuieşte vechiul set de caractere ASCII şi care foloseşte pentru reprezentarea caracterelor 2 octeţi, ceea ce înseamnă că se pot reprezenta 65536 de semne, spre deosebire de ASCII, unde era posibilă reprezentarea a doar 256 de caractere. Primele 256 caractere Unicode corespund celor ASCII, referirea la celelalte făcându-se prin \uxxxx, unde xxxx reprezintă codul caracterului.
O altă caracteristică a setului de caractere Unicode este faptul că întreg intervalul de reprezentare a simbolurilor este divizat în subintervale numite blocuri, câteva exemple de blocuri fiind: Basic Latin, Greek, Arabic, Gothic, Currency, Mathematical, Arrows, Musical, etc.
Mai jos sunt oferite câteva exemple de caractere Unicode.
• \u0030 - \u0039 : cifre ISO-Latin 0-9
• \u0660 - \u0669 : cifre arabic-indic 0-9
• \u03B1 - \u03C9 : simboluri greceşti a — ui
• \u2200 - \u22FF : simboluri matematice (V, 3,0, etc.)
• \u4e00 - \u9ff f : litere din alfabetul Han (Chinez, Japonez, Coreean)
Mai multe informaţii legate de reprezentarea Unicode pot fi obţinute la adresa ”http://www.unicode.org”.
Cuvinte cheie
Cuvintele rezervate în Java sunt, cu câteva excepţii, cele din C++ şi au fost enumerate în tabelul de mai jos. Acestea nu pot fi folosite ca nume de clase, interfeţe, variabile sau metode. true, false, null nu sunt cuvinte cheie, dar nu pot fi nici ele folosite ca nume în aplicaţii. Cuvintele marcate prin * sunt rezervate, dar nu sunt folosite.
|
abstract |
double |
int |
strictfp |
Incepând cu versiunea 1.5, mai există şi cuvântul cheie enum.
Identificatori
Sunt secvenţe nelimitate de litere şi cifre Unicode, începând cu o literă. După cum am mai spus, identificatorii nu au voie să fie identici cu cuvintele rezervate.
Literali
Literalii pot fi de următoarele tipuri:
Intregi
Sunt acceptate 3 baze de numeraţie : baza 10, baza 16 (încep cu caracterele 0x) şi baza 8 (încep cu cifra 0) şi pot fi de două tipuri:
– normali - se reprezintă pe 4 octeţi (32 biţi)
– lungi - se reprezintă pe 8 octeţi (64 biţi) şi se termină cu caracterul L (sau l).
Flotanţi
Pentru ca un literal să fie considerat flotant el trebuie să aibă cel puţin o zecimală după virgulă, să fie în notaţie exponenţială sau să aibă sufixul F sau f pentru valorile normale - reprezentate pe 32 biţi, respectiv D sau d pentru valorile duble - reprezentate pe 64 biţi. Exemple: 1.0, 2e2, 3f, 4D.
Logici
Sunt reprezentaţi de true - valoarea logică de adevăr, respectiv false - valoarea logică de fals.
Atenţie
Spre deosebire de C++, literalii întregi 1 şi 0 nu mai au semnificaţia de adevărat, respectiv fals.
Caracter
Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode. Reprezentarea se face fie folosind o literă, fie o secvenţă escape scrisă între apostrofuri. Secvenţele escape permit specificarea caracterelor care nu au reprezentare grafică şi reprezentarea unor caractere speciale precum backslash, apostrof, etc. Secvenţele escape pre-definite în Java sunt:
– ’ \b’ : Backspace (BS)
– ’ \t’ : Tab orizontal (HT)
– ’ \n’ : Linie nouă (LF)
– ’\f : Pagină nouă (FF)
– ’ \r’ : Inceput de rând (CR)
– ’\"’ : Ghilimele
– ’ \’’ : Apostrof
– ’ \\’ : Backslash
Siruri de caractere
Un literal şir de caractere este format din zero sau mai multe caractere între ghilimele. Caracterele care formează şirul pot fi caractere grafice sau secvenţe escape.
Dacă şirul este prea lung el poate fi scris ca o concatenare de subşiruri de dimensiune mai mică, concatenarea şirurilor realizându-se cu operatorul + , ca în exemplul: "Ana " + " are " + " mere ". Sirul vid este "".
După cum vom vedea, orice şir este de fapt o instanţă a clasei String, definită în pachetul java.lang.
Separatori
Un separator este un caracter care indică sfârşitul unei unităţi lexicale şi ınceputul alteia. In Java separatorii sunt următorii: ( ) [];,.. Instrucţiunile unui program se separă cu punct şi virgulă.
Operatori
Operatorii Java sunt, cu mici deosebiri, cei din C++:
• atribuirea: =
• operatori matematici: +, -, *, /, %, ++, — .
Este permisă notaţia prescurtată de forma lval op= rval: x += 2 n -= 3
Există operatori pentru autoincrementare şi autodecrementare (post şi pre): x++, ++x, n–, –n
Evaluarea expresiilor logice se face prin metoda scurtcircuitului: evaluarea se opreşte în momentul în care valoarea de adevăr a expresiei este sigur determinată.
• operatori logici: &&(and), ||(or), !(not)
• operatori relaţionali: <, <=, >, <=, ==, ! =
• operatori pe biţi: &(and), | (or), ^ (xor), ~ (not)
• operatori de translaţie: <<, >>, >>> (shift la dreapta fără semn)
• operatorul if-else: expresie-logica ? val-true : val-f alse
• operatorul , (virgulă) folosit pentru evaluarea secvenţială a operaţiilor: int x=0, y=1, z=2;
• operatorul + pentru concatenarea şirurilor:
String s1="Ana";
String s2="mere";
int x=10;
System.out.println(s1 + " are " + x + " " + s2);
• operatori pentru conversii (cast) : (tip-de-data)
int a = (int)’a’;
char c = (char)96;
int i = 200;
long l = (long)i; //widening conversion
long l2 = (long)200;
int i2 = (int)l2; //narrowing conversion
Comentarii
In Java există trei feluri de comentarii:
• Comentarii pe mai multe linii, închise între /* şi */.
• Comentarii pe mai multe linii care ţin de documentaţie, închise între /** şi */. Textul dintre cele două secvenţe este automat mutat în documentaţia aplicaţiei de către generatorul automat de documentaţie javadoc.
• Comentarii pe o singură linie, care incep cu //. Observaţii:
• Nu putem scrie comentarii în interiorul altor comentarii.
• Nu putem introduce comentarii în interiorul literalilor caracter sau şir de caractere.
• Secvenţele /* şi */ pot să apară pe o linie după secvenţa // dar îşi pierd semnificaţia. La fel se întamplă cu secvenţa // în comentarii care incep cu /* sau */.
Introducere in JAVA
Java este o tehnologie inovatoare lansata de compania Sun Microsystems în 1995, care a avut un impact remarcabil asupra întregii comunităţi a dezvoltatorilor de software, impunându-se prin calităţi deosebite cum ar fi simplitate, robusteţe şi nu în ultimul rând portabilitate. Denumită iniţial OAK, tehnologia Java este formată dintr-un limbaj de programare de nivel înalt pe baza căruia sunt construite o serie de platforme destinate implementării de aplicaţii pentru toate segmentele industriei software.
Limbajul de programare Java
Inainte de a prezenta în detaliu aspectele tehnice ale limbajului Java, să amintim caracteristicile sale principale, care l-au transformat într-un interval de timp atât de scurt într-una din cele mai pupulare opţiuni pentru dezvoltarea de aplicaţii, indiferent de domeniu sau de complexitatea lor.
· Simplitate - elimină supraîncărcarea operatorilor, moştenirea multiplă şi toate "facilităţile" ce pot provoca scrierea unui cod confuz.
· Uşurinţă în crearea de aplicaţii complexe ce folosesc programarea în reţea, fire de execuţie, interfaţă grafică, baze de date, etc.
· Robusteţe - elimină sursele frecvente de erori ce apar în programare prin renunţarea la pointeri, administrarea automată a memoriei şi eliminarea pierderilor de memorie printr-o procedură de colectare a obiectelor care nu mai sunt referite, ce rulează în fundal ("garbage collector").
· Complet orientat pe obiecte - elimină complet stilul de programare procedural.
· Securitate - este un limbaj de programare foarte sigur, furnizând mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamică a codului pentru detectarea secvenţelor periculoase, impunerea unor reguli stricte pentru rularea proceselor la distanţă, etc.
· Neutralitate arhitecturală - comportamentul unei aplicaţii Java nu depinde de arhitectura fizică a maşinii pe care rulează.
· Portabililtate - Java este un limbaj independent de platforma de lucru, aceeaşi aplicaţie rulând fără nici o modificare şi fără a necesita re-compilarea ei pe sisteme de operare diferite cum ar fi Windows, Linux, Mac OS, Solaris, etc. lucru care aduce economii substanţiale firmelor dezvoltatoare de aplicaţii.
· Este compilat şi interpretat, aceasta fiind soluţia eficientă pentru obţinerea portabilităţii.
· Performanţă - deşi mai lent decât limbajele de programare care generează executabile native pentru o anumită platformă de lucru, compilatorul Java asigură o performanţă ridicată a codului de octeţi, astfel încât viteza de lucru puţin mai scăzută nu va fi un impediment în dezvoltarea de aplicaţii oricât de complexe, inclusiv grafică 3D, animaţie, etc.
· Este modelat după C şi C++, trecerea de la C, C++ la Java făcându-se foarte uşor.
Platforme de lucru Java
Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii dedicate rezolvării unor probleme din cele mai diverse domenii. Aceste tehnologii au fost grupate în aşa numitele platforme de lucru, ce reprezintă seturi de librării scrise în limbajul Java, precum şi diverse programe utilitare, folosite pentru dezvoltarea de aplicaţii sau componente destinate unei anume categorii de utilizatori.
• J2SE (Standard Edition)
Este platforma standard de lucru ce oferă suport pentru crearea de aplicaţii independente şi appleturi.
De asemenea, aici este inclusă şi tehnologia Java Web Start ce furnizează o modalitate extrem de facilă pentru lansarea şi instalarea locală a programelor scrise în Java direct de pe Web, oferind cea mai comodă soluţie pentru distribuţia şi actualizarea aplicaţiilor Java.
• J2ME (Micro Edition)
Folosind Java, programarea dispozitivelor mobile este extrem de simplă, platforma de lucru J2ME oferind suportul necesar scrierii de programe dedicate acestui scop.
• J2EE (Enterprise Edition)
Această platformă oferă API-ul necesar dezvoltării de aplicaţii complexe, formate din componente ce trebuie să ruleze în sisteme eterogene, cu informaţiile memorate în baze de date distribuite, etc.
Tot aici găsim şi suportul necesar pentru crearea de aplicaţii şi servicii
Web, bazate pe componente cum ar fi servleturi, pagini JSP, etc.
Toate distribuţiile Java sunt oferite gratuit şi pot fi descărcate de pe Internet de la adresa "http://java.sun.com".
In continuare, vom folosi termenul J2SDK pentru a ne referi la distribuţia standard J2SE 1.5 SDK (Tiger).
Java: un limbaj compilat şi interpretat
In funcţie de modul de execuţie a aplicaţiilor, limbajele de programare se împart în două categorii:
• Interpretate: instrucţiunile sunt citite linie cu linie de un program numit interpretor şi traduse în instrucţiuni maşină. Avantajul acestei soluţii este simplitatea şi faptul că fiind interpretată direct sursa programului obţinem portabilitatea. Dezavantajul evident este viteza de execuţie redusă. Probabil cel mai cunoscute limbaj interpretat este limbajul Basic.
• Compilate: codul sursă al programelor este transformat de compilator într-un cod ce poate fi executat direct de procesor, numit cod maşină. Avantajul este execuţia extrem de rapidă, dezavantajul fiind lipsa portabilităţii, codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe platforma de lucru pe care a fost compilat.
Limbajul Java combină soluţiile amintite mai sus, programele Java fiind atât interpretate cât şi compilate. Aşadar vom avea la dispoziţie un compilator responsabil cu transformarea surselor programului în aşa numitul cod de octeţi, precum şi un interpretor ce va executa respectivul cod de octeţi.
Codul de octeţi este diferit de codul maşină. Codul maşină este reprezentat de o succesiune de instrucţiuni specifice unui anumit procesor şi unei anumite platforme de lucru reprezentate în format binar astfel încât să poată fi executate fără a mai necesita nici o prelucrare.
Codurile de octeţi sunt seturi de instrucţiuni care seamănă cu codul scris în limbaj de asamblare şi sunt generate de compilator independent de mediul de lucru. In timp ce codul maşină este executat direct de către procesor şi poate fi folosit numai pe platforma pe care a fost creat, codul de octeţi este interpretat de mediul Java şi de aceea poate fi rulat pe orice platformă pe care este instalată mediul de execuţie Java.
Prin maşina virtuală Java (JVM) vom înţelege mediul de execuţie al aplicaţiilor Java. Pentru ca un cod de octeţi să poată fi executat pe un anumit calculator, pe acesta trebuie să fie instalată o maşină virtuală Java. Acest lucru este realizat automat de către distribuţia J2SDK.
MFC - Biblioteci DLL
Info in rusa despre crearea si utilizarea bibliotecilor DLL.
MFC - Arhitectura Document/View
Arhitectura Document/View dă posibilitatea de a lega datele cu reprezentările lor pe ecran. Această arhitectură e realizată în clase, care se crează cu ajutorul AppWizard.
În carcasa arhitecturii MFC, documentul reprezintă un obiect ce conţine datele aplicaţiei. Reprezentarea e un obiect de tip fereastră, de obicei legat cu partea ferestrei clientului pe ecran, prin care utilizatorul completează documentul cu date. Reprezentările dau posibilitatea de a reprezenta un document prin diferite metode.
|
Obiect |
Descriere |
|
Document |
Clasa obiectului e derivată de la clasa Cdocument. Aces obiect defineşte datele. |
|
Reprezentare |
Derivată de la Cview. Reprezintă afişarea pe ecran şi interacţionează cu utilizatorul. |
|
Frame |
Derivată de la CframeWnd. |
|
Şablonul documentului |
Derivat de la CDocTemplate. Dirijează procesul de creare a reprezentării documentelor şi ferestrelor. O clasă şablon răspunde de toate documentele deschise. |
|
Aplicaţie |
Derivată de la CWinApp. |
Şablonul Documentului
Crearea obiectelor şablon de tip corespunzător se face cu ajutorul funcţiei InitInstance(). Această funcţie se află in obiectul aplicaţie şi setează toate datele. La etapa creării şablonului se leagă clasa şablon cu resursele fereastră şi reprezentare.
Şablonul se adaugă prin funcţia CWinApp::AddDocTemplate();
Document
Documentul deschide şi salvează datele şi le dirijează. El are funcţii de accesare la date şi prelucrearea lor pentru interacţiunea dintre reprezentări şi documente. Fiecare obiect de document conţine lista de reprezentări legate cu el, acces la care se face prin funcţiile clasei CDocument: GetFirstPosition(), GetNextView().
CDocument conţine funcţia UpdateAllViews() ce transmite la toate reprezentările legare de document mesajul de necesitate a redesenării ferestrei
Obiectul de reprezentare răspunde de interacţiunea cu obiectul. Acest obiect afişează informaţia din document şi posibilitatea utilizatorului de a introduce sau schimba date.
Cu un document pot fi legate mai multe reprezentări, dar o reprezentare poate aparţine numai unui document.
Dacă la etapa de creare a aplicaţiei cu AppWizard nu indicăm clasa pentru reprezentare, atunci reprezentarea va fi bazată pe clasa CView.
MFC - Prelucrarea Evenimentelor
Lucrul in SO Windows e pus în baza prelucrării evenimentelor. Când utilizatorul lucrează cu tastatura, mouse-ul,etc, driver-ul generează evenimentele ce descriu lucrul utilizatorului. Evenimentele, la prima etapă, nimeresc în rândul evenimentelor SO. Din acest rând evenimentele se transmit la aplicaţiile le care sunt destinate şi se înscriu în rândul de evenimente al aplicaţiei. Aplicaţia, în ciclul de prelucrarea a evenimentelor, scoate câte un eveniment şi transmite funcţiei de prelucrare, care prelucrează evenimentul.
Ciclul de prelucrare de obicei conţine WHILE în care, ciclic, se apelează funcţiile GetMessage() şi DispatchMessage(). În aplicaţii mai complexe ciclul de prelucrare a evenimentelor conţine apelul altor funcţii – TranslateMessange(), TranslateAccelerator(), care fac prelucrarea preventivă a evenimentelor.
Funcţia de prelucrare a evenimentelor controlează ce eveniment a venit la prelucrare şi-l apelează. Dacă la crearea aplicaţiei a fost folosită biblioteca MFC, atunci clasele prelucrează evenimentele. Fiecare clasa ce are ca părinte clasa CcmdTarget poate să prelucreze evenimente. Clasa poate prelucra evenimente dacă are tabel de evenimente(Event Map). În acest tabel pentru fiecare eveniment se indică metoda clasei care prelucrează acest eveniment.
Sunt 3 tipuri de evenimente:
- Evenimente Windows
- Mesaje de la elemente de control
- Evenimente de comenzi(comenzile)
Evenimetele Windows sunt acelea care au prefixul WM_, în afară de WM_COMMAND. Toate evenimentele din această categorie sunt menite spre prelucrare de către ferestre si prezentări şi deseori conţin parametri ce determină algoritmul de prelucrare a unui eveniment.
A doua categorie include mesaje(notification message) de la elemente de control şi alte ferestre derivate care transmit mesaje „părinţilor săi”.
NB! Mesajul BN_CLICKED de la elementrul BUTTON se înţelege ca şi eveniment de comandă şi se transmite ca şi o comandă.
Evenimentele acestor 2 categorii sunt menite pentru clasele derivate din CWnd, adică cele care au descriptorul HWND al ferestrei Windows.
Evenimentele de comenzi includ toate evenimentele WM_COMMAND, care se transmit de la obiectele interface-ului utilizatorului – meniu, butoanele din bara de instrumente şi butoanele acceleratoare.
Un tablou de evenimente pune în corespondenţă unui eveniment o funcţie, astfel încât la un eveniment întâmplat mesajul evenimentului de transmite la funcţia corespunzătoare.
Un tablou nu poate conţine mai mult decât o macro-comandă pentru un eveniment. Există un grup mic de evenimente standarte ce au metode care se apelează implicit(ID_FILE_OPEN -> ON_FILE_OPEN)
LFA - Limbaje formale si automate
Doua carti la tema:
Serializarea datelor
Serializare – păstrarea stării obiectelor.
Necesitatea in păstrarea datelor constante crează probleme adăugătoare la etapa de elaborare a produselor OO. Carcasul aplicaţiei ajută să realizeze această situaţie care se num serializare.
Serializare – o metodă de păstrare a structurilor de date la etapa salvării sau restabilirii din fişier.
Serializarea este implicită in MFC şi este realizată în clasa Cobject. Pentru a susţine serializarea claselor derivare din Cobject tre de redefinit funcţie serialize:
Void Cobject::Serialize(Carchive& ar)
{
If(ar.isStoring()) //daca salvam – true, daca citim - false
{//…}
Else
{//…}
}
Serializarea arhivează diferite date din clasă şi restabileşte sau salvează aceste date din obiectul clasei CArchive. CArchive realizează un mecanism de buferizare. Fiecare obiect CArchive se folos pentru salvare sau citere, dar niciodata pentru ambele.
Obiectul CArchive trăieşte in timpul parcurgerii fişierului de salvare sau citire, la sfârşit obj se dirstruge. Pentru serializare in fişier si restabilire din fişier, de fiecare dată se crează alt obiect CArchive.
Ce tipuri de date pot fi serializare?
- word
- dword
- double
- int
- Cstring
- Float
- Structura Point si clasa CPoint
- Structura Rect si clasa CRect
- Etc.
In fisierul mc.h se scrie:
#pragma once
class MyClass : public CObject
{
DECLARE SERIAL(MyClass)
char* ttt;
int x;
public:
MyClass();
virtual void Serialize(CArchive &ar);
}
In fisierul mc.cpp se scrie:
#include „mc.h”
IMPLEMENT_SERIAL(MyClass, Cobject,1) //1 se scrie pentru frumusete.
void MyClass::Serialize(Carchive &ar)
{
if (ar.isStoring())
{
ar<<ttt; //sau ar<<(CString)ttt;
ar<<x;
}
else
}
Clase container:
- CArray
- CList
- CMap
Cum se serializează aceste tipuri?
CList <int, &int> m_ilist;
=> m_ilist.Serialize(ar);
Există o funcţie pentru serializarea listelor claselor proprii
template <class Type>
void AFXAPI SerializeElementes(CArchive ar, Type *pEl, int nCount)
CList <MyClass, MyClass&> mlist;
=>
template <>
void AFXAPI SerializeElementes(CArchive &ar, MyClass* p *pEl, int nCount)
{
for(int i=0; i<nCount; i++)
{
p->Serialize(ar);
p++;
}
}
Desenarea şi vizualizarea preventivă
În Windows Aplicaţii şi dispozitive de ieşiri interacţionează cu ajutorul interfeţei dispozitivelor grafice(GDI – Graphical Device Interface). Utilizarea acestei interfeţe garantează ieşirea corectă la toate dispozitivele compatibile cu GDI.
GDI dirijează cu structura datelor, ce se numeşte contextul dispozitivului, care conţine info despre atributele curente a dispozitivului dat.
În WinAPI (Application Programming Interface) sunt funcţii GDI pentru desenarea liniilor si a altor figuri geometrice, afişarea la ecran, etc. Toate aceste funcţii afişează datele la contextului dispozitivului, descriptul cărora se transmite ca parametru.
In MFC contextul disp si majoritatea funcţiilor GDI sunt incapsulate in clasa CDC. În această clasă sunt realizate funcţii pentru createa si init contextului dispozitivului şi funcţii pentru desenarea.
In afară de clasa CDC exista un set de clase derivate de la CDC:
- CPlaintDC – incapsuleaza contextul dispozitivului, care se foloseşte pentru redesenare părţii neaccesibile a ecranului
- CClientDC – descrie contextul dispozitivului, ce prezintă partea clientă a ferestrei.
- CWindowDC – incapsulează contextul dispozitivului, ce reprezintă toată fereastră, inclusiv chenarul.
- CMetafileDC – conţine un set de structuri ce păstrează imaginea aplicaţiei în format independent de hardware.
Desenarea prin reprezentare
Afişarea grafică a datelor aplicatiei se face cu ajut funcţiei OnDraw. În clasa derivată din Cview creata de AppWizard, există funcţia:
void CAppView::OnDraw(CDC* pDC)
{
CappDoc* pDoc=GetDocument();
ASSERT_VALID(pDoc); //controleaza daca pointerul este valid
//…
pDC->TextOut(10,10,_T(„Hello World!!!”));
}
Funcţia OnDraw primeste ca param un obj CDC. El trebuieşte pentru apelarea la funcţia de desenare din contextul dispozitivului. Înca funcţia OnDraw primeşte pointer la obj documentului care se folos pentru utilizarea datelor aplicaţiei. Dacă schimbarea datelor din document poate să reacţioneze la reprezentare, atunci vederea tre să fie redesenată. De obicei avcesta se intâmplă la intoducerea schimbării în vederea de utilizator. Codul ce reînnoieste datele din document tre să apeleze funcţia UpdateAllViews, care spune tuturor reprezentărilor ca tre să fie redesenate.
Print şi Preview
În prigramarea sub Win nu este diferentă intre desenare pe ecran si printare, fiindcă GDI are o interfaţă independentă de hardware. Unele şi aceleaşi funcţii pot fi util pentru reprez datelor la ecran şi pentru tipărirea la printer în dependenţă de contextul dispozitivului.
Biblioteca MFC dă posibilitate de a realiza funcţii de tipar fără a aplica efortul utilizatorului. Carcasul aplicaţiei singur crează de tip dialog si contextul dispozitivului pentru printer.