2010-10-06 7 views
10

ben dinamik olarak oluşturulan denetimleri oluşturmak için gereken bir uygulama oluşturma kendi seçtiği yerde bir dinamik olarak oluşturulan denetim sürükleyip metin kutusunu demek ya vs. O kullanıcının bu taşınmaya olabilir Şimdi ne olacakkullanıcı

etiketlemek için izin nasıl textbox istediği yere. Visual Studio'da yaptığımız gibi. Tek yol, metin kutusundan değerlerini alarak yeni konum elde etmektir. Ama kullanıcı arayüzünü çok istiyorum.

biz Ardından, bir veri nesnesi içeren veya sürükle bırak işlemi & başlaması kontrolünü temsil ile DoDragDrop çağrı kabın DragDrop olayı işlemek ve kontrol taşıyabilirsiniz Win

+1

Evet, ancak sıkı çalışmanız gerekecek. – SLaks

+0

@SLaks: Beni biraz yönlendirir misin? Gerektiği kadar zaman verebilirim. İşimde çözülmek için bu problemi çözdüm, ama müvekkilimizi imkansız olduğuna ikna ettik. Ama mümkün olduğunu biliyorum Bu yüzden evimde yapmak istiyorum. Lütfen nereden başlayacağınızı bildirin. –

cevap

20

Denetimi sürükleyerek denetimi nasıl hareket ettireceğinizi gösteren basit bir form oluşturdum. Örnek, ilgili olay işleyicisine ekli formda button1 adında bir düğme olduğunu varsayar.

private Control activeControl; 
private Point previousLocation; 

private void button1_Click(object sender, EventArgs e) 
{ 
    var textbox = new TextBox(); 
    textbox.Location = new Point(50, 50); 
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown); 
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove); 
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp); 

    this.Controls.Add(textbox); 
} 

void textbox_MouseDown(object sender, MouseEventArgs e) 
{ 
    activeControl = sender as Control; 
    previousLocation = e.Location; 
    Cursor = Cursors.Hand; 
} 

void textbox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (activeControl == null || activeControl != sender) 
     return; 

    var location = activeControl.Location; 
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); 
    activeControl.Location = location; 
} 

void textbox_MouseUp(object sender, MouseEventArgs e) 
{ 
    activeControl = null; 
    Cursor = Cursors.Default; 
} 
+1

İşte bu http://www.youtube.com/watch?v=itdFYe7La-Y uygulandıktan sonra oluşturduğum video –

1

böyle özelliğe sahip olabilir.

bunu sürükledi olarak kontrolünü görmek isterseniz, şeffaf kontrolünü (DrawToBitmap call) gösteren fare altında formu (WM_NCHITTEST işlemek) yapmak veya hiç sürükleyin & damla kullanmak ve bunun yerine fare olayları işleyemez ya ve durumu manuel olarak takip edin.

Visual Studio stili ek karakterleri istiyorsanız, denetim sınırlarını diğer denetimlere göre karşılaştırabilir, çizilecek çizgi çizebilir ve bunları bir boya olayına çizebilirsiniz.

+0

Panel ve Düğme Denetimi olaylarında görebiliyorum. DoDragDrop olayı/özellik yok. AllowDrop'un doğru olması zorunda mıyım? –

+0

Evet; Kapsayıcıda 'AllowDrop' ayarlamalısınız. 'DoDragDrop' fare' SystemInformation.DragSize' dışına taşındı eğer MouseDown kısa bir süre sonra MouseMove çağırmak için gereken bir yöntemdir. – SLaks

+0

Buradaki örneğe bakın: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dodragdrop.aspx – SLaks