VB.Net a grafika ve vrstvách   otázka

DirectX, Grafika

Dobrý den,

prosím napadá Vás někoho jak z toho ven? Vyzkoušel jsem už různé "šarády" v rámci svých možností a znalostí ale výsledek zatím "naprd" :o)

Čeho se snažím dosáhnout:

vytvořit na pozadí "velkou" grafickou plochu bigG (8000x10000px) - Bitmapa tuto Bitmapu propojit na vrstvu Graphics abych do ní mohl kreslit; g=Graphics.FromImage(bigG)

do ní výpočtem umístit různé grafické objekty(g.DrawRectangle..)

jakmile tam bude nakresleno vše co je třeba - časově středně náročné cca 2,5sec. bitmapu bigG zobrazit ve Form1; Me.BackgroundImage = bigG

až potud vše funguje ok

dále mít možnost přes ScrollBary s Bitmapou pohybovat protože Form1 je vždy menší než bitmapa a tudíž nezobrazí celou bitmapu.(nechci zde žádný Zoom ani Stretch) prostě jen scrolem posunout do oblasti která se chce vidět.

poslední věc je že nad celou touto grafikou bych potřeboval mít kurzorový kříž přes celý Form1.Width a Form1.Height se středem v bodě e.X,e.Y (aktuální souřadnice kurzoru ve Form1) tuto polohu mi vrací událost MouseMove.

Potíže se kterými si nevím rady a hlavně proč se tak děje a co hledat :

1) když natáhnu bitmapu do Form1 (Me.BackgroundImage = bigG) tak i přesto že Form1.AutoScroll=True tak bitmapa se sice zobrazí ale jen část co vejde do Form1 a ScrollBary se neobjeví, tudíž není možné prohlížet části bitmapy které jsou "za viditelnou hranici" Form1

2) kurzorový kříž vykresluji do vrstvy buffer typu DoubleBuffer v události MouseMove vždy při pohybu myši, napřed se vše smaže : Buffer.Graphics.Clear(Color.White) a pak se nakreslí nový kříž podle nové polohy myši a na konci této události je buffer.Render který donutí DoubleBuffer se překlopit a zobrazit.

Kurzor běhá celkem dobře, občas se sice cukne ale jinak ok, ale buffer vrstva vždy překryje tu podkladovou Bitmapu s již vykreslenou grafikou a nedokážu ji překecat aby to nedělala a běžela jakoby nad ní a neovlivňovala to co je už na Form1 zobrazeno.

Díky moc za případnou pomoc, reakci nebo radu co dělám špatně.

Petr

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

Skúste Buffer.Graphics.Clear(Color.Transparent) .

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

Absolutně nevhodné pro GDI+. Toto je jako dělané pro Direct2D, který podporuje i vrstvy. Rozepsal jsem na toto téma článek, ale nějak se nemám k tomu ho dokončit, snad se k tomu někdy dokopu.

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

škoda že článek nemáte dokončený. Moc rád bych si jej přečet :o)Teď by hodně pomohl protože o Direct2D nevím zatím prakticky nic. Ale i tak díky za nasměrování.

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

Dopředu poznamenávám, že je to záležitost DirectX 10+ a je potřeba Windows API Code Pack a minimálně Windows Vista. Windows XP to nepodporuje.

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

Díky za reakce. Věřím že určitě DirectX nabízí v ohledu vrstev a dalších "vychytávek" komfortnější nástroje než GDI a DoubleBuffering, nicméně pro potřeby této aplikace je to naprosto dostačující. Jediný problém který mě trápí je ten, že když se aktivuje DoubleBuffering smaže mi podkladovou bitmapu ve které jsou již nakreslené vektorové obrazce.

DoubleBuffering chápu tak, že se někde v paměti vytvoří prostor o "stejné struktuře" jako má tzv."videopaměť" tam si v klídku nakreslím co chci a až je to hotové zavolám Render který tento prostor překlopí a tím "najednou" vše zobrazí. Kdyby se podařilo nějak donutit ten DoubleBuffer aby se napřed než vše smaže podíval co je na obrazovce a to překopíroval i do toho bufferu, byl by problém nejspíš vyřešen i bez DirectX atd.. napadá Vás nějaký způsob jak toho dosáhnout?

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

- V GDI+ je všechno rastrové, vektorové obrazce je tedy pitomost.

- Zřejmě nechápete k čemu je vlastně Double Buffering a tudíž nevíte, že vykreslování s pomocí něho nejde nijak ovlivnit.

Více na http://msdn.microsoft.com/en-us/library/...

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