2011-08-04 12 views
7

Windows Forms C# 'da kullanıyorum.Bir form ve işlem butonunu aynı anda aktif hale getirin mi?

ToolStripButtons içeren birkaç araç çubuğu ile ana formum var. Veri içeren başka bir formla çalıştıktan sonra, ana form odağı kaybeder ve bir araç tıklatırStripButton OnClick olayını tetiklemez: ilk tıklama ana formu etkinleştirir ve yalnızca ikinci tıklama düğmeyi iter. Bir Tıklatma etkinliğini tetiklemek için kullanıcının yalnızca bir kez tıklamasına, bunun nasıl yapılacağına dair herhangi bir fikre ihtiyacım var? Teşekkürler.

Notlar:

  • Ben MDI kullanıyordum ve ebeveynin formu düğmeleri tıklayarak sorun bulunmuyor. Ancak şimdi en önemli şey, birden fazla ekran üzerinde serbestçe dolaşan formlara sahip olmaktır.
  • İşçi formları, Owner özelliği olarak ana forma sahiptir, bu şekilde ana formun üstünde kalırlar.
  • Etkin olmayan bir formun düğmesine tıkladığımda, MouseHover, MouseEnter, MouseDown veya MouseUp yangınlarının hiçbiri yok. Bu sadece ana formun harekete geçen Etkinleştir etkinliğidir.
  • Ana formda bir treeView (bir panel içinde bir splitContainer içinde bir tabControl içinde, bir panelin içinde) vardır. Ana form etkin olmasa bile, öğeleri ilk fare tıklamasıyla seçilir. Sanırım tüm kontroller eşit değil! Yapmanız gereken şey

cevap

6

ToolStrip devralır ve WndProc işleyen bir sınıf oluşturmaktır. Bunu yapmanın bir yolu budur. Başkaları var.

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

Ben çalıştığım son yerde bu koştu, ben ile geldi çözüm daha sonraki gibi çalıştı düşünüyorum, ama don:

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

Ben de bu çözüm gördüğüm Kullandığım şifreye erişimim yok.

+2

inşa için bu mantık ikinci çözüm kullanıyorum çalışıyordu ve o inşaat büyük olursa. Teşekkür ederim! –

+0

Sadece bir not, base.WndProc olmalıdır (ref m); –

+0

Üzgünüz, ben onu VB'den otomatik olarak dönüştürdüm. Onu tamir edeceğim. – dwidel

-4

u Sınır tanımayan Formu var, yani :)

form.FormBorderStyle = FormBorderStyle.None 
+4

Cevabınız, bu soruyla ilgisi yok gibi görünüyor. – LarsTech

İlgili konular