GDI+ a kurzor - jak dál?   zodpovězená otázka

Offtopic

zdravím všechny na fóru a měl bych jednu otázku.

Vykresluju si ve své aplikaci graf přes GDI+ na PictureBox.

Až potud se mi zdá vše ok. Potřeboval bych ale ještě tam přidat to že když se kurzor myši dostane do oblasti pictureboxu aby se změnil na kříž ale ne takovej malinkej ale kříž přes celý picturebox (.width a .height) a při pohybu s průsečíkem v místě kurzoru.

Poradil by někdo ze zkušených harcovníků jak nato?

nějak mi dochází střelnej prach :-)

Tuším možná nějak na API ale .... nejde to jinak? stačí mi i to GDI+... budu rád za případné info.

pěkný den

jamal

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

To by mělo bých velice jednoduché:

Private sub PB1_MouseMove( blablabla ) Handles PB1.Mousemove
  Dim Gfx as Graphics = pB1.CreateGraphics()
  Gfx.DrawLine(x1=0,x2=pb1.width,y1=e.y,y2=e.y,color.red) ' omlouvám se, ale nejsem si jistý jak jsou ty parametry, takže takhle názorně, abyste věděl co myslím
  Gfx.DrawLine(x1=e.x,x2=e.x,y1=0,y2=pb1.height,color.red)
End Sub

první DrawLine vykresluje horizontáoní linku (vidíte, že se drží u levého a pravého kraje a pohybuje se jen nahoru dolů.

Druhý kreslí linku vertikální.

V případě nejasností rád pomůžu

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

Nejsem si jist, že by to nějakým nastavením kurzoru mohlo jít (potřebujete měnit velikost jednotlivých čar kříže, což asi nepůjde). Asi to budete muset vykreslit sám, asi nějak tak:

Public Class Form1
    Dim gr As Graphics

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        gr = PictureBox2.CreateGraphics
    End Sub


    Private Sub PictureBox2_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseMove
        gr.Clear(Color.White)
        ' tady doplňte vykreslení Vašeho grafu
        gr.DrawLine(Pens.Black, e.X, 0, e.X, PictureBox2.Height)
        gr.DrawLine(Pens.Black, 0, e.Y, PictureBox2.Width, e.Y)
    End Sub
End Class

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

Koukám, že jsem byl o něco pomalejší, než kolega Tomáš, pouze pro vysvětlení:

to gr.clear tam musí být, abyste vždy před nakreslením nového kříže ten starý smazal (jinak byste si pouze zaplnil obrázek barvou kříže).

Jenomže přitom si, samozřejmě, smažete i ten svůj graf, proto i ten musíte vždy obnovit (nevím, jakým postupem jej tvoříte, ale budete jej muset asi nejlépe nakreslit do grafického pathu a ten pak najednou do pictureboxu vypláznout (gr.DrawPath(...)).

A asi se (kvůli blikání) budete muset zaobírat doublebufferingem.

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

super, super. To je přesně ono :-) co potřebuju. Ale,

jenže, právě,... to blikání.

přilepil jsem k tomu trochu kresby, a když je to v malým

okně tak super, ale provoz bude do full screenu a tam to

bliká už znatelně.

Private Sub PB1_MouseMove1(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PB1.MouseMove

        Dim Gfx As Graphics = PB1.CreateGraphics()
        Dim BluePen As New Pen(Color.Blue, 2)

        Gfx.Clear(Color.White)
        Gfx.DrawLine(Pens.Black, e.X, 0, e.X, PB1.Height)
        Gfx.DrawLine(Pens.Black, 0, e.Y, PB1.Width, e.Y)


        For i As Integer = 0 To PB1.Width Step 10

            'osa X
            Gfx.DrawLine(BluePen, 0, 0, PB1.Width, PB1.Height)
            Gfx.DrawLine(BluePen, 0, PB1.Height, PB1.Width, 0)

            'trocha kresby :-)
            Gfx.DrawLine(Pens.Red, i, 0, i, PB1.Height)
        Next

    End Sub

Jak z tohodle ven... protože potom by to prostě nemělo chybu !

Doublebuffering, no zní to dobře ale nic mi to neříká, potřeboval bych trochu víc nakopnout. jak na něj a o co tam de

:-)

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

Odpusťte, že se nebudu moc rozepisovat, ale alespoň jsem Vám to trochu okomentoval, takže si myslím, že by to mohlo být celkem zřejmé:

Public Class Form1

    Private CurCont As BufferedGraphicsContext                ' třída zapouzdřující metody pro vytvoření grafického bufferu
    Private Buffer As BufferedGraphics                        ' buffer pro realizaci double bufferingu 

    Private BluePen As New Pen(Color.Blue, 2)



    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        CurCont = BufferedGraphicsManager.Current               ' nastavíme kontext bufferu dle aktuálního systému
        Buffer = CurCont.Allocate(Me.PictureBox1.CreateGraphics, Me.PictureBox1.Bounds)     ' alokujeme pro buffer prostor (a navážeme na vykreslovací plochu)
    End Sub



    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        ' vykreslíme graf (dáno do vlastního podprogramu pouze pro formu - budete tam měnit):
        kresliGraf()
        ' do bufferu vykreslíme nitkový kříž:
        Buffer.Graphics.DrawLine(Pens.Black, e.X, 0, e.X, PictureBox1.Height)
        Buffer.Graphics.DrawLine(Pens.Black, 0, e.Y, PictureBox1.Width, e.Y)
        ' doposud byl v PictureBoxu původní obrázek, až nyní do něj překlopíme obsah bufferu
        Buffer.Render()
    End Sub

    Private Sub kresliGraf()
        ' vymažeme buffer a vybarvíme nabílo
        Buffer.Graphics.Clear(Color.White)
        For i As Integer = 0 To PictureBox1.Width Step 10

            ' dále kreslíme do bufferu úplně stejně, jako bychom kreslili přímo do pictboxu (stejné metody):

            'osa X
            Buffer.Graphics.DrawLine(BluePen, 0, 0, PictureBox1.Width, PictureBox1.Height)
            Buffer.Graphics.DrawLine(BluePen, 0, PictureBox1.Height, PictureBox1.Width, 0)

            'trocha kresby :-)
            Buffer.Graphics.DrawLine(Pens.Red, i, 0, i, PictureBox1.Height)
        Next
    End Sub

End Class

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

tak tohle je fakt nářez !! přesně, přesně tohle jsem měl na mysli. nebliká :-) a není k tomu ani třeba žádné API a tak různě... = takže to jde! a není to zase tak složité, když se ví kam šáhnout :-)

super a díky moc za inspiraci! Sice zatím přesně nechápu jak ten buffering funguje, ale doufám že to půjde nastudovat z helpů ve VB.Net.

Jen přece ještě jedna drobnost. PictureBox1 mám dokovaný na Form1. Když se Form1 zvětšuje, zvětšuje se i Picturebox1. Jakmile se ale velikost dostane za určitou hranici, picturebox se už pak nezvětšuje a nevím kde to mám změnit.

Tzn. že když se Form1 maximalizuje, picturebox není přes celý Form1 a vyplňuje jen část z Form1.

Zajímavé ale je že uhlopříčkové čáry (viz kresliGraf, 'osa x) se berou souřadnicemi správně, ale vidět je jen to co "prochází" přes PictureBox1. Zřejmě se asi jedná o nastavení velikosti toho bufferingu, ale kde bych to mohl změnit? (škoda, že jsem nejde přilepit i malý printscreen, kde by to bylo vidět)

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

Jak to přesně uvnitř funguje, to Vám asi nevysvětlím, ale princip je celkem jednoduchý.

Zobrazení na monitoru probíhá nějak tak, že někde v paměti je vyhrazen určitý prostor, kterému je dáno, že první jeho buňka (schválně nepíšu bajt, protože velikost této "buňky" závisí na způsobu zobrazení - barevné hloubce) nese informaci o tom, jak vypadá levý horní pixel na vašem monitoru, druhá je o pixelu hned vedle, atd. A HW (jedna část grafické karty) bez možnosti ovlivnění z Vaší strany neúnavně tyto buňky "překopírovává" na příslušné místi na Vaší obrazovce-stále dokola a velice rychle)

Pokud pak Vy, vaším programem něco "kreslíte", pak posíláte instrukce, které ve svém důsledku mění právě obsah této, pro Vás neviditelné, části paměti. No a pokud toho kreslení je více, tak si představte:

- nejprve do všech buněk nastavíte stejnou (podkladovou barvu), tj. provedete vymazání

- nyní nakreslíte první čáru,

- nakreslíte druhou čáru....

To vše, dle rychlosti Vašeho HW a složitosti výpočtů použitých pro vykreslování a v neposlední řadě i složitosti samotných vykreslovaných obrazců provádíte sice velmi rychle, ale ono "překopírovávání" obsahu grafické paměti na monitor probíhá ještě rychleji, takže se Vám dostane na monitor stav úplně čisté obrazovky, pak obrazovky s několika málo čárami a následně pak úplný obrázek. Přestože oko nezaznamená samotný proces vykreslování, rozdíl kontrastů je natolik velký, že máte ten známý pocit blikání.

Tak se to vymyslelo trošku jinak.

Do té vlastní grafické paměti uložíme informace o našem obrázku a ty jsou vesele periodicky překopírovávány na monitor, takže se nám zdá, že to svítí stále stejne.

Necháme to svítit, a zatím si připravíme kus své paměti, který "naformátujeme" stejně, jako je naše zmiňovaná grafická paměť (to zřejmě dělá ten první příkaz v těch dvou):

CurCont = BufferedGraphicsManager.Current               ' nastavíme kontext bufferu dle aktuálního systému
        Buffer = CurCont.Allocate(Me.PictureBox1.CreateGraphics, Me.PictureBox1.Bounds)     ' alokujeme pro buffer prostor (a navážeme na vykreslovací plochu

no a tím druhým příkazem určíme velikost té paměti (to je ten druhý parametr, který zadává velikost obdélníkové oblasti, která nás zajímá) a taky si nastavíme, kam pak budeme chtít vlastní obsah bufferu poslat (to je ten první parametr)

No a pokud to máme takto všechno připravené, provádíme úplně stejné kreslení jako v prvním případě, jenomže nevykreslujeme do té části paměti, která se nám stále zobrazuje na monitoru (ta grafické paměť), ale vykreslujeme do té naší pomocné části paměti, která vypadá úplně stejně, umí úplně stejné věci jako ta grafická, jenom se nám nikam nevykresluje.

Takže v klidu ji můžeme vymazat (nastavit jednotnou barvu pozadí), nakreslit první čátu, nakreslit druhou čáru,....

No a až jsme s výsledkem spokojeni (je třeba si uvědomit, že na monitoru nám stále "svítí" obsah té původní grafické paměti a doposud se na něm nezměnila ani čárka), takže až jsme spokojeni, zavoláme

Buffer.Render()

který najednou (na jeden zátah) obsah té naší pomogné paměti přesype do té "skutečně grafické", takže HW při dalším taktu začne na monitor promítat hned nový obrázek.

Buď je to děláno takto (a ten obsah je skutečně kopírován, ale protože je to blokové kopírování souvislé části paměti, je to i při dnešních velkých rozlišení opravdu velmi rychlé), nebo existuje ještě doublebuffering např. při DirectX, kde to funguje podobně ale nic se nekopíruje. Tam to funguje tak, že si tu "obrazovou" paměť uděláte zcela identickou na místě, kam dosáhne přímo HW grafické karty, a uděláte si dvě (nebo i více) identických dvojčat a pak pouze měníte informaci o tom, které z dvojčat je právě "Fronfbuffer", a které "BackBuffer", tzn. ten frontBuffer se vykresluje na monitor a do tobo backbufferu můžete malovat Vy, tak jak jsme to naznačili výše. No a až jste spokojen, nic nekopírujete, jenom HW řeknete, že má odteď na monitor vykreslovat z toho druhého prostoru (kam jste doposud kreslil Vy) a naopak Vám se zpřístupní pro kreslení a úpravy ten prostor první (jinak řečeno bufery se nepřekopírují, ale překlopí, ten co byl doteď front bude back a naopak). Je zřejmé, že tento postup bude ještě mnohem rychlejší. A dokonce v tomto případě můžete mít těch "backbufferů" více - neptejte se mne ale k čemu :-)

Tak to byla "trocha" teorie. S tím Vašim zvětšováním či nezvětšováním pictureboxu.

Jednak je zapotřebí si uvědomit, a dle předchozího jste to asi pochopil, že velikost bufferu se musí rovnat velikosti zobrazované oblasti. Pokud tedy máte v úmyslu ponechat možnost změny velikosti cílové vykreslovací oblasti, musíte ten buffer vždy po takovéto změně znovu předefinovat, jinak se Vám bude překreslovat stále jen ta oblast původně zadaná.

Jinak ještě drobnost, pokud máte picturebox dokovaný ve Formu a nemáte tam nic jiného, můžete kreslit přímo na Form, jedinou změnou bude definice grafické plochy, kde místo me.picturebox.creategraphics dáte jenom me.creategraphics - a samozřejmě i velikost bude odvozená z "me".

Snad jse Vás moc neunavil a snad jsem to napsal aspoň trošičku sdělně - je to, samozřejmě, hodně zjednodušené, ale šlo o princip.

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

Pokud budete vykreslovat spoustu dalších věcí, pak bufferování potřebovat určitě budete.

Pokud vám ale stačí jen tyto dvě čáry, pak je buffering spíš jako použít kanón na vrabce. Stačí si pamatovat, kde byl kurzor naposledy, a čáry překreslit na staré pozici bíle (vlastně je tím vygumujete). Pak můžete hned nakreslit čáry na pozici novou. Pokud ale pod tento kurzor chcete kreslit další věci (nějaké obrázky, další čáry atd.), buffering použít už asi musíte.

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

Kolega původně psal, že tam "pod tím" má graf a ten "nitkový kříž" k němu dodělává. Takže "přemazání" původní čáry by nešlo, musel by to udělat buď tak, že by si uchovával informaci o původní barvě pixelů na místě kreslené čáry a pak je tam vrátil, nebo neexistuje ve VB a konkrétně v GDI+ možnost kreslení metodou XOR? (nevím, jestli se to ještě používá, ale za mých mladých let jsme to používali - v místě kreslené čáry se pixely změnily na doplňkovou barvu (negativ), takže když jste nakreslil čáru dvakrát přes stejné místo, zase jste obdržel zase zpátky původní podkladovou barvu. Existuje něco podobného ve VB?

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

Nejsem si ale příliš jistý estetickou stránkou věci.

Je to jistě velmi dobrý způsob, jak jednoduše získat zpět informaci o původní barvě, ale mě to přijde trochu nevzhledné.

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

Pokud by to šlo, nic moc nevzhledného na tom zas až tak není - ale je třeba zvážit, kde se to dá použít. Pravdou je, že se to hojně používalo převážně u různých grafů - především ale černobílých a tam to má své opodstatnění, protože se Vám černá čára neztratí v černém podkladě.

I dnes se to využívá - pokud si třeba ve výše uváděném příkladu současně kurzor nastavíte na kříž tak si všimnete, pokud s ním nebudete pohybovat a zůstane Vám teda ležet přes ten černý nitkový kříž, že změní svou barvu na bílou-aby byl vidět.

Máte ale plnou pravdu, že u barevných obrazců bych byl s touto technologií opatrným.

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

pánové, všem Vám moc děkuju za pomoc. Je fajn mít možnost se zeptat zkušených harcovníků. Na tomhle fóru jsem prvně, a můžu říct že už dlouho mě nikdo a nic nepotěšilo víc :-)

Tohle je fakt super místo za kterým stojí super lidi.

No ale dost chvály. Jak říkal Karel Čapek, když nemám co dělat pracuji :-) ochocho..

to: Viktor

díky za výklad, přiznám se že jsem brousil hned po té co jsem uviděl Váš kód VB Help a téma Doublebuffering :-) podle toho co píšete ve výkladu výše, je to přesně tak. Po mém přečtení helpu jsem si z toho udělal představu : doublebuffering je když, všechny kreslící operace jdou na jakoby klona obrazové plochy v paměti a ta je potom jedním vrzem fláknuta na viditelnou grafickou plochu, která je s alokovaným paměťovým prostorem spojena. potom je jasné že ten Flicking musí být mnohem menší ale to co píšete u toho DirectX to fakt musí být už nářez, a dovedu si představit k čemu všemu se může hodit mít víc BackBufferů :-)

Pro kódu ve kterém se teď vrtám tohle je něco jako královské vysvobození, plně dostačující.

To zvětšení plochy mi zřejmě už došlo, povedlo se mi to takhle:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        CurCont = BufferedGraphicsManager.Current               ' nastavíme kontext bufferu dle aktuálního systému
        Buffer = CurCont.Allocate(Me.PictureBox1.CreateGraphics, New Rectangle(0, 0, Me.Width, Me.Height))     ' alokuje se prostor pro buffer a naváže se na vykreslovací plochu)
    End Sub

    ' provede se při změně pohybu myši nad PictureBoxem
    Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

        Buffer = CurCont.Allocate(Me.PictureBox1.CreateGraphics, New Rectangle(0, 0, Me.Width, Me.Height))  ' alokuje se prostor pro buffer a naváže se na vykreslovací plochu)

        'vykresli požadovaný graf pomocí metody
        kresliGraf()
        ...
        ...

a s tím dokovaným PictureBoxem samozřejmě máte pravdu.

Ono někdy stačí jen to prostě "vidět jinak" a je to tak.

to: Tomáš Herceg

původně jsem se to tak nějak snažil zbastlit jak píšete. Určitě by to šlo, kdyby člověk nebyl líný a trochu víc popřemýšlel :-) ale když ten doublebuffering je pro mě, coby těžký samorost něco tak pěkného, že teď už z principu se ho nepustím :-)))

Ten graf a různé jiné malůvky jsou už pod tím a tohle to to umí tak elegantně vyřešit.

ono těch věcí je spousta ale měl bych ještě přiznám se na srdci jednu z trochu jiného soudku.

Potřeboval bych ještě k tomu grafu co mám, do VisualBasicu dostat jednu ActiveX komponentu tak abych mohl volat a využívat její metody. Nikdy jsem nic takového zatím nepotřeboval a tak se v tom teď paralelně vyloženě plácám. Pochopil jsem že se nejprve ta komponenta musí ve Win nějak zaregistrovat ale pořád mi není jasné jak ji dostat do ToolBoxu a jak potom v kódu se na ni odkazovat. Asi je to banalita, ale pozlobí jako cokoliv jiného.

Pomohli byste mi prosím někdo i s tímhle ? Aspoň nasměrovat :-) kopat už budu sám...

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

Pokud máte tu komponentu jako soubor (?) tak stačí v ToolBoxu kliknout pravým, protom Chose Item a hledat soubor.

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

je to soubor.ocx a hned jsem to vyzkoušel :-)

prostě to fungujeeeé. Komponenta se mi objevila v Toolboxu, když ji vezmu a umístím na řekněme Form1, dostane name: AxT1.

v kódu potom stačí uvést Me.AxT1.connect() ? samozřejmě za předpokladu že tato komponenta má metodu connect()

... fakt je to "až tak jednoduché" ?? Měl jsem totiž z toho napojování tak trochu obavy, no ale pokud tohle je vše co je nutné kolem toho zajistit, tak potom jujíí,...

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

Ano to stačí. Je to opravdu velice jednoduché. Teší mě, že jsem Vám uděal takovou radost :-)

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

jo opravdu udělal :-) nevím proč ale čekal jsem že to bude mnohem komplikovanější a horší ale byl jsem velmi mile překvapen, což se mi moc často neděje :-)

Tzn. že tu údajnou registraci za mne udělal VB.NET?

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

Ještě jsem chtěl k Vašemu kódu drobnost - jenom na zvážení - nevím, jak moc časově náročná je alokace toho bufferu, ale osobně bych ji prováděl skutečně pouze při změně velikosti promítací plochy (tj. například do události resize u formu), protože si myslím, že nebude až tak častá aby ji bylo nutno provádět při každém pohnutí s myší a navíc, pokud tuto technologii budete používat i pro složitější vykreslování, bude se Vám hodit každá uspořená chvilička při přípravě obrázku v bufferu, jinak to sice nebude blikat, ale případné pohyby budou trhané.

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

Díky za dobrý tip. Jo s tím časem je někdy potíž. to máte naprostou pravdu.

Zlaté doby kdy jsem bastlil ještě se Zilogem. Byl to CPU nějaká Z80A a k tomu assembler myslím Gens3 nebo tak nějak se to jmenovalo :-) no ale to je už hoóódně dávno :-) nevím jestli pamatujete. Teď se to dá "přirovnat" třeba k Atmelům nebo Microchip PIC procesorům s trochou nadsázky,...

naštěstí to v čem se vrtám je jen takový "prohlížeč dat" žádnej driver nebo tak něco. Takže ta rychlost není až tak kritická ale přece jen nechci zase pořád čekat až on něco dokreslí a spočítá,..že? prostě když už tak ať se práší za kočárem :-)

malá odbočka, ono stačí nechat Datagrid přes DataSet nacucnout tak 50000 záznamů, a už je to vidět i cítit. Zatím to načítám takhle asi humusácky, prostě připojím se, a čtu záznam po záznamu ve smyčce For Next v rozsahu co mě zajímá, nacpu to do struktury a potom přepočítám v rámci rozsahu min/max do grafiky dalším For/Nextem a zobrazím. Toť vše. Co mi nejde a vím že to VB umí je použít Virtuální mód pro DataGrid, protože stejně to co chci zobrazit je max do 300 záznamů na screen protože víc už nemá smysl kvůli rozlišení.(není tam pak už stejně nic vidět) Tady by se mi líbil ten DataGrid ve Virtuál módu kdy by právě načetl jen těch 300 a ne 50000 záznamů (které v tu chvíli navíc ani na nic nepotřebuju). To by se potom mohlo zrychlit, né? A druhá věc, a to nevím, jestli existuje něco jako zoomový koeficient pro vykreslování grafiky. Mám na mysli právě ten svůj přepočet z hodnot do pixel souřadnic ve ForNextu. Bylo by hezké pokud by existovalo něco jako "blokové zpracování", čemuž bych předal surový data a k tomu koeficient na přepočet v ose x a ose y a ono by to zobrazilo :-) no ale to bych toho už chtěl asi příliš, že?...

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

A co byste říkal třeba něčemu, jako

System.Drawing.Graphics.ScaleTransform(meritkox, meritkoy)

???

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

Ale neééé ... ! Vy mě fakt tak trochu šokujete :-)) ale velmi pozitivně :-) !!

jestli je to teda to, co si myslím.... Teď už jsem tak trochu mimo,... ale zítra to hned prozkoumám !! protože tohle vypadá moóóc hezky. Ještě aby to tak umělo strávit zadání něco jako New Point(x,y) a už jen suše polykám s otevřenou hubou ... (to snad ani není možné žeby to bylo až tak jednoduché...)

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

Ale jóóóó...! Jenom pozor, ono to funguje trošičku jinak, proto Vám to žádný New Point(,) žrát nebude - ani nemůže.

Autoři VB na to šli trošičku z opačné strany, tak říkajíc od lesa.

Vy tuto transformační matici nepoužíváte na to CO kreslíte, ale KAM kreslíte.

Teď si budu vymýšlet - nemám to po ruce a přiznávám, zatím jsem to nepotřeboval. Ale ono to funguje asi takto:

Vy máte založený nějaký Graphics, do kterého kreslíte (např. g=Me.CreateGraphics).

No a teď na ten grafický prostor aplikujete tu transformační matici (g.ScaleTronsform(2,25000) ), no a nyní do toho g kreslíte jako normálně (g.grawLine(...) ), a dokud neřeknete DOST (mám takový dojem, že g.ResetTransform() - ale radši se podívejte), tak dotud se Vám na vše Vámi namalované aplikuje Vaše transformační matice (nemusí to být jenom měřítko, je tam posun, rotace, případně jejich kombinace).

Přeji příjemné bádání.

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

byl a ještě jsem teď malinko pracovně vytížen takže nezbylo moc času, ale díky moc za reakci. Hned jsem to vyzkoušel na obdélníku. Je to jak píšete od lesa (a to je vždycky nářez :-)

připomíná mi to chováním zoom a určitě se to bude hodit :-)

Škoda trochu že to nejde opačně. Teď to ohybá opravdu ten prostor kam kreslím a já bych spíš asi potřeboval ohnout to co kreslím.

Mám data hodnotově v řádu 10000 a chtěl jsem najít elegantní řešení jak je "vměstnat" do aktuálního rozměru např. PictureBoxu.

a tím je tak nějak vizualizovat do grafu. Zatím to právě přepočítávám ve funkci, což je asi řešení z doby kamenné, nicméně funguje.

... bádáme dál :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • 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