Diskuze: Pohybování s oknem
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 29 zpráv z 29.
//= 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.
Ahoj,
tohle má dělat, že pokud klepneš na form a táhneš myší, že se okno bude
hýbat?
Zkus tohle
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
int WM_NCHITTEST = 0x84;
if (m.Msg == WM_NCHITTEST)
{
int HTCLIENT = 1;
int HTCAPTION = 2;
if (m.Result.ToInt32() == HTCLIENT)
m.Result = (IntPtr)HTCAPTION;
}
}
Jen to přidej jako metodu do formu, do kterého potřebuješ.
(nejjednodušší použití)
Pak form reaguje jako rámeček.
No záleží na tom, kde to používáš. Pokud chceš maximalizaci zakázat
celému formu tak stačí Form1.maximize = false nebo přímo v designeru
klepneš na form a dole je Maximize tak dáš hodnotu false.
Jenom té fci co jsem ti poslal bychom museli nějak přepracovat, tohle funguje
tak, že předává vše co jí myší dáš tomu rámečku nebo titlebaru jak
se tomu říká.
Ale to jsem chtěl - nepotřebuji specifikovat jak, nebo kde musí hráč
kliknout.
Takže potřebuješ aby když klepneš na form a táhneš aby se ti okno hýbalo a když klepneš 2x aby se nic nestalo. A maximalizce má fungovat jenom při klepnutí na příslušné tlačítko v titlebaru?
Ne - maximalizovat okno stejně nejde - nastavil jsem pevnou velikost okna - jen nechci, aby když na to hráč dvakrát klikne, aby se to zbytečně maximalizovalo - maximalizuje se to, ale velikost nezmění - zbytečně to s oknem hází - a když to hráč udělá omylem,...
Tím ne mám na mysli, ne nechci aby se to maximalizovalo příslušným
tlačítkem - vypadá to tam docela přísně - to ne - to se omlouvám. Mám form absolutně osekaný - jen
prázdné okno - všechny tlačítka si dělám sám a maximalizaci
nechci,...
Stačí nastavit Maximize na false, jak jsem již psal...
No ve form properties je maximálně maximize box. Ale nastavím to tím příkazem v
inicializaci,...
To je jedno a to samé
No vlastně když se podíváš do Form1.designer tak zjistíš, že vše co
nastavuješ v grafickém rozhraní IDE sám přepisuje do tohoto souboru. Takže
se vlastně nastaví maximize na true a pak jej v programu anstavíš ty na
false, takže se jeho hodnota 2x změní. To ničemu nevadí, jen je to takový,
že já když se něco takovýho děje, že mě to štve a furt si do toho rejpu
Tak ten příkaz mi to nebere. Zkoušel jsem kombinovat. Když chci minimalizovat (tím mojím tlačítkem), tak používám FormWindowState (to mi funguje).
Ale když kliknu dvakrát myší, tak se mi to maximalizuje - tak mám
halucinace?
Já nevěděl jak to přesně je:
this.MaximizeBox = false;
Maximize box mám false - to jsem dělal ještě před 2 hodinama. Pak jsem
chtěl povolit posouvání a to už jsem psal sem. Když na to 2X kliknu maximalizuje
se to. mazimizeBox dle mého názoru bude tlačítko - protože tím jsem se
toho tlačítka zbavil,...
Aha, koukám no. Ono to totiž nefunguje, když vypneš ten titlebar
(FormBorderStyle = none). Pak ti to jde maximalizovat. Kouknu na to dej mi
chvilku
Sem se díval a ten tvůj kód je asi nejvhodnější no
Toto dáš někam do onoho formu:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,
int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
Pak si v grafickém náhledu na form klepneš na události (takový blesk v
properties panelu).
Tam si najdeš MouseDown event. dvakrát klepneš do toho prázdného políčka
a do vytvořené metody vložíš:
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
Nechci tě zklamat, ale nejde to:
private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Tak se neomlouvám - skutečně to nejde :
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Jop a je tam funkční ukázka ke stažení se zdrojovými kódy. Tak si ji
stáhni a podívej se kde máš chybu
Zobrazeno 29 zpráv z 29.