Documente Academic
Documente Profesional
Documente Cultură
TEZĂ DE LICENȚĂ
A elaborat:
Palancica Pavel
student al anului III, grupa I-32
Specialitatea Informatică
Conducător științific:
Seiciuc Eleonora
dr., lector superior,
Catedra Tehnologii de programare
Chişinău - 2011
SARCINA TEZEI
2
ADNOTARE
3
CUPRINS
SARCINA TEZEI………………………………………………………………2
ADNOTARE………………………………………………………………….…3
CUPRINS………………………………………………………………………..4
INTRODUCERE……………………………………………………………......6
I. MANUALE ELECTRONICE…………………………………………..8
1.1 Calculatorul – instrument didactic ..………………………....………..8
1.2 Tipuri de manuale electronice………………………………….……...9
CONCLUZII……………………………………...………………………………...54
BIBLIOGRAFIE……………………………………………………………….…..55
ANEXE……………………………………………...………………………………56
5
INTRODUCERE
Din acest motiv, programatorii care au lucrat pe aceste PC-uri căutau posibilitățile
de a realiza primele manuale electronice. Realizate de diferite firme creatoare de soft cu
6
renume mondial, in prezent există diferite formate digitale de realizare a manualelor
electronice, cum ar fi .pdf, .djvu, .chm și altele. De asemenea, un manual electronic se
poate crea în limbajul de marcare html, aceasta se folosește mai des pentru realizarea
documentației pentru diferite produse soft.
7
I. MANUALE ELECTRONICE
8
micro, adică: planificări, proiecte de unităţi de învăţare, proiecte de lecţie, cît şi a
unor documente de evidenţă şcolară cum ar fi cele legate de prezenţa la anumite
activităţi didactice sau notarea evoluţiei elevilor la activităţile de verificare şi
evaluare a cunoştinţelor.
Realizarea unor calcule numerice, mai mult sau mai puţin complicate, în scopul
formării deprinderilor de calcul sau al eliberării de etapa calculatorie în rezolvarea
unor probleme, prelucrarea unor date.
9
Odată cu dezvoltarea tehnologiilor informaționale a apărut un nou tip de manual -
manualele electronice. Acest tip de manual reprezintă o treaptă în evoluția instruirii
asistate de calculator.
Tipurile existente de manuale electronice sunt foarte diverse. Această diversitate
se datorează, în primul rind, existenței diferitelor firme mari producătoare de soft, cum
ar fi Adobe, care a creat formatul de manual electronic cel mai cunoscut - .pdf (public
document format). Interfața unui manual electronic *.pdf este prezentată în Figura 1 de
mai jos:
11
II. STRUCTURI DE DATE ȘI ALGORITMI
2. Fișiere
4. Recursivitatea în C
Deoarece toate cele 8 capitole se referă, într-o mare măsură la limbajele C/C++
(ceea ce ține de operațiile de Input/Output, lucrul cu pointeri, structure, uniuni etc.) și,
ținind cont că volumul de date prezente în curs este destul de mare (peste 400 de pagini),
12
în acest capitol vom descrie un singur tip abstract de date, și anume Stiva, descriind
operațiile de bază asupra acesteia, cum ar fi plasarea unui item sau extragerea unui item
din vîrful acesteia.
2.1.1 Caracteristici
Un tip de date abstract (TDA) este o entitate manipulată doar prin operațiile ce
definesc acel tip. Utilizatorul nu trebuie să aibă acces direct la reprezentarea internă a
obiectului, ci numai prin intermediul acestor operații.
2.1.2 Avantaje
13
Avantajele utilizării tipurilor abstracte de date sunt:
2.1.3 Stiva
Stiva este un tip special de listă în care toate inserțiile și suprimările de noduri
au loc la un singur capăt (vîrful stivei).
1. Inițializarea stivei.
2. Verificarea faptului că stiva este plină.
3. Verificarea faptului că stiva este goală.
4. Introducerea unui element în vărful stivei.
5. Eliminarea unui element din vârful stivei.
6. Furnizarea elementului din vârful stivei fără a-l elimina.
14
Stiva va fi materializată printr-un tablou de numere reale (stiva), iar vîrful stivei
este indicat de variabila ind_top.
Toate declarațiile și definițiile trebuie să fie conținute într-un singur fișier. Atît
stiva cît și ind_top sunt definite cu clasa de memorare static pentru a ascunde de
utilizator detaliile de implementare a stivei.
Funcțiile au implicit clasa de memorare extern. Ele pot fi apelate din alte fișiere,
iar toate operațiile asupra stivei sunt realizate doar prin intermediul lor.
Inițializarea stivei:
void init(void) {
int i;
for (i=0; i < MAX; i++)
stiva[i] = 0; /* toate elementele devin 0 */
ind_top = -1; /*varful stivei indica primul elem.
ocupat */
}
int plin(void) {
return ind_top == MAX - 1;
}
int gol(void) {
15
return ind_top == -1;
}
void pop(void) {
if (gol()) /* daca stiva este goala */
{
printf(“Eroare: stiva este goala\n”);
exit(1);
}
/* decrementeaza virful stivei*/
ind _top --;
}
17
III. Prezentarea tehnologiei WPF
WPF este imens. De fapt, poate fi copleşitor, deoarece are o mulțime de părți
dinamice care se interconectează reciproc. De aceea, cel mai scurt răspuns la această
întrebare, este că WPF este un API pentru construirea interfețelor grafice utilizator (UI)
pentru aplicațiile desktop cu ajutorul .NET Framework.
Acum urmează explicația detaliată.
Pentru început, WPF este o abreviere pentru Windows Presentation Foundation.
Fizic, este un set de asamblări .NET și instrumente ajutătoare. Are scopul de a ne oferi
un API unificat pentru crearea interfețelor utilizator sofisticate, cu conținut bogat pentru
Windows XP, Windows Vista, Windows 7 și generațiile ulterioare.
WPF combină cele mai bune lucruri din web development, precum foile de stil și
un limbaj de marcare pentru interfețele utilizator declarative, cu lucruri bune din
aplicații Internet cu conținut bogat (Rich Internet Applications), cum ar fi grafica
vectorială scalabilă, animația și suportul media. Aceste trăsături bune sunt împachetate
cu cele mai bune trăsături ale dezvoltării aplicațiilor Windows tradiționale – trăsături
precum integrarea puternică cu Sistemul de Operare (SO) și legarea datelor (data
binding). În WPF, aceste concepte sunt consolidate și unificate. Chiar toate cele
menționate, nu redau intreaga măsură a WPF. Aceasta are alte faţete, așa ca suportul
pentru desenarea 3D, tipografia avansată și documente portabile similare cu PDF.
18
De asemenea, WPF este un API unificat. Multe din chestiile pe care le putem face
în WPF, le puteam face și mai înainte. Totuși, făcîndu-le pe toate într-o singură aplicație
era extreme de dificil. WPF nu ne permite numai să aducem aceste trăsături împreună,
dar ne oferă un API consistent pentru a realiza aceasta.
WPF este doar o parte a unei imagini mai largi. Trei biblioteci adiționale au fost
create ca parte componentă a .NET 3.0. Toate aceste patru biblioteci au aceeași intenție
de a oferi un API consistent, unificat pentru domeniul lor. În plus, combinînd oricare
dintre aceste biblioteci într-o aplicație, se pot produce niște rezultate impresionante. Cele
trei biblioteci care au fost eliberate impreună cu WPF sunt redate în Tabelul 1.
20
3.1.2 Poziționare inteligentă
21
Graficele raster sunt, de asemenea, numite bitmap-uri. (A nu se confunda cu
formatul de fișier BMP. Termenul bitmap este un termen general, descriind un mod
particular de a păstra datele de imagini).
Să presupunem că avem o imagine raster a unui cerc albastru pe un fundal alb
care este de 100×100 pixeli. Calculatorul încarcă acei 10.000 de pixeli în memorie și îi
afișează pe ecran. Acestea sunt multe date pentru o imagine atît de simplă. Să ne
imaginăm că avem nevoie de aceea imagine, dar de două sau de tri ori mai mare.
Numărul de pixeli crește exponențial. Dacă am fi putut pur și simplu să-i furnizăm
calculatorului două dimensiuni, poziția și culoarea formelor, atunci, am fi avut mult mai
puține date de care să avem grijă. În acest fel, grafica raster este ineficientă.
Altă problemă cu imaginile raster este că ele nu se redimensionează bine. Se
obține o pierdere vizibilă a calității, în special atunci cînd mărim o imagine. Să
presupunem că dorim să dublăm mărimea unei imagini a noastre de 100×100. Pentru a
mări dimensiunea la 200×200, am avea nevoie de 390.000 de pixeli în plus. Acești pixeli
care lipsesc vor trebui să fie interpolați din cei existenți.
Grafica vectorială, totuși, este păstrată ca primitive geometrice. Structura de date
pentru o imagine vectorială conține informație suficientă pentru calculator pentru a
desena imaginea. O imagine vectorială a unui cerc albastru pe un fundal alb ar conține
poziția x și y a cercului, raza acestuia și metadatele indicînd că cercul era albastru, iar
fundalul alb. Cînd un calculator redă această imagine, acesta deduce pixelii actuali on-
the-fly. Aceasta înseamnă că nu este nici o diferență în calitate între imaginea vectorială
de 100×100 și imaginea de 100×100, și că mărimea datelor necesare de a desena
imaginea este substanțial mai mică.
O regulă generală este că grafica vectorială este bună pentru imaginile geometrice
sau cele din desene animate, iar raster e mai bună pentru fotografi și imagini realistice.
Atunci cînd vorbim despre binding în WPF, probabil ne duce gîndul imediat la
conceptul de data binding. Data binding a fost deja popular cu Windows Forms și
ASP.NET Web Forms, și a demonstrat utilitatea sa acolo. Cu toate că WPF are trăsături
semnificative de data binding – semnificative în sensul că depăşește cu mult predecesorii
23
săi – aceasta ne permite, de asemenea, să legăm declarativ alte chestii, cum ar fi
comenzi, legături cu tastele, animații și evenimente. De exemplu, putem lega declarativ
un control buton cu o comandă Paste.
3.1.8 Animație
24
Framework-ul pentru animație în WPF este foarte impresionant, și mult mai
impresionant decît ne-am putea imagina. Majoritatea proprietăților în WPF pot fi
animate, și există support pentru linii de timp (timelines), cadre cheie (key frames) și
interpolare. Animațiile ușor se integrează cu template-urile și stilurile. De exemplu,
putem defini un stil pentru un buton care animează butonul atunci cînd mișcăm mouse-
ul deasupra lui. Dezvoltatorii Flash și designer-ii vor fi impresionați cu funcțiile
disponibile.
3.1.9 3D
WPF, la fel ca bibliotecile sale surori eliberate cu .NET 3.0, sunt API-uri bine-
factorizate și consistente. Ele unifică multe concepte de programare și, în ansamblu, fac
mai ușoare o mulțime de sarcini de programare complicate. Totuși, WPF nu este
neapărat alegerea corectă pentru fiecare proiect. Unele aplicații desktop ar fi mai ușor de
construit și de întreținut utilizînd Windows Forms. Însă, vom găsi multe benficii atunci
cînd lucrăm cu WPF. Orice programator Windows ar trebui să înceapă a învăța WPF,
deoarece aceasta va ajunge la un punct cînd va înlocui complet Windows Forms.
25
Urmează cîteva scenarii unde WPF într-adevăr strălucește:
Aplicația noastră necesită suport pentru tipografie avansată. WPF are suport
pentru OpenType și multe alte funcții care nu sunt disponibile cu Windows
Forms.
În sfîrșit, ca dezvoltatori, putem face mai multe în mai puțin timp. Chiar dacă nu suntem
preocupați de toate detaliile WPF, vom fi capabili să construim software de calitate cu
mai puțin efort.
Dacă suntem numai programatori .NET, într-adevăr avem numai două alte opțiuni
de considerat: Windows Forms și ASP.NET. Deja s-au comparat WPF și Windows
26
Forms pe parcursul acestui capitol. Unicele avantaje reale pe care Windows Forms le are
sunt biblioteca sa imensă de controale și suport third-party semnificativ. WPF încă este
“noul copil la bloc”, iar mulțimea de instrumente și materiale încă nu au avut timp să fie
construite.
Compararea WPF cu ASP.NET implică puțin mai multe. Întrebarea aici se
centrează într-adevăr pe implementare și distribuție. WPF este, la moment, limitată la
platform Windows, și, evident, nu există așa limitare într-o aplicație web. WPF necesită
.NET Framework 3.0 sau mai superior, precum și un mijloc de implementare a
aplicației. Dacă aplicația noastră este centralizată, necesitînd una sau mai multe
component server, va trebui probabil să reducem semnificativ complexitatea, alegînd să
dezvoltăm o aplicație web.
În afara lumii .NET, unele din aceleași caracteristici sunt disponibile cu Adobe
Flash, în primul rind cînd este vorba de media și animație. Istoric, Flash într-adevăr a
fost util numai în contextul Web. Totuși, platform Adobe Air utilizează Flash pentru a
dezvolta aplicații desktop cross-platform. Cu toate acestea, Flash încă mai are unele
dezavantaje notabile. Mediul de dezvoltare nu este la fel de robust ca .NET, cu toate că,
indiscutabil, Flash tinde să fie mai mult pritenos pentru designer. Bibliotecile de
controale pentru Flash sunt mult mai limitate și greu de folosit. Este posibil ca AIR va
deveni un adevărat concurrent al WPF.
27
versiunile CLR de bază și mediile de dezvoltare asociate, și vom identifica versiunile
care sunt instalate pe Windows.
Figura 2 ilustrează istoria versiunilor și care versiuni sunt instalate pe Windows.
28
ulterior înnoită de 2 ori, cu Service
Pack 1 (Sp1) și SP2. Această versiune a
introdus, de asemenea, execuția side-
by-side, care permite aplicațiilor pe un
singur PC să ruleze pe diferite versiuni
ale CLR.
A introdus o nouă versiune a CLR cu
adaosuri la base class libraries, inclusiv
Visual Studio tipuri generice, colecții generice, și
2.0 2.0
.NET 2005 adaosuri semnificative la ASP.NET.
Această versiune este ulterior înnoită
cu SP1 și SP2.
Această versiune este în principal .NET
Visual Studio Framework 2.0 cu adăugarea WPF,
3.0 2.0
.NET 2005 WCF, WF și CardSpace. A fost ulterior
înnoită cu SP 1 și SP 2.
A adăugat noi caracteristici, așa ca site-
uri Web AJAX-enabled și LINQ. SP1 a
Visual Studio
3.5 2.0 adăugat .NET Framework Client
.NET 2008
Profile, Dynamic Data și un mic set de
înbunătățiri adiționale.
Include o nouă versiune de CLR, a base
class libraries extinse, și noi trăsături,
Visual Studio
4 4 precum Managed Extensibility
.NET 2010
Framework (MEF), dynamic language
runtime (DLR) și contracte de cod.
29
3.1.14 Instrumente pentru WPF
31
3.1.15 WPF în contrast cu Silverlight
32
XAML, sau Extensible Aplication Markup Language (limbaj de marcare al
aplicației extensibil), este un limbaj bazat pe XML creat de Microsoft. Este fundamental
pentru WPF la fel ca HTML pentru dezvoltarea web.
Spațiile de nume în XAML sunt adesea confundabile dacă nu am lucrat cu ele mai
înainte. Ele au aceeași funcție ca și spațiile de nume în .NET, el oferă un domeniu pentru
nume unice.
Este similar ideii de a avea doi oameni numiți John Smith. Pentru a-i distinge,
34
trebuie să-i numim John Smith din Chicago și John Smith din Boston. Includerea locului
de unde ei vin este analog cu spațiul de nume. Atunci cînd două lucruri se numesc la fel,
și nu le putem distinge, se numește coliziune de nume.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Button x:Name="blueButton"
Width="100"
Height="40"
Background="Blue"
Content="Click Me" />
</Page>
Proprietatea Background este puțin mai complex decăt celelalte. Este important ca
elemental XAML la care dorim să ne referim, în cod sau oriunde în XAML, să posede o
valoare unică pentru x:Name. Atribuirea unei valori lui x:Name este ca și cum am crea o
variabilă și i-am atribui instanța unui obiect.
În calsa Button, Width și Height sunt tipuri simple de date. WPF convertește
valoarea string 100 la un double implicit. Totuși, multe proprietăți ale controalelor nu
sunt tipuri de date simple. Unele proprietăți sunt obiecte care ele însuși au o mulțime de
proprietăți. În exemplu de mai sus, proprietatea Background a butonului este de tipul
SolidColorBrush. În XAML, putem pur și simplu să declarăm Blue și va merge.
Există multe locuri în XAML unde tipuile frecvent utilizate, precum
SolidColorBrush, pot fi reprezantate de o valoare string simplă, pe care WPF știe cum să
o trateze. În cazul SolidColorBrush, putem scrie orice culoare care este prezentă în clasa
System.Windows.Media.Colors, sau putem scrie o reprezentare hexagesimală a culorii
similară cu cele utilizate în HTML sau CSS. Următoarele fragmente XAML sunt
echivalente:
Totuși, în unele situații, această prescurtare nu este suficientă pentru a-i spune
WPF ceea ce dorim. În acele cazuri, putem folosi sintaxa elementelor proprietate.
Sintaxa elementelor proprietate este o sintaxă alternativă folosită pentru a atribui valori
de tipuri complexe. În locul setării proprității Background folosind un atribut, putem
folosi un element copil. Următorul fragment demostrează utilizarea acestei sintaxe
alternative pentru setarea fundalului la albastru:
<Button>
<Button.Background>
36
<SolidColorBrush Color="Blue" />
</Button.Background>
</Button>
Ambele butoane vor fi redate la fel în WPF. Ce este interesant, este faptul că
Content este de fapt, de tipul object. Aceasta înseamnă că putem face conținutul unui
buton mult mai mult decît un simplu string. De exemplu, se prea poate că vom dori să
desenăm un cerc galben în interiorul butonului. Putem utilize următorul XAML:
<Button>
<Ellipse Width="24"
37
Height="24"
Fill="Yellow" />
</Button>
<Button>
<Button.Content>
<Ellipse Width="24"
Height="24"
Fill="Yellow" />
</Button.Content>
</Button>
Totuși, făcînd asta, este mai mult de scris și nu facem nimic pentru a mări
lizibilitatea sau mentenabilitatea codului. Mai mult ca atît, convenția de a seta implicit
propritatea Content este aproape universal adoptată.
Uneoeri, trebuie să specificăm valori în markup-ul nostru care sunt sau dificil de
exprimat în XAML sau în afara domeniului procesorului XAML. XAML posedă o
funcție numită markup extensions, și aceasta ne permite să tratăm aceste situații.
De exemplu, să presupunem că avem o culoare specific pe care dorim să o
utilizăm ca fundal pentru căteva butoane într-o aplicație WPF. Am putea seta
proprietatea Background pentru fiecare buton pentru a folosi aceeași culoare, însă ar
deveni laborios dacă vom avea nevoie vreodată să schimbăm acea culoare. Cu WPF,
putem păstra culoarea cu o cheie în resursele unei aplicații. Acum puytem seta fundalul
butoanelor în culoarea pe care am stocat-o în resurse. Daca dorim să schimbăm culoarea,
trebuie să facem asta numai într-un singur loc. Acesta este un scenario plăcut, însă cum
se poate de tratta aceasta în XAML. Vom folosi o extensie de marcaj.
38
În scenariul precedent, XAML-ul cu extensia de marcaj poate arăta astfel:
40
IV. REALIZAREA MANUALULUI ELECTRONIC
41
Inițial, a fost creat fișierul UtilityItems.cs, care conține două enumerări, o clasă
static și o structură, după cum urmează:
public enum CornerOrigin { TopLeft, TopRight, BottomLeft, BottomRight };
public enum PageStatus { None, Dragging, DraggingWithoutCapture, DropAnimation, TurnAnimation }
Struct PageParameters
{
private double _page0ShadowOpacity;
private double _page1RotateAngle;
private double _page1RotateCenterX;
private double _page1RotateCenterY;
private double _page1TranslateX;
private double _page1TranslateY;
private PathFigure _page1ClippingFigure;
private PathFigure _page2ClippingFigure;
private Point _page1ReflectionStartPoint;
private Point _page1ReflectionEndPoint;
private Point _page0ShadowStartPoint;
private Point _page0ShadowEndPoint;
public Point Page0ShadowEndPoint
private Size _renderSize;
42
_page0ShadowOpacity = 0;
_page0ShadowEndPoint = new Point();
_page0ShadowStartPoint = new Point();
_page1ClippingFigure = new PathFigure();
_page1ReflectionEndPoint = new Point();
_page1ReflectionStartPoint = new Point();
_page1RotateAngle = 0;
_page1RotateCenterX = 0;
_page1RotateCenterY = 0;
_page1TranslateX = 0;
_page1TranslateY = 0;
_page2ClippingFigure = new PathFigure();
_renderSize = renderSize;
}
…
}
Fișierul “BookPage.xaml.cs”
namespace WpfBookControls
{
partial class BookPage : System.Windows.Controls.ContentControl
{
private const int animationDuration = 500;
private const double gripSize = 30;
internal CornerOrigin origin = CornerOrigin.BottomRight;
43
public static readonly RoutedEvent PageTurnedEvent;
În Tabelul 3 de mai jos sunt descrise datele membre ale clasei de mai sus:
Denumirea Descrierea
animationDuration Constantă ce definește perioada de autorăsfoire a unei pagini
(în milisecunde).
gripSize Constantă ce definește lungimea laturii patratului invizibil
din fiecare colț al paginii, deplasarea mouse-ului pe suprfața
acestuia declanșînd un eveniment.
origin Definește originea colțului de unde va fi trasă foaia la
44
răsfoire. Implicit, va fi Dreapta-Jos.
Status Proprietate de tip PageStatus, care definește starea paginii.
Initial va avea valoarea PageStatus.None.
CornerPoint Proprietate de tip Point, care definește coordonatele
punctului dintr-un oarecare colț al paginii.
IsTopLeftCornerEnabled Proprietate de tip bool, care ne indică dacă colțul Stînga-Sus
este activ. Sunt definite încă trei astfel de proprietăți pentru
fiecare colț, cu numele respective.
PageTurnedEvent Evenimentul static care se produce răsfoirea paginii.
CornerPointProperty Proprietate dependență, care împreună cu alte patru astfel de
proprietăți, precum și evenimentul precedent, se vor
înregistra în constructorul static (dependency properties se
declară întotdeauna statice, el permit ușor ca să se lege unele
evenimente cu triggere, alte evenimente etc.)
În Tabelul 4 de mai jos sunt descrise metodele clasei BookPage din fișierul
“BookPage.xaml”:
Denumirea Descrierea
ApplyParameters Aplică noii parametrii pentru pagina curentă.
anim_Completed Se apelează atunci cînd pagina începe să fie răsfoită, sau
este oprită, apelind funcția precedentă, apoi schimbînd
starea cărții.
anim_CurrentTimeInvalidated Similară cu cea precedent, însă apelează și altă funcție,
45
care calculează coordonatele paginii,apoi se
redesenează.
OnMouseDown Se apelează atunci cînd mouse-ul are butonul click-
stînga apăsat.
OnMouseUp Se apelează atunci cînd mouse-ul eliberează butonul
click-stînga.
OnMouseMove Se apelează atunci cînd mouse-ul se mișcă în preajma
colțului paginii.
OnMouseLeave Se apelează atunci cînd mouse-ul părăsește aria colțului
paginii.
ComputeAnimationDuration Funcții auxiliare, ce se folosesc la calcule în timpul
ComputeProgressRatio
animației unei pagini.
46
4.1.3 Controlul Book
Ca orice alt control din WPF, acesta posedă partea de design (vezi ANEXA 3) și
partea funcțională. Clasa Book moștenește de la ItemsControl, ceea ce înseamnă că poate
conține o colecție de itemi. Aceasta este definită în fișierul “Book.xaml.cs”, care are
următoarea structură:
Fișierul “Book.xaml.cs”
public partial class Book : ItemsControl
{
private PageStatus _status = PageStatus.None;
private int _currentSheetIndex = 0;
…
internal object GetPage(int index) { … }
private void OnLoaded(object sender, RoutedEventArgs args)
47
Denumirea Descrierea
_status Definește starea unei pagini. Inițial este Status.None.
_currentSheetIndex Definește pagina indexul paginii curente. Inițial este zero.
Denumirea Descrierea
GetPage Funcție internă ce returnează o pagină cu indexul dat ca
parametru.
OnLoaded Initializează controlul la încărcare.
AnimateToNextPage Animează trecerea la următoarea pagină.
Acest proiect reprezintă programul principal, care se încarcă atunci cînd soluția
este rulată. El este compus din mai multe pagini XAML, care stochează informația
propriu-zisă. Informația este reprezentată prin imagini .JPG, toate fiind amplasate logic
în mape și submape, pentru o mai bună claritate și ușurință în dezvoltarea ulterioară
Aceasta este clasa care se încarcă atunci cînd este lansat programul. Ea este un
control WPF, compus din 2 părți partea de design (Vezi ANEXA 4), și partea
funcțională, care este descrisă în continuare.
În Visual Studio 2010, modul Design, controlul dat va arăta astfel:
49
Figura 3 Interfața aplicației văzută în Visual Studio 2010
50
}
try
{
if (e.Key == Key.Escape)
{
{
this.WindowState = WindowState.Minimized;
Environment.Exit(0);
}
}
else if (e.Key == Key.Left)
{
myBook.AnimateToPreviousPage(true, 500);
if (Int32.Parse(pageNumber.Text) > 1)
{
pageNumber.Text = (Int32.Parse(pageNumber.Text) - 2).ToString();
}
myBook.Focus();
}
else if (e.Key == Key.Right)
{
myBook.AnimateToNextPage(true, 500);
if (Int32.Parse(pageNumber.Text) < 431)
{
pageNumber.Text = (Int32.Parse(pageNumber.Text) + 2).ToString();
}
myBook.Focus();
}
else if (e.Key == Key.Enter)
{
if (this.WindowState == WindowState.Maximized)
{
this.WindowState = System.Windows.WindowState.Normal;
}
else
{
this.WindowState = WindowState.Maximized;
}
}
}
catch (Exception)
{ }
}
Deoarece metodele de mai sus au fost incluse împreună cu corpurile lor, vom
descrie succint pe fiecare din ele.
Constructorul implicit inițializează aplicați cu dimensiune de 800×600 ( pentru a
putea rula pe diferite tipuri de calculatoare, inclusiv cele cu rezoluția minimă) și este
centrată pe desktop.
Funcțiile ButtonNext_Click și ButtonPrevious_Click realizează răsfoirea paginilor
înainte, respective, înapoi.
52
custom, deoarece cele standard au fost scoase din cadrul aplicației, inclusiv a fost scoasă
și bara standartă din partea de sus a aplicației.
Funcția ButtonCuprins_Click deschide cartea la pagina de Cuprins, pentru a căuta
manual tema dorită.
53
CONCLUZII
54
BIBLIOGRAFIE
1. Pro C# 2010 and the .NET 4 Platform – Fifth edition, Andrew Troelsen, Apress,
2010
2. Sams Teach Yourself WPF in 24 Hours, Rob Eisenberg and Christopher Bennage,
Sams, 2009
3. Pro C# 2008, Christian Nagel, Bill Evjen, Jay Glynn, Morgan Skinner and Karli
Watson, Wrox, 2008
5. Pro WPF Programming, Chris Andrade, Shawn Livermore, Mike Meyers and
Scott Van Vliet, Wrox, 2007
6. http://www.codeproject.com/KB/GDI-plus/TurnThePage.aspx
7. http://www.wpfbookcontrol.codeplex.com/
8. http://www.wpftutorial.net/
9. http://windowsclient.net
10. http://infoscience.3x.ro/c++.html
55
ANEXA 1
56
ANEXA 2
<ContentControl x:Class="WpfBookControls.BookPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="OnLoaded" BorderBrush="Red" BorderThickness="1"
MouseDoubleClick="OnMouseDoubleClick"
MouseMove="OnMouseMove" MouseDown="OnMouseDown"
MouseUp="OnMouseUp" MouseLeave="OnMouseLeave" >
<Grid x:Name="mainGrid">
<!--Page 2 begin-->
<ContentPresenter x:Name="page2" />
<!--Page 2 end-->
<Canvas Opacity="1" x:Name="nextPageShadowCanvas" Visibility="Hidden">
<Canvas.Background>
<LinearGradientBrush x:Name="nextPageShadow" StartPoint="0 0" EndPoint="0 0">
<GradientStop Color="Transparent" Offset="0" />
<GradientStop x:Name="nextPageShadowCanvasOffset1" Color="Black" Offset="0"
/>
<GradientStop x:Name="nextPageShadowCanvasOffset2" Color="Transparent"
Offset="1" />
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
<Grid>
<Grid.Clip>
<CombinedGeometry x:Name="clippingPage0" GeometryCombineMode="Exclude">
<CombinedGeometry.Geometry1>
<RectangleGeometry />
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry>
<PathFigure IsClosed="True" />
</PathGeometry>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Grid.Clip>
<!--Page 0 begin-->
<ContentPresenter x:Name="page0" />
<!--Page 0 end-->
</Grid>
<Canvas Opacity="1" x:Name="gridShadow" Visibility="Hidden">
<Canvas.Background>
<LinearGradientBrush x:Name="pageShadow" StartPoint="0 0" EndPoint="0 0">
<GradientStop Color="Transparent" Offset="0" />
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
<Grid x:Name="rectangleVisible">
<Grid.RenderTransform>
57
<TransformGroup>
<TranslateTransform x:Name="rectangleTranslate" />
<RotateTransform x:Name="rectangleRotate" />
</TransformGroup>
</Grid.RenderTransform>
<Grid.Clip>
<PathGeometry x:Name="clippingFigure">
<PathFigure IsClosed="True" />
</PathGeometry>
</Grid.Clip>
<!--Page 1 begin-->
<ContentPresenter x:Name="page1" />
<!--Page 1 end-->
<Canvas Opacity="0.7" x:Name="canvasReflection" Visibility="Hidden">
<Canvas.Background>
<LinearGradientBrush x:Name="pageReflection" StartPoint="0 0" EndPoint="0
0">
<GradientStop Color="Black" Offset="0" />
<GradientStop Color="White" Offset="0.35" />
<GradientStop Color="Transparent" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Grid>
</Grid>
</ContentControl>
58
ANEXA 3
<ItemsControl x:Class="WpfBookControls.Book"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfBookControls"
ClipToBounds="False" Loaded="OnLoaded" Width="500" Height="300"
>
<ItemsControl.Resources>
<DataTemplate x:Key="defaultDataTemplate">
<Grid>
<ContentControl Content="{Binding .}" />
</Grid>
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.Template>
<ControlTemplate TargetType="{x:Type local:Book}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50*" />
<ColumnDefinition Width="50*" />
</Grid.ColumnDefinitions>
<local:BookPage Grid.Column="0" Name="sheet0" IsTopRightCornerEnabled="false"
IsBottomRightCornerEnabled="false"
MouseDown="OnLeftMouseDown" PageTurned="OnLeftPageTurned" />
<local:BookPage Grid.Column="1" Name="sheet1" IsTopLeftCornerEnabled="false"
IsBottomLeftCornerEnabled="false"
MouseDown="OnRightMouseDown" PageTurned="OnRightPageTurned" />
</Grid>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="scale" ScaleX="1" ScaleY="1" />
<RotateTransform Angle="0" />
<TranslateTransform x:Name="translate" X="0" Y="0" />
</TransformGroup>
</ItemsControl.RenderTransform>
</ItemsControl>
59
ANEXA 4
<Window x:Class="WpfAppTezaDeLicenta.StartWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:WpfBookControls;assembly=WpfBookControls"
xmlns:local="clr-namespace:WpfAppTezaDeLicenta"
Title="StartUpWindow"
Height="Auto"
Width="Auto"
WindowStyle="None"
Background="Azure"
WindowStartupLocation="CenterScreen"
Icon="a.ico">
<Window.Resources>
<Style x:Key="GelButton"
TargetType="{x:Type Button}">
<Setter Property="Background"
Value="Black" />
<Setter Property="Height"
Value="40" />
<Setter Property="Foreground"
Value="White" />
<Setter Property="Margin"
Value="3" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Rectangle Name="GelBackground"
RadiusX="9"
RadiusY="9"
Fill="{TemplateBinding Background}"
StrokeThickness="0.35">
<Rectangle.Stroke>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Offset="0"
Color="White" />
<GradientStop Offset="1"
Color="#666666" />
</LinearGradientBrush>
</Rectangle.Stroke>
</Rectangle>
<Rectangle Name="GelShine"
Margin="2,2,2,0"
VerticalAlignment="Top"
RadiusX="6"
RadiusY="6"
Stroke="Transparent"
Height="15px">
<Rectangle.Fill>
60
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Offset="0"
Color="#ccffffff" />
<GradientStop Offset="1"
Color="Transparent" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<ContentPresenter Name="GelButtonContent"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Content="{TemplateBinding Content}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Rectangle.Fill"
TargetName="GelBackground">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Offset="0"
Color="Lime" />
<GradientStop Offset="1"
Color="DarkGreen" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground"
Value="Black" />
</Trigger>
<Trigger Property="IsPressed"
Value="True">
<Setter Property="Rectangle.Fill"
TargetName="GelBackground">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Offset="0"
Color="#ffcc34" />
<GradientStop Offset="1"
Color="#cc9900" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RoundedGelButton"
BasedOn="{StaticResource GelButton}"
TargetType="Button">
<Setter Property="Width"
Value="100" />
<Setter Property="Height"
Value="100" />
<Setter Property="Grid.Row"
Value="2" />
61
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Ellipse Name="GelBackground"
StrokeThickness="0.5"
Fill="Black">
<Ellipse.Stroke>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Offset="0"
Color="#ff7e7e7e" />
<GradientStop Offset="1"
Color="Black" />
</LinearGradientBrush>
</Ellipse.Stroke>
</Ellipse>
<Ellipse Margin="15,5,15,50">
<Ellipse.Fill>
<LinearGradientBrush StartPoint="0,0"
EndPoint="0,1">
<GradientStop Offset="0"
Color="#aaffffff" />
<GradientStop Offset="1"
Color="Transparent" />
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Name="GelButtonContent"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Content="{TemplateBinding Content}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="Rectangle.Fill"
TargetName="GelBackground">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Offset="0"
Color="Lime" />
<GradientStop Offset="1"
Color="DarkGreen" />
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground"
Value="Black" />
</Trigger>
<Trigger Property="IsPressed"
Value="True">
<Setter Property="Rectangle.Fill"
TargetName="GelBackground">
<Setter.Value>
<RadialGradientBrush>
<GradientStop Offset="0"
Color="#ffcc34" />
<GradientStop Offset="1"
Color="#cc9900" />
62
</RadialGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Foreground"
Value="Black" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Name="ButtonOfficeStyle"
Height="20"
Width="20"
Style="{StaticResource RoundedGelButton}"
HorizontalAlignment="Left"
Content="D"
Margin="3,3,0,3"
Grid.Row="0"
Grid.Column="0">
</Button>
<DockPanel Height="Auto"
Width="Auto"
Grid.Row="0"
Grid.Column="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Name="ButtonMinimize"
Grid.Column="0"
Height="20"
Width="Auto"
Style="{StaticResource GelButton}"
VerticalAlignment="Top"
HorizontalAlignment="Right"
Content=" Min "
Click="ButtonMinimize_Click">
</Button>
<Button Name="ButtonMaximize"
Grid.Column="1"
Height="20"
63
Width="Auto"
Style="{StaticResource GelButton}"
VerticalAlignment="Top"
HorizontalAlignment="Center"
Content=" Max "
Click="ButtonMaximize_Click">
</Button>
<Button Name="ButtonCloseApplication"
Grid.Column="2"
Height="20"
Width="Auto"
Style="{StaticResource GelButton}"
VerticalAlignment="Top"
HorizontalAlignment="Center"
Content=" Close "
Click="ButtonCloseApplication_Click">
</Button>
</Grid>
</DockPanel>
<DockPanel Height="Auto"
Width="Auto"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="2">
<DockPanel.Background>
<LinearGradientBrush StartPoint="0 0.4 "
EndPoint="1 0.6">
<GradientStop Offset="0"
Color="DarkGray" />
<GradientStop Offset="0.5"
Color="White" />
<GradientStop Offset="1"
Color="DarkGray" />
</LinearGradientBrush>
</DockPanel.Background>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<controls:Book x:Name="myBook"
Grid.Column="1"
Grid.ColumnSpan="2"
Margin="15">
<controls:Book.ItemTemplate>
<DataTemplate>
<Border BorderThickness="4"
BorderBrush="Gray"
64
Background="#FFE5E1EB">
<ContentControl Content="{Binding .}" />
</Border>
</DataTemplate>
</controls:Book.ItemTemplate>
<local:FrontPage></local:FrontPage>
<local:BlankPage></local:BlankPage>
<local:BlankPage></local:BlankPage>
<local:Cuprins1></local:Cuprins1>
<local:Cuprins2></local:Cuprins2>
<local:Page1></local:Page1>
<local:Page2></local:Page2>
<local:Page3></local:Page3>
<local:Page4></local:Page4>
<local:Page5></local:Page5>
<local:Page6></local:Page6>
…
<local:Page425></local:Page425>
<local:Page426></local:Page426>
<local:Page427></local:Page427>
<local:Page428></local:Page428>
<local:Page429></local:Page429>
<local:Page430></local:Page430>
<local:Page431></local:Page431>
<local:BackPage></local:BackPage>
</controls:Book>
<Button x:Name="EmptyButtonAutoPrevious"
Grid.Column="1"
Content="<"
HorizontalAlignment="Left"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Background="LightGray"
Opacity="0.5"
Height="50"
Click="ButtonAutoPrevious_Click" />
<Button x:Name="EmptyButtonAutoNext"
Grid.Column="2"
Content=">"
HorizontalAlignment="Right"
VerticalAlignment="Center"
VerticalContentAlignment="Center"
Background="LightGray"
Opacity="0.5"
Height="50"
Click="ButtonAutoNext_Click" />
</Grid>
</Viewbox>
</DockPanel>
</Grid>
</Window>
65