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í.
Avatar
podlesak
Člen
Avatar
podlesak:27.2.2014 13:40

Dobrý den.
Nějakou dobu se snažím naprogramovat okení aplikaci pro vývoj zdrojového kódu. Taková aplikace potřebuje hodně nástrojů a kontrolek na obrazovce a zároveň potřebuje velký prostor pro samotný zdrojový kód. Většina vývojových prostředí samozřejmě umožňuje určité nástroje a tabulky schovávat a upravovat jejich šířku, aby měl uživatel podle potřeby na obrazovce zabráno jen tolik místa, kolik potřebuje.

Potřeboval bych poradit, jakou mám použít kontrolku na vytvoření nějakého panelu, který může uživatel za běhu aplikace roztahovat co do šířky podle potřeby. Pokud by tato kontrolka navíc měla možnost se zobrazovat či zavřít podle potřeby, byl by to příjemný bonus. Ve standardních kontrolkách winformů jak jsou ve Visual Studiu 2012 nainstalovány nic s podobnou funkcionaliou nevidím. Největší problém je ten, že ani nevím jak se tento druh kontrolky jmenuje. Ani česky, ani anglicky. Jde mi hlavně a tu funkcionalitu, kdy uživatel najeden myší na okraj panelu či jiné kontrolky, která je zadokovaná vlevo, vpravo, nahoře či dole, kurzor se změní na oboustranou šipku a uživatel může stiskem a tažením myši měnit její šířku či výšku, podle toho kde je zadokovaná.

Takováto funkcionalita by se mi hodila především na to, aby si uživatel mohl upravit šířku komponenty TreeView se zobrazeným projektem na levé straně, nebo na úpravu výšky logovacího TextBoxu zadokovaného dole.

Ví někdo a nějaké knihovně, která tuto funkcionalitu podporuje? Nejlepší by byla knihovna, která by poskytovala panel s touto přidanou vlastností, do kterého bych si mohl umístit jakoukoliv kontrolku, popř. víc kontrolek.
Nebo popřípadě jestli existuje jednoduchý způsob, jak tuto funkcionalitu normálně přidat standardnímu panelu, jak se tak učiní?

 
Odpovědět
27.2.2014 13:40
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na podlesak
Jan Vargovský:27.2.2014 13:44

Roztahování si přeci můžeš naprogramovat ne? :)

 
Nahoru Odpovědět
27.2.2014 13:44
Avatar
podlesak
Člen
Avatar
podlesak:3.3.2014 15:39

No, čekal jsem trochu víc... ale budiž.

 
Nahoru Odpovědět
3.3.2014 15:39
Avatar
pistha
Tvůrce
Avatar
Nahoru Odpovědět
3.3.2014 16:09
Vše zní chytře, když pod to napíšete jméno někoho známého. -Albert Einstein
Avatar
podlesak
Člen
Avatar
Odpovídá na pistha
podlesak:4.3.2014 17:03

Toto se mi příliš nelíbí. Vypadá to jenom jako nové okénko. Není to komponenta na formuláři, která může mít vlstnost Dock nastavenou na Right a mít v sobě další komponenty. Něco takového potřebuji, aby mi obsah té roztahovací komponenty mohl díky roztahování vytlačit obsah dalších komponent (které mají Dock nastaveno na fill). Nové okno by zdrojový kód spíše překrývalo. To mi nepřijde příliš příjemné.

Když jsem zkoušel svojí vlastní implementaci, tak po celém dni programování jsem zjistil, že to v žádném případě není triviální problém.

1. Měnit velikost komponenty za běhu programu nepodporují Winformy nijak příjemně. Jediná možnost je změnit Size, což je struktura, která se musí měnit celá. Někde jsem našel zmíňky o tom, že to pravděpodobně není "clean" způsob, jak to dělat. Ale navrhovaný "clean" způsob byl zase používání nalinkovaných unsafe metod posíláním zpráv kontrolkám. Přiznám se, že jsem to příliš nepochopil:
http://stackoverflow.com/…l-at-runtime

2. Pokud nastavím, aby se update prováděl neustále na mousemove, tak i když nastavím panel na doublebuffered, tak mi nepříjemně bliká celý formulář. Nastavil jsem tedy, aby se update provedl jen jednou po puštění tlačítka myši.

3. Když dám Fill nové komponenty, kterou dám do mého valstního panelu, tak se mi moje zvýrazněná hrana panelu, stejně jako všechno ostatní, překryje.

4. Jaké bylo překvapení, že výsledný panel, který jsem si napsal, vlastně nemůžu vůbec použít. Pokud do něj dám nějakou komponentu a nastavím jí Dock na Fill, tak všechny eventy, které odchytával panel jsou nyní ignorovány, protože když se myš nachází nad panelem tak se odchytávají pouze eventy které jsou vyvolány to novou komponentou, kterou jsem do panelu umístil.

Takže můj panel je ošklivý a funguje pochybně a funguje pouze když je prázdný... Jediná možnost jak to obejít je pravděpodobně ta, že bych si vytvořil místo panelu vlastní roztahovací treeview a textbox... a další komponenty. Sice budu mít velké množstí opakujícího se kódu, ale v tuhle chvíli mi nic lepšího nenapadá.

 
Nahoru Odpovědět
4.3.2014 17:03
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na podlesak
David Hartinger:4.3.2014 17:13

Když v .NETu něco není, tak by ses měl zamyslet i nad tím, jestli to opravdu potřebuješ, protože je divné, že by tam něco užitečného chybělo a nedalo se to realizovat nějakým jiným způsobem přes existující funkcionalitu. Ale stát se to může.

Stejně jako Honza si myslím, že pokud tu funkčnost opravdu chceš, není složité si ji naprogramovat. Dej si to do nějakého panelu a tomu obsluž události pohybu myší a držení tlačítka tak, aby se dal roztahovat.

Nahoru Odpovědět
4.3.2014 17:13
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na podlesak
David Hartinger:4.3.2014 17:14

Jinak pokud chceš takovéhle obskurnosti, tak to máš lepší dělat ve WPF, WinForms je už jen z podstaty zastaralý.

Nahoru Odpovědět
4.3.2014 17:14
New kid back on the block with a R.I.P
Avatar
podlesak
Člen
Avatar
Odpovídá na David Hartinger
podlesak:4.3.2014 17:52

Mám pocit, že si trochu protiřečíš. Není divné, že by tam něco důležitého chybělo, pokud je WinForms zastaralý. Projekt je už ale rozběhnutý ve Winforms a některé jeho důležité komponenty které musím použít mám jen pro winforms.

A musím se odkázat na svůj předchozí příspěvek. Je nemožné obloužit událost roztahování, protože kontainer jiných komponent pak ignoruje události, pokud jsou vyvolány nad těmito dalšími komponentami. Pokud dám na svůj upravený panel tlačítko, tak pokud nad talčítkem přejíždím myší, tak mousemove panelu se nikdy nezavolá.

Teď jsem narychlo vyzkoušel tuhle funkcionalitu dát rovnou TreeView, ale marně. Z nějakého důvodu, přesto, že mám nastaveno aby se událost odchytávala 10 pixelů od kraje se odchytává pouze jeden pixel od kraje. A navíc z nějakého důvodu úplně stejný kód, který roztahoval panel ten TreeView prostě neroztahuje.

Budu se muset zeptat vyučujícího. Problém je, že s ním musím řešit mnohem důležitější věci než jenom hloupé rozhraní.

 
Nahoru Odpovědět
4.3.2014 17:52
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na podlesak
David Hartinger:4.3.2014 18:00

Neprotiřečím, říkal jsem v .NETu, ne ve WinForms a v .NETu je WPF :P WPF už existuje hezkou chvilku, nechci tu dělat chytrého, taky jsem na ně přešel až po dlouhé době a pořád jsem to oddaloval, ale stavět teď na WF něco většího určitě není dobrý nápad, ono vůbec dělat něco ve WF už nemá smysl.

Že se událost ignoruje uvnitř přes kontrolky by ti vadit nemělo, ne? Tobě jde jen o to, aby se zachytila u okraje a to jsem pochopil, že ti funguje.

To s tím TreeView nechápu. Roztahuj prostě panel a TreeView dej do toho panelu a nastav mu anchors. Vše udělej jen pro panely a do nich si dáš co chceš.

Nahoru Odpovědět
4.3.2014 18:00
New kid back on the block with a R.I.P
Avatar
podlesak
Člen
Avatar
podlesak:4.3.2014 19:44

Já zase slyšel, že už ani to WPF neni jistý co se týče budoucnosti.

U okraje mi to funguje pouze pokud uvnitř nic není. Pokud uvnitř něco je a sahá to až po okraj, tak to tu událost pohltí. (respektive když jsem říkal, že mi to funguje, myslel jsem jenom když je panel prázdný, a to je jisté, že je mi naprosto k ničemu).

A musí to sahat až po okraj, to je celý ten důvod proč to dělám. Musí být uvnitř komponenta, co má nastaveno Dock na Fill, aby se roztahovala podle velikosti panelu. Pokud by ta komponenta uvntř měla pořád stejnou velikost, ať se panel roztahuje jak chce, postrádalo by to celé snažení smysl... plus až by se panel zmenšil tak, že by komponenta uvnitř sahala až po okraj, už by s panelem nešlo vůbec manipulovat.

Editováno 4.3.2014 19:46
 
Nahoru Odpovědět
4.3.2014 19:44
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na podlesak
Jan Vargovský:4.3.2014 19:44
Já zase slyšel, že už ani to WPF neni jistý co se týče budoucnosti.

Můžeš uvést zdroj informace?

 
Nahoru Odpovědět
4.3.2014 19:44
Avatar
pistha
Tvůrce
Avatar
Odpovídá na podlesak
pistha:5.3.2014 6:51

Ještě je možnost použít toto: https://github.com/…ckpanelsuite ... skvělá věc pro dokovaná okna ... zdroják si můžeš upravit dle svých potřeb ;) ... jinak rozhodně bych uvažoval přejít na wpf. Winform u větších projektů dokáže dost potrestat, zvlášť při použití generických formulářů :)

Nahoru Odpovědět
5.3.2014 6:51
Vše zní chytře, když pod to napíšete jméno někoho známého. -Albert Einstein
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.