IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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:

vytlačený formulár - Okenné aplikácie v C # .NET vo Windows Forms

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 BacgroundImage­Layout (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.
Začíname

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.Visu­alBasic.Power­Packs.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.Window­s.Forms.
VS – Prieskumník riešenie - Okenné aplikácie v C # .NET vo Windows Forms
Závislosti nášho exe súboru. - Okenné aplikácie v C # .NET vo Windows Forms
Referencie projektu - Okenné aplikácie v C # .NET vo Windows Forms
Referencie .Net - Okenné aplikácie v C # .NET vo 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.Window­s.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#

 

Všetky články v sekcii
Okenné aplikácie v C # .NET vo Windows Forms
Článok pre vás napísal zpavlu
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
C# , C++ a assembler
Aktivity