Diskuze: Pohybování s oknem

C# .NET .NET (C# a Visual Basic) Pohybování s oknem American English version English version

Avatar
matesax
Redaktor
Avatar
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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

 
Nahoru Odpovědět 6.5.2012 7:45
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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

 
Nahoru Odpovědět 6.5.2012 7:56
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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

 
Nahoru Odpovědět 6.5.2012 8:26
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Redaktor
Avatar
Odpovídá na matesax
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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

Nahoru Odpovědět 6.5.2012 8:36
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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

this.MaximizeBox = false;
Nahoru Odpovědět 6.5.2012 8:45
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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
Redaktor
Avatar
Avatar
Nahoru Odpovědět 6.5.2012 9:35
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na matesax
matesax:

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
Redaktor
Avatar
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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

 
Nahoru Odpovědět 6.5.2012 10:03
Avatar
Odpovídá na matesax
David Jančík [sczdavos]:

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
Čím více času dostaneš, tím méně ho máš.
Avatar
matesax
Redaktor
Avatar
Odpovídá na David Jančík [sczdavos]
matesax:

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.