Lekce 1 - Tisk formuláře a ovládacích prvků Windows Forms
Vítejte u prvního dílu seriálu, který vás uvede do problematiky tisku formuláře a ovládacích prvků pod .NET. Tisk je realizován pomocí vlastní dll knihovny pro jednotlivé formulářové prvky, lze tedy odeslat celý formulář na tiskárnu. Výhoda tohoto řešení je snadná vazba s uživatelským programem na bázi .NET, snadná rozšiřitelnost o další ovládací prvky - pouze dopsání kódu pro další prvek. Nevýhodou je vyšší složitost.
Vytištěný formulář má poté následující podobu:

Ukázka je rozdělena na tři samostatné části:
- Uživatelská část je libovolný program psaný v C++/cli, C# nebo VB.NET.
- Druhou částí je knihovna dll, řídící část psaná v C#, ta zprostředkuje vazbu mezi uživatelskou částí a naším programem.
- Třetí část je knihovna dll, výkonná část, která realizuje vlastní tisk. Je psaná v C++/clr:safe.
Mnoho z vás jistě namítne proč nelze všechny části spojit v jediný
soubor.exe a z jakého důvodu používám dvě knihovny dll. Důvod je zcela
prostý. Pokud veškerý kód bude realizován v jediném souboru,
jeho použití je problematické a změna kódu je velmi obtížná. Toto
rozdělení má výhody, že pokud chceme do programu přidat další ovládací
prvek, nezměníme původní již napsaný kód knihoven.dll, ani vlastního
souboru (exe).
Proč je jedna knihovny psaná v C# a druhá v C++/clr? Jeden z důvodů je opomíjenost C++/clr. Pro činnost je úplně jedno, zda dll knihovny vytvoříme v C# , C++/clr nebo VB.NET. Chci ukázat jak psát pod C++/clr. Tato ukázka neobsahuje bloky "try{....} catch{.....} finally{...}", nejsou použity proměnné typu "var". V každém dílu je přiložen zdrojový text, psaný ve Visual Studiu 2010 . Jsem si vědom, že mnozí uživatelé nemají možnost tento kód načíst (VS2005, VS2008), proto se budu snažit hlavní části kódu popsat v tomto tutoriálu.
Jak jsou vytvářeny formuláře
- Každý formulář má vlastnost Size(Width,Height), ta znamená velikost formuláře v pixelech.
- Pokud má formulář vlastnost Padding(Left,Top,Right,Button), to je velikost vnitřní mezery, pozadí formuláře v mezeře je převážně vyplněno Color.White. Proto vyplníme jako první celý vnitřek touto barvou. My neznáme velikost Paddingu, který uživatel nastaví.
- Uložíme novou velikost formuláře, která bude zmenšená o oblast Paddingu.
- Nová velikost bude vyplněna barvou pozadí BackColor.
- Na tuto barvu pozadí nakreslíme obrázek pozadí, pokud existuje BackgroundImage, jeho velikost a tvar jsou určeny rozložením BacgroundImageLayout(None, Title, Center, Stretch, Zoom).
- Další krokem bude vykreslení obrázku Image. Pokud existuje jeho zarovnání, je dané vlastností ImageAlign(TopLeft ,........ BottomRight ).
- Provedeme úpravu písma Font a nastavíme jeho barvu vlastnost ForeColor.
- Pokud má ovládací prvek vlastnost Multiline (text rozdělen do více řádků), úprava textu se bude lišit od jednořádkového textu. Některé ovládací prvky mají vlastnost TextAlign (Left, Right, Center), pak provedeme formátování textu pomocí funkce HorizontalAlignment(TextAlign). Pokud mají vlastnost TextAlign(TopLeft ..... BottomRight), bude provedeno formátování textu pomocí funkce ContentAlignment(TextAlign).
- Pokud ovládací prvek nemá vlastnost Multiline nebo je tato vlastnost false, pak musíme ořezat text. Nesmí přesahovat velikost Width zobrazované plochy formuláře.
- Vykreslíme text.
- Vykreslíme ohraničení formuláře BorderStyle (FixedSingle, Fixed3D, None
), pokud existuje, v původní
velikosti Size.
Začínáme
Pro tisk LineShape, OvalShape a RectangleShape musíme mít knihovnu:
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
Pokud tuto knihovnu nemáme , stáhneme ji z následujícího umístění: Microsoft.VisualBasic.PowerPacks.Vs Tato knihovna je součástí VS 2010 (pokud se nepletu).
Vytvoříme si tři projekty
- VS -> Soubor -> Nový projekt -> Visual C# -> Windows -> Formulářová aplikace Windows.
- Pro VS 10 nastavíme .NET framework 4, název libovolný, na příklad FormPrintDemo.
- VS -> Soubor -> Přidat -> Nový projekt -> Visual C# -> Windows -> Knihovna tříd.
- Pro VS 10 nastavíme .NET framework 4, název libovolný, na příklad MyClass1.
- VS -> Soubor -> Přidat -> Nový projekt -> Jiné jazyky -> Visual C++ -> CLR -> Class Libray.
- Pro VS 10 nastavíme .NET framework 4, název libovolný, na příklad MyClass2.
Kostru naší demo aplikace máme hotovou. Pokud vlastníme jinou verzi Visual Studia, postupujeme podobně .
Úpravy v class Form1
- Přesuneme se na Form1 (návrh) a nastavíme vlastnost Size (950;600)
- Do pravého dolního rohu přidáme Button a do textu napíšeme Tisk.
- Nad Button přidáme CheckBox a do textu napíšeme Rámeček.
- Dvakrát klikneme na Button a přejdeme do okna zobrazení kódu.
- Přesuneme se na Průzkumník řešení -> FormPrintDemo -> Závislosti projektu
- Přesuneme se na Průzkumník řešení -> FormPrintDemo -> Odkazy -> Přidat odkaz
- Označíme MyClass1 a MyClass2, viz obrázek.
- Přesuneme se na Průzkumník řešení -> MyClass1 -> Odkazy -> Přidat odkaz
- Přidá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
Žádný další kód na tento formulář nebudeme psát. Zde máme hotovo, pouze budeme na formulář přidávat ovládací prvky.
V kolekci System.Windows.Forms.Control jsou uloženy veškeré ovládací prvky a jejich nastavení včetně vlastností samotného formuláře.
Pokračujeme a dostáváme se k první dll, řídící logika našeho tutoriálu.
První dll knihovna
Provedeme malou úpravu projektu, přejdeme do MyClass1 -> Properties -> AssemblyInfo -> Zobrazit 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)]
Nyní začínáme psát kód do MyClass1 -> Zobrazit kód. Jako první vytvoříme sekci globálních (přesněji instančních) proměnných třídy MyClass1. Pokud to půjde, vždy budeme používat generické kolekce třídy: 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 ve třídě 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 funkci pro načtení 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čovat budeme v příštím díle.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 129x (748.49 kB)
Aplikace je včetně zdrojových kódů v jazyce C#