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
matesax
Tvůrce
Avatar
matesax:6.5.2012 7:27

Dobrý den,
nedaří se mi zprovoznit pohybování s oknem:

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();

       private void Form1_MouseDown(object sender,
       System.Windows.Forms.MouseEventArgs e)
       {
           if (e.Button == MouseButtons.Left)
           {
               ReleaseCapture();
               SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
           }
       }

Neměl bych třeba něco povolit ve Form1? Děkuji.

 
Odpovědět
6.5.2012 7:27
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 7:43

Ahoj,
tohle má dělat, že pokud klepneš na form a táhneš myší, že se okno bude hýbat?

Nahoru Odpovědět
6.5.2012 7:43
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 7:45

To právě nevím. Ale přesně to chci. :)

 
Nahoru Odpovědět
6.5.2012 7:45
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 7:47

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.

Nahoru Odpovědět
6.5.2012 7:47
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 7:52

Hej!! Děkuji moc! :)

 
Nahoru Odpovědět
6.5.2012 7:52
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 7:56

A nešlo by ještě zakázat maximalizaci?

 
Nahoru Odpovědět
6.5.2012 7:56
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 8:22

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á.

Nahoru Odpovědět
6.5.2012 8:22
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:26

Ale to jsem chtěl - nepotřebuji specifikovat jak, nebo kde musí hráč kliknout. :)

 
Nahoru Odpovědět
6.5.2012 8:26
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 8:29

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?

Nahoru Odpovědět
6.5.2012 8:29
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:32

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,...

 
Nahoru Odpovědět
6.5.2012 8:32
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:6.5.2012 8:34

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,...

 
Nahoru Odpovědět
6.5.2012 8:34
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 8:36

Stačí nastavit Maximize na false, jak jsem již psal...

Nahoru Odpovědět
6.5.2012 8:36
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:37

No ve form properties je maximálně maximize box. :)Ale nastavím to tím příkazem v inicializaci,...

 
Nahoru Odpovědět
6.5.2012 8:37
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 8:42

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 :D

Nahoru Odpovědět
6.5.2012 8:42
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:43

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).

 
Nahoru Odpovědět
6.5.2012 8:43
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:44

Ale když kliknu dvakrát myší, tak se mi to maximalizuje - tak mám halucinace? :)

 
Nahoru Odpovědět
6.5.2012 8:44
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 8:45

Já nevěděl jak to přesně je:

this.MaximizeBox = false;
Nahoru Odpovědět
6.5.2012 8:45
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 8:48

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,...

 
Nahoru Odpovědět
6.5.2012 8:48
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 9:09

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 ;)

Nahoru Odpovědět
6.5.2012 9:09
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 9:28

Sem se díval a ten tvůj kód je asi nejvhodnější no :D
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);
}
Nahoru Odpovědět
6.5.2012 9:28
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 9:32

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);
           }
       }
 
Nahoru Odpovědět
6.5.2012 9:32
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 9:33

Pardon - moje chyba. :)

 
Nahoru Odpovědět
6.5.2012 9:33
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 9:35

MouseDown ;)

Nahoru Odpovědět
6.5.2012 9:35
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:6.5.2012 9:36

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);
           }
       }
 
Nahoru Odpovědět
6.5.2012 9:36
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 9:57

Nechceš poslat program? :)

 
Nahoru Odpovědět
6.5.2012 9:57
Avatar
David Jančík
Vlastník
Avatar
Nahoru Odpovědět
6.5.2012 10:00
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 10:03

To je ten kód, co jsem ti posílal na začátku. :)

 
Nahoru Odpovědět
6.5.2012 10:03
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:6.5.2012 10:04

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 ;)

Nahoru Odpovědět
6.5.2012 10:04
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:6.5.2012 10:06

Už nikde - rozchodil jsem to. :) Děkuji za pomoc. :)

 
Nahoru Odpovědět
6.5.2012 10:06
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 29 zpráv z 29.