it-swarm.dev

Pencerelerin taşınmasını nasıl önlersiniz?

Bir formun hareket etmesini nasıl durdurabilirim? Kenarlık stilini FixedSingle olarak ayarlamıştım ve Vista'da iyi göründüğü için bu şekilde tutmak istiyorum :)

34
Ozzy

Şuna bir göz atın link . 3. seçenekle ilgilenebilirsiniz. Bazı yerel kodları sarmanızı gerektirir, ancak çalışması gerekir. Bağlantının altında, bunu yapmanın daha kolay bir yolunu gösteren bir yorum da var. Yorumdan alınmış (bunun için kredi alamazsınız, ancak size biraz arama kaydedeceğim):

protected override void WndProc(ref Message message)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MOVE = 0xF010;

    switch(message.Msg)
    {
        case WM_SYSCOMMAND:
           int command = message.WParam.ToInt32() & 0xfff0;
           if (command == SC_MOVE)
              return;
           break;
    }

    base.WndProc(ref message);
}
64
Jason Down

Formun FormBorderStyle özelliğini Yok olarak ayarlayabilirsiniz.

this.FormBorderStyle=System.Windows.Forms.FormBorderStyle.None
24
crypted

Bunu formun hareket etmesini durdurmak için buldum (c # cinsinden)

protected override void WndProc(ref Message m)
        {
            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MOVE = 0xF010;

            switch (m.Msg)
            {
                case WM_SYSCOMMAND:
                    int command = m.WParam.ToInt32() & 0xfff0;
                    if (command == SC_MOVE)
                        return;
                    break;
            }
            base.WndProc(ref m);
        }

Burada bulundu

8
V4Vendetta

Formunuzu taşınmaz yapmak iyi bir uygulama değildir. Yerinde olsam bile bunun hakkında düşünürdüm.
Zaten bunu, menüden [Taşı] menü öğesini devre dışı bırakmak için WinProc'i geçersiz kılarak yapabilirsiniz. 

[DllImport("user32.dll")]
private static extern Int32 EnableMenuItem ( System.IntPtr hMenu , Int32uIDEnableItem, Int32 uEnable);  
private const Int32 HTCAPTION = 0×00000002;  
private const Int32 MF_BYCOMMAND =0×00000000;  
private const Int32 MF_ENABLED =0×00000000;  
private const Int32 MF_GRAYED =0×00000001;  
private const Int32 MF_DISABLED =0×00000002; 
private const Int32 SC_MOVE = 0xF010; 
private const Int32 WM_NCLBUTTONDOWN = 0xA1;
private const Int32 WM_SYSCOMMAND = 0×112;
private const Int32 WM_INITMENUPOPUP = 0×117;

protected override void WndProc(ref System.Windows.Forms.Message m )
{
if (m.Msg == WM_INITMENUPOPUP)
{
    //handles popup of system menu
    if ((m.LParam.ToInt32() / 65536) != 0) // 'divide by 65536 to get hiword
    {
        Int32 AbleFlags = MF_ENABLED;
        if (!Moveable)
        {
            AbleFlags = MF_DISABLED | MF_GRAYED; // disable the move
        }
        EnableMenuItem(m.WParam, SC_MOVE, MF_BYCOMMAND | AbleFlags);
    }
}
if (!Moveable)
{
    if (m.Msg == WM_NCLBUTTONDOWN) //cancels the drag this is IMP
    {
        if (m.WParam.ToInt32() == HTCAPTION) return;
    }
    if (m.Msg == WM_SYSCOMMAND) // Cancels any clicks on move menu
    {
        if ((m.WParam.ToInt32() & 0xFFF0) == SC_MOVE) return;
    }
}
base.WndProc(ref m);
}  

Ayrıca, formunuzun OnMove olayını işleyebilirsiniz. Ancak bunun titremeye neden olacağını düşünüyorum: 

private void Form1_Move(object sender, EventArgs e)
{
    this.Location = defaultLocation;
}
2
Kamyar

Hepsi güzel değil (formu taşımaya çalışırken bazı yanıp sönmeler oluyor), ancak formu istediğiniz yerde tutmak için LocationChanged özelliğini kullanabilirsiniz:

private Point _desiredLocation;
// assign the _desiredLocation variable with the form location at some
// point in the code where you know that the form is in the "correct" position


private void Form_LocationChanged(object sender, EventArgs e)
{
    if (this.Location != _desiredLocation)
    {
        this.Location = _desiredLocation;
    }
}

Meraktan; neden bunu yapmak istiyorsun?

2
Fredrik Mörk

Windows'ta WS_CAPTION stili, pencerenizin bir fareyle hareket ettirilmesine izin veren istemci olmayan alandır. Demek istediğin şeyi yapmanın en kolay yolu, bu stili pencerenden kaldırmak.

Bununla birlikte, bir altyazıya sahip olmanız ve hala istediğiniz şeyi elde etmeniz gerekiyorsa, bir sonraki stil WM_NCHITTEST mesajını yakalamak ve HTCAPTION için kontrol etmektir. Kod HTCAPTION ise, bunun yerine NTNOWHERE değerini döndürün. Bu, varsayılan pencere prosedürünün, varsayılan pencere hareketini gerçekleştirmesini engelleyecektir.

2
Tommy Hui

WndProc’i geçersiz kılmaya çalışın:

protected override void WndProc(ref Message m)
{
   const int WM_NCLBUTTONDOWN = 161;
   const int WM_SYSCOMMAND = 274;
   const int HTCAPTION = 2;
   const int SC_MOVE = 61456;

   if ((m.Msg == WM_SYSCOMMAND) && (m.WParam.ToInt32() == SC_MOVE))
   {
       return;
   }

   if ((m.Msg == WM_NCLBUTTONDOWN) && (m.WParam.ToInt32() == HTCAPTION))
   {
       return;
   }

   base.WndProc(ref m);
}
2
Reniuz
  1. Form olaylarına git-> Konum değiştirildi

aşağıdaki kodu yaz

Location = new Point(this.Width,this.Height);
2
Prasad Bhosale

Sadece FormBorderStyle özelliğini None olarak değiştirin.

1
Hamza Javed

Sadece formlocation_changed olayındaki konumu, yani bulunduğu yere sıfırlayın. Örneğin, taşınmadan önce Form.Location değişkenine ayarlayın ve kullanıcı onu taşımaya çalıştığında, ayarladığınız değişken konumuna geri dönecektir.

0
Riftus

Özel Alt MyFormLock () Me.Location = Yeni Nokta (0, 0) Son Alt

Private Sub SearchSDR_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LocationChanged
    Call MyFormLock()
End Sub
0

Formu taşınmaz hale getirme ihtiyacınızı sorgularım. Bu kulağa hoş gelmiyor. Elbette, pencereyi kapatıp pencereyi bu konuma tekrar açtığınızda, pencerenin konumunu kaydedebilirsiniz. Bu, kullanıcıya pencerenin bulunduğu yer üzerinde bir miktar kontrol sağlar.

0
David McEwing

form özelliğini StartPostion öğesini Manüel ..__ olarak değiştirin .. Sonra LocationChanged olayını işleyin:

private void frmMain_LocationChanged(object sender, EventArgs e)
{
Location = new Point(0, 0);
}
0
sayadyanh

Deneyebilirsin:

this.Locked = true;
0
Dylan Roberts

Form.Move olayına abone olabilir ve bundan yeniden konumlandırabilirsiniz.

0
Oded