Diskuze: Form v panelu se nedeaktivuje
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 36 zpráv z 36.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Abyste mi dobře rozuměli chci normální chování jako mimo panel,...
Pokud aktivovat form znamená Controls.Add() pak deaktivace bude Controls.Remove()?
Ne mám na mysli Activate() a Deactivate() - prostě když kliknu mimo aplikaci - aplikace trochu zešediví - je neaktivní - a naopak když do ní kliknu, tak se zaktivuje - toto mám na mysli normálním chováním, ale form v panelu se kliknutím mimo něj nedeaktivuje a je stále aktivní,...
Ale použít lze jen this.p.Activate(), ale to druhé prostě ne,...
A když použiješ Activate na hlavní form tak to s ostatními udělá co?
No to co má - zaktivuje to form - ten je aktivní pořád,... Právě že normálně to funguje tak, že kliknu na form - ten se zaktivuje a zbytek deaktivuje - jenže tyto formy mám dockované v panelu (Formu1). Proto píši sem,...
Moc temu nechápu. Můžeš mi to zase poslat nebo dát nějaký screen?
Tak ono není co chápat - mám panel a v něm přidám form - jak jsem uved hoře (meodou Add()). No ale nepřidám jen jeden form, ale více formů. A všechny tyto formy jsou aktivní - kliknutím mimo do hlavního formu se nic nestane - kliknutím mimo se zdeaktivuje koráte hlavní form,...
Potřebuji zařídit normalní chování formů dockovaných v panelu formu hlavního (což je Form1).
Přiřaď event Activated pictureBox eventu MouseEnter a Deactivated MouseLeave.
Ptal jsem se na EN fóru - odkázali mne na UserControl. Jen nevím, jak bych to měl udělat - nepomohl by jsi mi alespoň s teorií? Děkuji.
Tím mám na mysli pro mojí situaci - protože nechápu, jak to mám udělat s formem,...
A to jak jsem ti psal jsi zkoušel? To mi fungovalo. Při najetí se zaktivoval při opuštění se zdeaktivoval...
Ale já to potřebuju normálně - kvůli context menu stripu. Dvojklikem pravým tlačítkem spouštím soubor - takže na pravé tlačítko nemohu dát ten contextmenu... Totiž to menu mám na dvojklik myši - ale funguje to jen tím pravým, nebo dvakrát levým a pak jednou pravým,...
No buďto přijít na to, proč dvojklik platí jen pro pravé tlačítko - či dvojklik levým + klik pravým - sám si to můžeš vyzkoušet (jedná se o spuštení programu). Pak by se mi uvolnilo pravé tlačítko - contextmenu strip bych dal pod pravé tlačítko a pak bych to mohl udělat podle tebe. Nebo pomocí toho UserControl,...
Ještě taková drobnost - bylo mi doporučeno nehrát si s top levelem, ale využít tohoto:
var container = new ContainerControl();
container.Controls.Add(...);
Jenže jak mám tento form zobrazit ve Formu1? Děkuji.
Dvojklik levým ti nefunguje protože:
private void Form2_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();// ! tímto jej rušíš
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Dej tam jen podmínku:
if ((e.Button == MouseButtons.Left) && (e.Clicks != 2))
A jo - já to měl ošetřené ve Formu1. Pomohl by jsi mi ještě s tím
containerem? Děkuji.
A cože to řešíš s tím kontejnerem? Nikdy jsem ho nepoužíval. Čeho chceš dosáhnout?
Mám ho použít pro to přidávání Formu2 do Formu1. Prý není dobré hrát si s top levelem,...
Ještě mám jeden problém - potřebuji zapsat změnu lokace onoho Formu2. Jenže pod eventem mouse up mi to nepracuje (chci jen aktuální pozici (takže nějak ji vytahovat z eventu locationchange mi přijde zbytečné) - pokud dojde ke změně,...). Tak mě napadá dát to pod mousemove - s podmínkou jeli stisknuta myš. Jak by ta podínka měla vypadat? Děkuji.
Sem to zkusil a funguje mi to. Normálně tvořim ChildForm.
V konstruktoru Form1
TransparencyKey = Color.Ivory;// nastavím transparenci
MdiClient Client = new MdiClient();// nastavím že form1 je Mdi klientem
this.Controls.Add(Client);
// a pak to přidáváš takto:
this.p = new Form2(Path.GetFileName(s), s, this);
this.p.MdiParent = this;
this.panel1.Controls.Add(p);
this.p.Show();
Přidávám to na panel, který překresluje Form1. Souřadnice se vypisují do Output okna.
Tady máš ten zdroják, kdyby ti něco nešlo. https://dl.dropbox.com/…er/Pinet.zip
Snad jsem to pochopil...
Tak mě to nejde - přetáhnu tam jeden soubor a nic,... Krom toho mám to v try bloku - kde se mi anuluje save.dat - takže vím mohu s jistotou říci, že to selhalo,...
Tak jsem to trochu opravil - zkomolil jsem to. Eviduji invertní problém -
ještě horší - nyní jsou všechny formy deaktivovány a při jejich
odstranění se nesmažou z save.dat,...
A s čím tedy potřebuješ pomoct? Já nevím co konkrétně chceš a psát za tebe program nechci.
Normálně si udělej okno a nastav mu IsMdiContainer. Pak si tam dej nějaký panel a na ten dávej ty další formy jako ChildMdi. Jak jsem ti psal.
Ty souřadnice zjistíš pak normálně pomocí Left, Top, bere to relativně od krajů v parent Formu.
Nebo si udělej panel a na ten dávej třeba picture box. Nevím totiž, jestli není zbytečné vytvářet několik instancí Form2 když ti stačí pictureBox, který můžeš využít stejně.
Musíš si promyslet, jak to chceš udělat. Nejdřív si udělej nějaký testovací blok odkud budeš načítat data a až to budeš mít odladěný pak dodělej přidávání přesouváním, pozicování atd...
Tobě to prostě nějak zázračně funguje - kouknul jsem do tvého zdrojáku a něco si změnil i ve Form2 - tak jsem myslel, že tam najdu odpověď - ale vypadáto, že to je jenom z nějakého generátoru - tak se na to ještě podívám. Děkuji za pomoc.
Pouze jsem do tvého zdrojového kódu připsal řádky, které jsem v
komentáři uvedl. Nebo mi pošli současný zdrojový kód a já se podívám,
kde máš chybu a řeknu ti.
No právě že tam nemám chybu - a nejde mi to - problém je ve formu1.
Zkopíruji tam tvůj kód a jede to - ale já mám stejný kód...
Edit: Kašlu na to - děkuji za pomoc - vše jede jak má,...
Jestli ti něco nefunguje tak ti rád pomůžu problém vyřešit
BTW: Jak edit? Cože?
Akoráte s tou pozicí si nerozumíme - potřebuji nějaký event - který zaznemená změnu pozice. Jenže když použiji event LocationChanged (či tak nějak), tak mi to vezme úplně všechny pozice - ne jen tu poslední - když byl form již program položen/ukotven. Proto jsem to dal do mouse up - vezmeto aktuální pozici pouze po akci mouse up - tedy to byla moje myšlenka - jenže to nefunguje. Nechápu proč. proto jsem se ptal tebe - jaký event bych měl použít,...
No jo - pardon,... Sám nevím - co se mu nelíbilo - tvému kódu rozumím a proto jsem se na to vykašlal - určitě by šlo o nějaký nedopisek. Nyní bych chtěl dořešit již jen tu pozici,...
Šak tam máš výpis v Output při změně pozice.
private void Form2_MouseDown(object sender, MouseEventArgs e)
{
if ((e.Button == MouseButtons.Left) && (e.Clicks != 2))
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
Debug.WriteLine(this.Left + "x" + this.Top);// při změně pozice se vypíše do Output (to debug okýnko dole) souřadnice
}
A je to správný zápis (který pak mohu použít do this.Location)?
Left je souřadnice od levého okraje parent Formu a Top pak od horního.
Zobrazeno 36 zpráv z 36.