Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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:

Vytištěný formulář - Tisk celých formulářů ve Windows Forms

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,Rig­ht,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 BacgroundImage­Layout(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 HorizontalAlig­nment(TextAlig­n). Pokud mají vlastnost TextAlign(TopLeft ..... BottomRight), bude provedeno formátování textu pomocí funkce ContentAlignmen­t(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.Visu­alBasic.Power­Packs.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.Window­s.Forms.
VS – Průzkumník řešení - Tisk celých formulářů ve Windows Forms
Závislosti našeho exe souboru . - Tisk celých formulářů ve Windows Forms
Reference projektu - Tisk celých formulářů ve Windows Forms
Reference .Net - Tisk celých formulářů ve 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.Window­s.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#

 

Všechny články v sekci
Tisk celých formulářů ve Windows Forms
Přeskočit článek
(nedoporučujeme)
Tisk formuláře a ovládacích prvků Windows Forms
Článek pro vás napsal zpavlu
Avatar
Uživatelské hodnocení:
3 hlasů
C# , C++ a assembler
Aktivity