Úvod do grafiky

13. díl - Úvod do grafiky

Tomáš Herceg       27.08.2007       C#, VB.NET, Grafika, .NET       25456 zobrazení

V tomto díle se podíváme na základy grafiky, ukážeme si jednoduché geometrické tvary - obdélníky, elipsy atd., používání výplní (šrafování a přechod barev). Také si na úvod řekněme něco o jmenných prostorech.

V jubilejním 13. díle našeho seriálu pro začátečníky se naučíme, jak vykreslovat základní geometrické obrazce a jednoduché grafické útvary. Jelikož jsme v tutoriálu pro začátečníky, nebudu zabíhat do podrobností. Těm se totiž věnujiv článcích ze seriálu Programujeme hry, který najdete také na tomto serveru. V tomto díle tedy ukážu jen úplné základy a vysvětlím trochu teorie. Ještě doplním, že budeme používat grafické rozhraní GDI+, což je základní grafické prostředí implementované v .NET frameworku.

Jmenné prostory

.NET framework má jednu velmi dobrou a užitečnou vlastnost - přehlednou strukturu tříd a funkcí. To zajišťují tzv. namespaces, česky bychom mohli říci jmenné prostory. Používali jsme již dříve, ale nevysvětloval jsem, jak fungují. Nyní je na to ta správná chvíle. Namespace sdružuje třídy, funkce, struktury apod., které spolu nějak logicky souvisí. V .NET frameworku je základním jmenným prostorem System. Ten se dělí na několik částí, z nichž zmíním ty nejpoužívanější:

  • System
    • Data - vše, co se týká databází a práce s daty
    • Drawing - vše, co se týká grafiky a vykreslování
    • IO - vše, co se týká práce se souborovým systémem
    • Net - vše, co se týká síťové komunikace, např. TCP/IP, UDP, ale i HTTP, FTP protokoly, e-mail atd.
    • Security - vše, co se týká zabezpečení
      • Cryptography - funkce pro šifrování
    • Text - vše, co se týká práce s textem (StringBuilder, regulární výrazy, kódování a znakové sady)
    • Web - prakticky celé ASP.NET
    • Windows
      • Forms - komponenty, formuláře atd.
    • Xml - vše, co se týká práce s dokumenty XML, jejich šablonami a schématy

Pokud chci použít funkci z nějakého namespace, mám několik možností. Vždy můžeme vypsat celou cestu (úrovně se oddělují tečkou) - tzn. např. System.Windows.Forms.Button. Takto bychom se ale asi nikam nedostali, pořád všechno vypisovat není ideální řešení.

Proto existuje v jazyce Visual Basic .NET klíčové slovo Imports, za kterým následuje cesta k nějakému namespace. Řádky Imports se píší do každého souboru úplně nahoru, před deklaraci jakékoliv třídy. Jakmile mám nějaký namespace naimportovaný, nemusím vypisovat celou cestu. Pokud tedy naimportuji System.Windows.Forms, můžu pak klidně napsat Dim b As New Button(). Visual Basic pak prohledá všechny naimportované jmenné prostory, pokud nikde datový typ či třídu nenajde, vyhodí chybu.

Možná je vám divné, že tohle fungovalo i bez klíčového slova Imports. Máte pravdu. Pokud otevřete vlastnosti projektu, na záložce References uvidíte dva seznamy.

Záložka References ve vlastnostech projektu

V horním seznamu jsou knihovny, které naše aplikace vyžaduje. Tlačítkem Add můžeme přidat další knihovny a využívat i jejich funkce. To nás nyní ale moc nezajímá. Hlavní je spodní seznam Imported Namespaces, ve kterém jsou zaškrtnuty jmenné prostory, které jsou naimportovány automaticky. Pokud chceme naimportovat nějaký další, můžeme jej zaškrtnout zde. Je to vhodné zejména v případě, že jej chcete využívat ve více (téměř všech) souborech. Pokud jej potřebujeme použít pouze v jednom či dvou souborech, doporučuji spíše použít klíčové slovo Imports. Občas se totiž stane, že ve dvou jmenných prostorech jsou dvě třídy nebo funkce se stejným názvem. Při použití je tedy nutné použít celou cestu nebo její část (např. Forms.Button, ale jen pokud máme naimportováno System.Windows).

Kdokoliv si může vytvořit i svůj vlastní namespace, často se to využívá ve firmách (každá firma většinou používá svůj namespace, který mívá nějakou vnitřní strukturu, do nějž zařazují veškeré své knihovny a třídy). Deklaraci třídy můžeme "obklíčit" řádky Namespace XY.Z a End Namespace, čímž řekneme, že se třída nachází ve jmenném prostoru XY.Z. Samozřejmě není nutné, aby všechny třídy byly ve stejném souboru mezi řádky Namespace a End Namespace, stačí každou třídu, ať je kdekoliv, uzavřít do namespace se stejným názvem, kde ji poté také najdeme.

Dost už teorie, jdeme kreslit

Pokud jste přetrpěli nudnou část o jmenných prostorech, vězte, že odteď to již bude zábavnější a plné obrázků. Ještě před tím si ale povíme něco o objektu System.Drawing.Graphics, což je prakticky ten nejdůležitější objekt, pokud mluvíme o vykreslování. Tento objekt reprezentuje jakési kreslící plátno, na které můžeme vykreslovat jak základní geometrické tvary (čára, obdélník, elipsa, část obvodu elipsy apod.), ale i např. text. Celé plátno má daleko více funkcí, ty však v tomto článku probrat nestihneme. Ukážeme si tedy jen základní geometrické tvary a výplně.

Vytvořte si ve Visual Basic .NET nový projekt (jako vždy Windows Application) a ihned se přepněte do okna kódu (např. klávesovou zkratkou F7). V horních rozbalovacích seznamech nalistujte Form 1 Events a Paint, čímž vytvoříme proceduru události Paint formuláře. S touto událostí jsme ještě nepracovali, nastane vždy, když je potřeba obsah okna znovu vykreslit. Pokud máme normální okno, které je již na obrazovce, a nakreslíme na něj něco, ihned se informace zobrazí. Pokud ale otevřeme jiné okno a zakryjeme jím část prvního okna, po jejím odkrytí je potřeba obsah vykreslit znovu (Windows XP a nižší si totiž vykreslovaný obsah okna nepamatují, na Windows Vista se v tomto případě událost nevyvolá). Překreslení je také potřeba, pokud jsme okno minimalizovali a pak znovu zobrazili. Ve všech těchto případech se zavolá událost Paint, ve které bychom měli zajistit vykreslení obsahu okna.

Pokud se podíváme na záhlaví události Paint, můžeme si všimnout, že něco je jinak. Druhý parametr e není typu System.EventArgs, jak tomu bývá jinde, ale je typu System.Windows.Forms.PaintEventArgs. To proto, že obsahuje objekt Graphics, na který budeme vykreslovat, a pár dalších informací (pro nás zatím nepodstatných).

Zkuste tedy do procedury vepsat tento řádek:

e.Graphics.Clear(Color.Yellow)

Pokud program spustíte, obsah okna bude žlutý. Toto chování by se samozřejmě dalo nastavit i vlastností BackColor, ale já jsem chtěl demostrovat metodu Clear objektu Graphics. Ta smaže vše, co bylo vykresleno na okně, a obarví to předanou barvou. Jak vidíme, Color je struktura, která obsahuje spoustu již předdefinovaných barev, které můžeme využít. Stačí napsat Color.Yellow a máme žlutou.

Metody DrawLine, DrawRectangle a DrawEllipse

Pro vykreslení základních geometrických tvarů čára, obdélník a elipsa nám objekt Graphics nabízí metody DrawLine, DrawRectangle a DrawEllipse. Všechny tyto metody vyžadují jako první parametr hodnotu typu Pen, která reprezentuje pero, kterým tvar kreslíme. Máme opět předdefnovanou širokou paletu standardních kreslících per, můžeme si ale vytvořit své vlastní a specifikovat mu např. tloušťku a vzorek (plná čára, přerušované čárky, čerchovaně, tečičky atd.). Vytvoříme tedy modré pero tloušťky 3.

Dim p As New Pen(Color.Blue, 3)

Ještě než začneme kreslit tvary, musíme si něco říci o souřadnicích. Protože obrazovka je dvojrozměrná, máme dvě souřadnicové osy X a Y. Výsledný obraz na obrazovce se skládá z tzv. pixelů, česky obrazových bodů. Každý pixel může mít právě jednu barvu, protože pixely jsou malé a je jich hodně, ve výsledku dávají celistvý obraz.

Souřadnicový systém

Počátek souřadnickvé osy je v horním levém rohu formuláře. Osa X je vodorovná a roste směrem doprava, osa Y je svislá a roste směrem dolů. Každý pixel je jednoznačně určen souřadnicemi [X, Y], kde hodnoty X, Y jsou kladná celá čísla. Jednotkou je samozřejmě jeden pixel.

DrawLine

Pokud tedy do události Paint zapíšete tyto řádky, vykreslí se čára. První parametr je pero, druhý a třetí jsou souřadnice X a Y prvního konce úsečky a čtvrtý a pátý parametr jsou souřadnice druhého konec úsečky.

        Dim p As New Pen(Color.Blue, 3)
        e.Graphics.DrawLine(p, 20, 120, 250, 50)

Vykreslená čára z bodu [20,120] do bodu [250,50]

DrawRectangle

Pokud potřebujeme vykreslit obdélník (čtverec je speciální druh obdélníku), máme na to funkci DrawRectangle. Prvním parametrem je opět pero, druhým a třetím jsou souřadnice horního levého rohu obdélníka a čtvrtým a pátým parametrem je šířka a výška obdélníka.

        Dim p As New Pen(Color.Salmon, 3)
        e.Graphics.DrawRectangle(p, 20, 20, 150, 100)

Obrázek s obdélníkem z bodu [20,20], šířkou 150 a výškou 100 pixelů.

DrawEllipse

Touto metodou vykreslíme elipsu (kružnice je zvláštní druh elipsy). Prvním parametrem je klasicky pero, další parametry jsou stejné, jako u obdélníka. Vymezují tedy obdélník, do nějž se elipsa vepíše.

        Dim p As New Pen(Color.Indigo, 3)
        e.Graphics.DrawEllipse(p, 20, 20, 150, 100)

Elipsa vepsaná do předchozího obdélníka

Odbočka - přetěžování metod

Možná jste si všimli, že když zapisujete tyto metody, Visual Studio zobrazuje nápovědu se seznamem parametrů a jejich popisem. Možná vám neunikla minitlačítka nahoru a dolů, které přepínají různé sady parametrů. Díky této pomůcce se dostáváme k termínu přetěžování. Je to v .NET frameworku poměrně využívaná záležitost.

Inteligentní nápověda Visual Studia

Pokud deklarujete proceduru či funkci, můžete ji nadeklarovat vícekrát pro různé datové typy a počty argumentů. Jako příklad napíši proceduru pro dělení - pokud předáme datové typy Integer, vydělíme celočíselně, pokud předáme Double, vydělíme normálně (výsledkem bude desetinné číslo).

    Overloads Function Vydel(ByVal a As Integer, ByVal b As Integer) As Integer
        Return a \ b
    End Function

    Overloads Function Vydel(ByVal a As Double, ByVal b As Double) As Double
        Return a / b
    End Function

 Všimněte si klíčového slova Overloads, které označuje, že se jedná o přetíženou metodu. Ve skutečnosti tam být nemusí, ale je dobrým programátorským zvykem jej používat, aby bylo hned jasné, že máme více možností, jak metodu použít.

Velmi často se přetížení používá tak, že máme funkční kód pouze v jedné variantě a ostatní varianty pouze něco provedou s argumenty (např. je převedou) a zavolají první metodu, která kód obsahuje. Bylo by totiž zbytečné vypisovat prakticky stejný kód na víc míst, vždy je lepší se tomu vyvarovat.

Point a Rectangle

V souvislosti s přetížením metod DrawLine, DrawEllipse a DrawRectangle je nasnadě ukázat si dva datové typy (struktury), které usnadňují práci s body a obdélníky. Jsou jimi Point a Rectangle. Nejde o nic jiného než o struktury, které obsahují několik vlastností. Point je bod a obsahuje vlastnosti X a Y, což jsou jeho souřadnice. Rectangle je obdélník, který má vlastnosti Left, Top (souřadnice X, resp. Y) a Width, Height (šířka a výška). Výhodou je, že je můžeme i snadno vytvořit - stačí napsat New Point(20, 20) či New Rectangle(10, 10, 30, 50). Tyto datové typy se hodí, pokud potřebujete např. ve funkci vracet právě obě souřadnice bodu, nebo 4 údaje pro obdélník.

Existují ještě datové typy PointF a RectangleF, které jsou téměř stejné, až na to, že podporují desetinná čísla.

Výplně a vybarvování

Tři metody, které jsme si právě ukázali, kreslily pouze tvar. Pokud chceme vybarvit obdélník či elipsu, máme k tomuto účelu metody FillRectangle a FillEllipse. Liší se pouze prvním parametrem - není jím Pen, ale Brush (štětec). Zde máme opět široké pole působnosti - buď můžeme využít fádní předdefinované štětce, které jednolitě vyplní celou plochu, nebo si můžeme vytvořit vlastní šrafovací štětce či štětce, které dané místo vyplní přechodem barev.

Jednoduchý štětec plné barvy je reprezentován třídou SolidBrush. Předáme jí akorát barvu štětce. Máme kromě toho také předdefinovanou sadu štětců (Brushes.Green je prakticky to samé).

Pokud budu tedy chtít vybarvit elipsu zeleně, stačí mi tento kód:

        Dim b As New SolidBrush(Color.Green)
        e.Graphics.FillEllipse(b, 20, 20, 150, 100)

Vybarvená elipsa

Pokud chceme oblast vyšrafovat, použijeme Drawing2D.HatchBrush. Pokročilejší štětce jsou v namespace System.Drawing.Drawing2D. V konstruktoru zvolíme styl z výběru, barvu popředí a barvu pozadí, a pak jen vybarvíme elipsu.

        Dim b As New Drawing2D.HatchBrush(Drawing2D.HatchStyle.DiagonalCross, Color.DarkSlateBlue, Color.Yellow)
        e.Graphics.FillEllipse(b, 50, 50, 100, 100)

Vyšrafovaná elipsa

Jako poslední štětec si ukážeme LinearGradientBrush, který vyplní danou oblast plynulým přechodem dvou barev. V konstruktoru zadáme dva body (musíme použít datový typ PointF) a dvě barvy. a prvním bodu bude první barva, na druhém bude druhá barva, a ostatní body se vyplní příslušnou kombinací dvou barev ve správném poměru.

        Dim b As New Drawing2D.LinearGradientBrush(New PointF(20, 20), New PointF(120, 120), Color.Yellow, Color.Green)
        e.Graphics.FillRectangle(b, 20, 20, 100, 100)

Barevný přechod

To je pro dnešek vše, v příštím díle ještě budeme pokračovat s grafikou a napíšeme si jednoduchou aplikaci, která bude vykreslovat jednoduché sloupcové a čárové grafy.

 

hodnocení článku

2 bodů / 2 hlasů       Hodnotit mohou jen registrované uživatelé.

 

 

 

Nový příspěvek

 

Mr.

1'

csharp|

xml|

css|


'

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

diskuse: úvod do grafiky

Dobrý dden,

četl jsem váš článek a velmi mne zaujal, zkusil jsem vykreslit "pruhovaného sněhuláka" (viz. program níže), tak aby byl celý takto pruhovaný až do středů jednotlivých kruhů, musíte uznat že je tento program opravdu velmi dlouhý...

Public Class Form1

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub Form1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint

Dim a As New Pen(Color.DarkBlue, 4)

Dim b As New Pen(Color.LightBlue, 4)

e.Graphics.DrawEllipse(a, 50, 0, 150, 150)

e.Graphics.DrawEllipse(a, 25, 150, 200, 200)

e.Graphics.DrawEllipse(a, 0, 350, 250, 250)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 66, 16, 118, 118)

e.Graphics.DrawEllipse(a, 41, 166, 168, 168)

e.Graphics.DrawEllipse(a, 16, 366, 218, 218)

e.Graphics.DrawEllipse(b, 70, 20, 110, 110)

e.Graphics.DrawEllipse(b, 45, 170, 160, 160)

e.Graphics.DrawEllipse(b, 20, 370, 210, 210)

e.Graphics.DrawEllipse(a, 50, 0, 150, 150)

e.Graphics.DrawEllipse(a, 25, 150, 200, 200)

e.Graphics.DrawEllipse(a, 0, 350, 250, 250)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 50, 0, 150, 150)

e.Graphics.DrawEllipse(a, 25, 150, 200, 200)

e.Graphics.DrawEllipse(a, 0, 350, 250, 250)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 66, 16, 118, 118)

e.Graphics.DrawEllipse(a, 41, 166, 168, 168)

e.Graphics.DrawEllipse(a, 16, 366, 218, 218)

e.Graphics.DrawEllipse(b, 70, 20, 118, 118)

e.Graphics.DrawEllipse(b, 45, 170, 168, 168)

e.Graphics.DrawEllipse(b, 20, 370, 218, 218)

e.Graphics.DrawEllipse(a, 50, 0, 150, 150)

e.Graphics.DrawEllipse(a, 25, 150, 200, 200)

e.Graphics.DrawEllipse(a, 0, 350, 250, 250)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 66, 16, 118, 118)

e.Graphics.DrawEllipse(a, 41, 166, 168, 168)

e.Graphics.DrawEllipse(a, 16, 366, 218, 218)

e.Graphics.DrawEllipse(b, 70, 20, 118, 118)

e.Graphics.DrawEllipse(b, 45, 170, 168, 168)

e.Graphics.DrawEllipse(b, 20, 370, 218, 218)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 66, 16, 118, 118)

e.Graphics.DrawEllipse(a, 41, 166, 168, 168)

e.Graphics.DrawEllipse(a, 16, 366, 218, 218)

e.Graphics.DrawEllipse(b, 70, 20, 118, 118)

e.Graphics.DrawEllipse(b, 45, 170, 168, 168)

e.Graphics.DrawEllipse(b, 20, 370, 218, 218)

e.Graphics.DrawEllipse(a, 50, 0, 150, 150)

e.Graphics.DrawEllipse(a, 25, 150, 200, 200)

e.Graphics.DrawEllipse(a, 0, 350, 250, 250)

e.Graphics.DrawEllipse(b, 54, 4, 142, 142)

e.Graphics.DrawEllipse(b, 29, 154, 192, 192)

e.Graphics.DrawEllipse(b, 4, 354, 242, 242)

e.Graphics.DrawEllipse(a, 58, 8, 134, 134)

e.Graphics.DrawEllipse(a, 33, 158, 184, 184)

e.Graphics.DrawEllipse(a, 8, 358, 234, 234)

e.Graphics.DrawEllipse(b, 62, 12, 126, 126)

e.Graphics.DrawEllipse(b, 37, 162, 176, 176)

e.Graphics.DrawEllipse(b, 12, 362, 226, 226)

e.Graphics.DrawEllipse(a, 66, 16, 118, 118)

e.Graphics.DrawEllipse(a, 41, 166, 168, 168)

e.Graphics.DrawEllipse(a, 16, 366, 218, 218)

End Sub

End Class

Drosím vás tedy o radu jak tento program zkrátit.

Děkuji předem

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Diskuse: Úvod do grafiky

Dobrý den,

zdá se mi, že název proměnné "p" v prvním příkladu nebyl zvolen zrovna šťastně. Nejsem schopen ho napsat do grafického příkazu.

Jakmile napíšu p a za ním čárku, automaticky se text doplní takto:

e.Graphics.DrawRectangle(Pens.PaleGoldenrod,

Dokonce i s dvoupísmennou proměnnou začínající "p" se to chová stejně. Musím použít alespoň 4 písmennou proměnnou abych měl jistotu že mi to automatické dokončování nepřepíše. Pravděpodobně to bude nějaká nová vlastnost editoru, která se v době psaní článku chovala jinak. Už jsem se s tím setkal v předchozích kapitolách, ale domníval jsem se, že někde dělám chybu. Občas jsem musel použít jako jméno proměnné nějaké delší slovo, jinak mi tam editor vnucoval něco jiného.

Jarda

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Stačí napsat p a zmáčknout Esc. Uznávám, že p není moc dobrý název, ale proměnná by se mohla jmenovat pen a tam by to dělalo stejně.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

Prosí Vás, mám dotaz jak udělám na čáře měřítko. Chci ji rozdělit na stejné dílky.

Tuším že to půjde smyčku While/for, ale to je všechno co tuším .

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

Nazdar, zkoušel jsem udělat takovou aplikaci, ve které jako uživatel měním souřadnice x a y. Chtěl jsem, aby se při kliknutí na tlačítko aktualizovat, vykreslil bod ve stejných souřadnicích, jako jsem uvedl. Procedura paint se ale vyvolá jen když minimalizuju a následně zobrazím okno. Jak tedy vyvolat tuto proceduru?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

'Prosím o shovívavost, neb nejsem programátor ani se do toho nechci moc plést. Jsem projekant staveb a v programu DesignCAD si v implementovaném BasicCAdu mohu napsat makra pro kreslení některých prvků. Ve vbnetu potřebuji vytvořit exe soubor kde bude formulář s obrázkem kde budou okotované rozměry, které chci zadat. Tyto rozměry prostě napsat a zapsat do souboru, třeba "okno.dta" . Po použití tento zápis smazat. Čili jaksi data pro jedno použití, bez uchovávání. Nic víc nechci. VBnet mám, návody zde čtu.

Další již umím v makru:

t.j. vyvolání formuláře (run xx.exe následně čtení proměnných ze souboru .dta a kompletní vykreslení do hladiny, barvy, typ čar, zavěšení na kurzor, umístění, natočení a odkliknutí a tím zafixování.)

V podstatě bych potřeboval navést jak tu proceduru začít. Stačí mně pro jeden údaj, ostatní už půjde.

Děkuji za pomoc.

Ing. Kareš'

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jak vidím tak vice než za měsíc mně nikdo nedpověděl, což je také odpověď. Asi ve msylu : "dej nám pokoj".

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

My máme povinnost Vám odpovídat na Vaše dotazy? Zajímavé, o tom nic nevím. A Vaše schopnosti dedukce jsou také mizivé - to, že Vám nikdo neodpoví, neznamená "dej nám pokoj", ale jednu ze 3 variant: 1) dotaz je položen blbě, 2) nikdo si ho nevšimnul (máme tady desítky článků, nesledujeme diskuse pod každým) anebo 3) odpověď neznáme a nemáme čas ani motivaci jí hledat. Příště hledejte chyby nejprve u sebe a pak až buzerujte, takové lidi mám vůbec nejraději.

nahlásit spamnahlásit spam 1 / 3 odpovědětodpovědět

Ano, děkuji.

Nechtěl jsem se Vás dotknout. Nemáte žádnou povinnost. Nic takového jsem nenapsal. Povzdechnul jsem si a to je vše.

nahlásit spamnahlásit spam 3 / 5 odpovědětodpovědět

daj mi na teba kontakt najlepsie skype, to co potrebujes je pomerne jednoduche..

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

Dobrý den,

co bych měl napsat když potřebuju vyplnit obrazec těmito * ?

Děkuji

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

Dobrý den,

přečetl jsem si úvod do grafiky ve vb.netu od vás a velmi se mi líbí.

Ve svém volném čase se věnuji různým výpočtům z oblasti astronomie a nebeské mechaniky; mám již naprogramovanou simulaci pohybu dvojhvězdy ale jen v číslech; rád bych tyto výpočty převedl do grafiky.

Prosím o radu, nebo nasměrování na knihu, blog, cokoliv, jak zpusobit pohyb kruhu.

Bude tam třeba přiřazení vymalovaného kruhu k objektu? Lze něco takového? FillEllipse je metoda.

Vladimír

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

ahoj

vykresluju si graf primo do textoveho pole,ale nevim si rady jakym zpusobem naprogramomat obnovu grafiky tohoho textoveho pole pokud dojde k minimalizaci nebo k prekryti jinym oknem.par navodu sem nasel ale vsechny se vztahovali k udalostni procedure paint, kterou textove pole nema.pouzivam VB 08 express.

diky

Petr Z.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

Mám v pictureboxu načtený .bmp obrázek (mapu Evropy). Potřeboval bych mít možnost vybarvit kliknutím jednotlivé státy, které mají hranice vyznačeny černou barvou a vnitřek je bílý. Odpovídá to funkci Plechovka v Malování. Ale nemůžu se nikde shnat kód. Můžete mi někdo poradit pomocí jaké funkce se toho dá docílit?

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

No, to si asi budete muset sám napsat, je to poměrně hezké cvičení.

nahlásit spamnahlásit spam -4 / 4 odpovědětodpovědět

Děkuji za rychlou, ale ne úplně povzbudivou odpověď. Našel jsem jeden příspěvek, kde něco takového řešili pomocí fce ExtFloodFill - máte s ní nějaké zkušenosti?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

No, vím akorát, že WinAPI pro tohle nějaké funkce mělo (FloodFill a ExtFloodFill), ale nejsem si jistý, jestli zrovna tyto dvě jdou použít v .NETu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Už jsem našel, co jsem hledal. Zdrojový kód pro využití fce Extfloodfill ve vb.net je na této stránce

http://www.planetsourcecode.com/vb/scrip...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Mám jesště jeden dotaz. V pictureboxu mám mapu států, jeden z nich chci vybarvit třeba modrou barvou tak, že kliknu na talčítko Vyber barvu, zvolím modrou a dám OK a pak kliknu na vnitřek daného státu. Jak mám ale zařídit, aby se událost např. pocBox1_MouseDown aktivovala jen v situaci, že vyberu danou barvu? Jinými slovy, abych po otevření formuláře mohl do picBox1 klikat bez nebezpečí, že se mi bude pořád něco vybarvovat.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nedivím se, že nikdo neodpověděl - spravila to obyčejná proměnná a podmínka If.

Ale než to člověku dojde :-)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Úvod do grafiky

dobrý den,

nechal jsem se trochu inspirovat hrou bubble breaker a vrhnul jsem se na tvorbu hry Tetris. Zasekl jsem se ale u funkce vytvoření nové kostky, kdy potřebuji zjistit, jestli již nejsou kostky navrstvené až nahoru(tedy konec hry). chtěl jsem to řešit tak, že zjistím barvu všech políček, kde by se měla vytvořit nová kostka. Při použití tohoto kódu:

 For i As Integer = 1 To UBound(pozicekostky, 1)
                        pixel = b.GetPixel(pozicekostky(i, 1), pozicekostky(i, 2)) ' zde se stane chyba
                        If pixel <> Color.Black Then gameover()
                    Next i

, kdy pozicekostky je pole souřadnic jednotlivých kostiček v kostce, mi to nahlásí chybu "Odkaz na objekt není nastaven na instanci objektu."(NullReferenceException). Mám VB.NET 2005 express edition. Neví někdo, kde jsem udělal chybu (případně jak se to dá řešit lépe)? Děkuji za odpovědi a postřehy.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Diskuse: Úvod do grafiky

Prosím,

jaké má vb.net příkazy pro vykreslení pixelu do PictureBoxu(zadájí se souřadnice a barva) a zjištění barvy pixelu (zadají se souřadnice pixelu PictureBoxu).

Nebo existuje nějaký příkaz na vyříznutí obráku z obrázku?

Potřeboval bych udělat z obrázku několik výřezů o velikosti 128x128pix. Přemýšlel jsem že bych překresloval pixel po pixelu do jiného PictureBoxu a ten pak uložil. Pokud má vb.net funkci pro vyříznutí obrázku bylo by o něco jednoduší :-)

Předem děkuji za případnou odpověď.

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

Diskuse: Úvod do grafiky

děkuji za návody z vbnet.cz díky němu sem se naučil programovat ve visual basic 2005 expres edition pisp

nahlásit spamnahlásit spam -3 / 3 odpovědětodpovědět

Diskuse: Úvod do grafiky

Ve VBA existuje možnost vypínat a zapínat aktualizaci (vykreslování) obrazovky (Application.ScreenUpdating = True nebo False).

Pokud kreslím nějaký složitě vypočítávaný graf, sestávájící z velkého počtu samostatných obrazců pak je žádoucí aby se vykreslil na obrazovce rychle a najednou (což ve VBA umožňuje již zmíněná vlastnost). Existuje analogické nastavení nebo podobné řešení ve VB.NET?

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Ano, VB.NET má vlastnost DoubleBuffered, která podobné situace řeší. Ale problém VBA byl hlavně v tom, že se jednalo o interpretovaný jazyk, který je sám o sobě pomalý už tím, že je interpretovaný. Vykreslování v GDI+ je velmi výkonné, takže se není čeho bát.

nahlásit spamnahlásit spam 1 / 3 odpovědětodpovědět

Díky za informace. Vyzkouším.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback