1. diel - Tlač formuláre a ovládacích prvkov Windows Forms
Vitajte u prvého dielu seriálu, ktorý vás uvedie do problematiky tlače formulára a ovládacích prvkov pod .NET. Tlač je realizovaný pomocou vlastnej dll knižnice pre jednotlivé formulárové prvky, možno teda odoslať celý formulár na tlačiareň. Výhoda tohto riešenia je jednoduchá väzba s užívateľským programom na báze .NET, ľahká rozšíriteľnosť o ďalšie ovládacie prvky - len dopísanie kódu pre ďalší prvok. Nevýhodou je vyššia zložitosť.
Vytlačený formulár má potom nasledujúce podobu:
Ukážka je rozdelená na tri samostatné časti:
- Užívateľská časť je ľubovoľný program písaný v C ++ / cli, C# alebo VB.NET.
- Druhou časťou je knižnica dll, riadiaca časť písaná v C #, tá sprostredkuje väzbu medzi používateľskú časťou a naším programom.
- Tretia časť je knižnica dll, výkonná časť, ktorá realizuje vlastné tlač. Je písaná v C ++ / clr: safe.
Mnoho z vás iste namietne prečo nemožno všetky časti spojiť v jediný
soubor.exe az akého dôvodu používam dve knižnice dll. Dôvod je úplne
prostý. Ak všetok kód bude realizovaný v jednom súbore,
jeho použitie je problematické a zmena kódu je veľmi obtiažna. Toto
rozdelenie má výhody, že ak chceme do programu pridať ďalšie ovládací
prvok, nezmeníme pôvodné už napísaný kód knihoven.dll, ani vlastného
súboru (exe).
Prečo je jedna knižnice písaná v C# a druhá v C ++ / clr? Jeden z dôvodov je opomíjenost C ++ / clr. Pre činnosť je úplne jedno, či dll knižnice vytvoríme v C #, C ++ / clr alebo VB.NET. Chcem ukázať ako písať pod C ++ / clr. Táto ukážka neobsahuje bloky "try {....} catch {.....} finally {...}", nie sú použité premenné typu "var". V každom dieli je priložený zdrojový text, písaný vo Visual Studiu 2010. Som si vedomý, že mnohí používatelia nemajú možnosť tento kód načítať (VS2005, VS2008), preto sa budem snažiť hlavnej časti kódu popísať v tomto tutoriálu.
Ako sú vytvárané formuláre
- Každý formulár má vlastnosť Size (Width, Height), tá znamená veľkosť formulára v pixeloch.
- Pokiaľ má formulár vlastnosť Padding (Left, Top, Right, Button), to je veľkosť vnútornej medzery, pozadia formuláre v medzere je prevažne vyplnené Color.White. Preto vyplníme ako prvý celý vnútrajšok touto farbou. My nepoznáme veľkosť padding, ktorý používateľ nastaví.
- Uložíme novú veľkosť formulára, ktorá bude zmenšená o oblasť padding.
- Nová veľkosť bude vyplnená farbou pozadia BackColor.
- Na túto farbu pozadia nakreslíme obrázok pozadia, ak existuje BackgroundImage, jeho veľkosť a tvar sú určené rozložením BacgroundImageLayout (None, Title, Center, Stretch, Zoom).
- Ďalšie krokom bude vykreslenie obrázka Image. Ak existuje jeho zarovnanie, je dané vlastnosťou ImageAlign (topleft, ........ BottomRight).
- Vykonáme úpravu písma Font a nastavíme jeho farbu vlastnosť ForeColor.
- Pokiaľ má ovládací prvok vlastnosť Multiline (text rozdelený do viacerých riadkov), úprava textu sa bude líšiť od jednoriadkového textu. Niektoré ovládacie prvky majú vlastnosť TextAlign (Left, Right, Center), potom vykonáme formátovanie textu pomocou funkcie HorizontalAlignment (TextAlign). Ak majú vlastnosť TextAlign (topleft ..... BottomRight), bude vykonané formátovanie textu pomocou funkcie ContentAlignment (TextAlign).
- Ak ovládací prvok nemá vlastnosť Multiline alebo je táto vlastnosť false, potom musíme orezať text. Nesmie presahovať veľkosť Width zobrazovanej plochy formulára.
- Vykreslíme text.
- Vykreslíme ohraničenie formuláre BorderStyle (FixedSingle, Fixed3D, None), ak existuje, v pôvodnej veľkosti Size.
Pre tlač LineShape, OvalShape a RectangleShape musíme mať knižnicu:
Microsoft.VisualBasic.PowerPacks.Vs, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a Location: C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\ File : Microsoft.VisualBasic.PowerPacks.Vs.dll
Ak túto knižnicu nemáme, stiahneme ju z nasledujúceho umiestnenia: Microsoft.VisualBasic.PowerPacks.Vs Táto knižnica je súčasťou VS 2010 (ak sa nemýlim).
Vytvoríme si tri projekty
- VS -> Súbor -> Nový projekt -> Visual C# -> Windows -> Formulárová aplikácie Windows.
- Pre VS 10 nastavíme .NET framework 4, názov ľubovoľný, na príklad FormPrintDemo.
- VS -> Súbor -> Pridať -> Nový projekt -> Visual C# -> Windows -> Knižnica tried.
- Pre VS 10 nastavíme .NET framework 4, názov ľubovoľný, na príklad MyClass1.
- VS -> Súbor -> Pridať -> Nový projekt -> Iné jazyky -> Visual C ++ -> CLR -> Class librám.
- Pre VS 10 nastavíme .NET framework 4, názov ľubovoľný, na príklad MyClass2.
Kostru našej demo aplikácie máme hotovú. Ak vlastníme inú verziu Visual Studia, postupujeme podobne.
Úpravy v class Form1
- Presunieme sa na Form1 (návrh) a nastavíme vlastnosť Size (950; 600)
- Do pravého dolného rohu pridáme Button a do textu napíšeme Tlač.
- Nad Button pridáme checkbox a do textu napíšeme Rámček.
- Dvakrát klikneme na Button a prejdeme do okna zobrazenia kódu.
- Presunieme sa na Prieskumník riešenia -> FormPrintDemo -> Závislosti projektu
- Presunieme sa na Prieskumník riešenia -> FormPrintDemo -> Odkazy -> Pridať odkaz
- Označíme MyClass1 a MyClass2, viď obrázok.
- Presunieme sa na Prieskumník riešenia -> MyClass1 -> Odkazy -> Pridať odkaz
- Pridáme odkaz na System.Windows.Forms.
Kód upravíme takto
//Přejdeme na MyClass1 - Class1 - Zobrazit kód using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace FormPrintDemo { public class Class1 { public Class1(Control ctrl){} public bool Ohraniceni { get; set; } public void MyPrint(){} } } //Tato úprava je nutná pro doplnění naší exe aplikace platným kódem //Přejdeme na FormPrintDemo -> Form1 -> Zobrazit kód using System; using System.Windows.Forms; namespace FormPrintDemo { public partial class Form1 : Form { private FormPrintDemo.Class1 fp; public Form1() { InitializeComponent(); //tím, že do kostruktoru třídy Class1 vložíme <b>this</b> předáme třídě //kopii třídy Form1 fp = new FormPrintDemo.Class1(this);//reference na knihovnu tříd this.checkBox1.Checked = false; //platné ohraničení } //Kliknutím na Button se zahájí tisk private void button1_Click(object sender, EventArgs e) { this.Visible = true; fp.Ohraniceni = this.checkBox1.Checked; fp.MyPrint(); } }//class }//namespace
Žiadny ďalší kód na tento formulár nebudeme písať. Tu máme hotovo, len budeme na formulár pridávať ovládacie prvky.
V kolekcii System.Windows.Forms.Control sú uložené všetky ovládacie prvky a ich nastavenia vrátane vlastností samotného formulára.
Pokračujeme a dostávame sa k prvej dll, riadiaca logika nášho tutoriálu.
Prvý dll knižnica
Vykonáme malú úpravu projektu, prejdeme do MyClass1 -> Properties -> AssemblyInfo -> Zobraziť kód.
using System.Reflection; using System.Runtime.InteropServices; using System; //stávající kód ponechat //doplnit můžeme jako poslední řádek kódu . //Označuje, zda je prvek programu kompatibilní se specifikace CLS (Common Language). [assembly: CLSCompliant(true)]
Teraz začíname písať kód do MyClass1 -> Zobraziť kód. Ako prvý vytvoríme sekciu globálnych (presnejšie inštančných) premenných triedy MyClass1. Ak to pôjde, vždy budeme používať generické kolekcie triedy: List <T>.
#region "sekce globálních proměnných" public enum ParentControlPrinting { BeforeChilds = 0, AfterChilds = 1 } private List<string> deletePrintControl; private Rectangle RecRodic = new Rectangle(0, 0, 0, 0); private DelegateforControls delegateforControls = new DelegateforControls(); private List<DelegateforControls> delegatesforControls; private Control control = null; private Graphics graphics = null ; #endregion #region "sekce delegátů, struktur " // Struktura DelegateforControls v generické kolekci List (šablona) private struct DelegateforControls { internal string Typ { get; set; } //Třída ovládacího prvku internal ControlPrinting PrintFunction { get; set; } //volaná funkce } //delegovat poskytování funkcí tisku podle typu public delegate void ControlPrinting ( Control control, ParentControlPrinting typePrint, int locationX, int locationY, out bool scanForChildControls ); #endregion
Upravíme odkazy v triede MyClass1:
using System; using System.Drawing.Printing; using System.Linq; using System.Windows.Forms; using System.Collections.Generic; using Pavluzd.Depict; using System.Drawing;
Vložíme funkciu pre načítanie delegáta:
// Prvky folmuláře , které mají být vytištěny private void AddDelegateToPrintControl(string strType, ControlPrinting printFunction) { delegateforControls.Typ = strType; delegateforControls.PrintFunction = printFunction; delegatesforControls.Add(delegateforControls); }
Pokračovať budeme v budúcom diele.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 129x (748.49 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#