2013-05-09 62 views
16

Açılır pencereye ihtiyacım olan bir proje üzerinde çalışıyorum. Ama ben de bu pop-up pencerede form tasarımcıları aracılığıyla metin kutuları vb. Ekleyebilmek istiyorum.Winup penceresinde açılan pencere C#

Temel olarak bir düğmem var ve üzerine tıkladığınızda form tasarımcısında tasarladığım başka bir pencere açılacak.

Biraz googling yapıyorum ama ihtiyacım olanı bulamadım, bu yüzden bana yardımcı olabileceğinizi umuyordum!

+0

Lütfen deşifre etmemiz için bazı örnek kodlar gönderir misiniz? – Sean

+0

Tam olarak ne yapmak istediğinizi yapmak için kendi formunuzu yaratmanız daha iyi olur. – gwin003

cevap

19

Görsel stüdyosu kullanarak başka bir form oluşturun (buna FormPopoup numaralı telefonu arayın). düğme işleyicisi followng kod yazmak:

olmayan kalıcı pencere kullanımını gerekiyorsa
var form = new FormPopoup(); 
form.Show(this); // if you need non-modal window 

: form.Show();. Eğer bir düğmeye tıklandığında yeni bir form oluşturmak için demek durumunda form.ShowDialog()

+0

kod pasajına yorum yapmalısınız: // modal olmayan pencereye ihtiyacınız varsa – AdamBT

+0

@AdamBT Düzeltme için teşekkürler –

+0

20 yıl sonra ve hala bir oy! –

5

C# formundaki formlar, Form temel sınıfını devralan sınıflardır.

Sınıfın bir örneğini oluşturarak ve ShowDialog() numaralı telefonu arayarak bir açılır pencere açabilirsiniz.

2

Aşağıdaki kod size bazı yarayabilir: Eğer iletişim gerekiyorsa kullanmak (Formu açıldı bu yakın dek böylece kod Bu çağrı üzerine asılı olacak) :

private void settingsButton_Click(Object sender, EventArgs e) 
{ 
    // Create a new instance of the Form2 class 
    Form2 settingsForm = new Form2(); 

    // Show the settings form 
    settingsForm.Show(); 
} 

buradan da 'Show Dialog' method

1

kullanabilirsiniz "Ama şey de form tasarımcısı aracılığıyla bu pop-up pencerede metin kutularının vb eklemek mümkün olmak istiyorum" dedi.

Bu konum geliştirme sürecinde hangi aşamada adresinden açıklamasından belirsiz zaten çözemedim varsa, Projesi tıklayarak yeni bir formu oluşturmak

-.> Sonra, Windows formu ekle form için bir ad girin ve "Ekle" düğmesine basın. Artık formunuza beklediğiniz gibi kontroller ekleyebilirsiniz.

Görüntülenme zamanı geldiğinde, örnek oluşturmak için diğer yayınların önerilerine uyun ve uygun şekilde Show() veya ShowDialog() öğesini çağırın.

5

Bu çok kolay değil, çünkü temel olarak popup'lar pencere formlarında desteklenmiyor. Windows formları win32 ve win32 açılırsa da desteklenmektedir. Birkaç hile kabul ederseniz, aşağıdaki kod size bir açılır pencere ile gidecektir. onunla

class PopupWindow : Control 
{ 
    private const int WM_ACTIVATE = 0x0006; 
    private const int WM_MOUSEACTIVATE = 0x0021; 

    private Control ownerControl; 

    public PopupWindow(Control ownerControl) 
     :base() 
    { 
     this.ownerControl = ownerControl; 
     base.SetTopLevel(true); 
    } 

    public Control OwnerControl 
    { 
     get 
     { 
      return (this.ownerControl as Control); 
     } 
     set 
     { 
      this.ownerControl = value; 
     } 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 

      createParams.Style = WindowStyles.WS_POPUP | 
           WindowStyles.WS_VISIBLE | 
           WindowStyles.WS_CLIPSIBLINGS | 
           WindowStyles.WS_CLIPCHILDREN | 
           WindowStyles.WS_MAXIMIZEBOX | 
           WindowStyles.WS_BORDER; 
      createParams.ExStyle = WindowsExtendedStyles.WS_EX_LEFT | 
            WindowsExtendedStyles.WS_EX_LTRREADING | 
            WindowsExtendedStyles.WS_EX_RIGHTSCROLLBAR | 
            WindowsExtendedStyles.WS_EX_TOPMOST; 

      createParams.Parent = (this.ownerControl != null) ? this.ownerControl.Handle : IntPtr.Zero; 
      return createParams; 
     } 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern IntPtr SetActiveWindow(HandleRef hWnd); 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      case WM_ACTIVATE: 
       { 
        if ((int)m.WParam == 1) 
        { 
         //window is being activated 
         if (ownerControl != null) 
         { 
          SetActiveWindow(new HandleRef(this, ownerControl.FindForm().Handle)); 
         } 
        } 
        break; 
       } 
      case WM_MOUSEACTIVATE: 
       { 
        m.Result = new IntPtr(MouseActivate.MA_NOACTIVATE); 
        return; 
        //break; 
       } 
     } 
     base.WndProc(ref m); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.FillRectangle(SystemBrushes.Info, 0, 0, Width, Height); 
     e.Graphics.DrawString((ownerControl as VerticalDateScrollBar).FirstVisibleDate.ToLongDateString(), this.Font, SystemBrushes.InfoText, 2, 2); 
    } 
} 

Experiment biraz onun konumu ve büyüklüğü ile uğraşmak zorunda: Eğer iyi kullanmak koymak istiyorsanız karar verin. Yanlış kullan ve hiçbir şey göstermiyor. Bu yöntemi kullanıyorum

+0

Güzel, Bu UserControl'den miras mı yoksa sorunlara mı yol açabilir? Wm_mouseactivate'i geçersiz kılma amacı nedir? son soru, this.Activate kullanabilir miyim() Monitörü ile birliktelik tutmak için ya da bu bir form olmadığı için işe yaramaz mı? ty – Behrooz

+1

Kullanıcı kontrolü hakkında bir şey bilmiyorsunuz, zaten kontrolün kendisinden türetilmiş, bu yüzden kontrolten başka özel davranışlar var, ama işe yarayabilir. Bunu asla mono üzerinde denemedim, dll içeriğinin daha spesifik olması konusunda emin değilim. Kısacası, alttaki win32 api sistemini kullanıyor. –

+0

Merhaba phillip, bu soru hakkında herhangi bir fikriniz var mı? Https://stackoverflow.com/questions/47384504/in-c-sharp-winforms-how-can-i-prevent-form-from-being-activated-when- Kontrol – barlop

0

.

Açmak istediğiniz öğeden ekleyin, ihtiyacınız olan tüm denetimleri ekleyin. kodunda kullanıcı girişini ve geri dönüş sonucunu arayan kişiye verebilirsiniz. Formu açmak için sadece form ve gösteri yönteminin yeni bir örneğini oluşturun.

/* create new form instance. i am overriding constructor to allow the caller form to set the form header */ 
var t = new TextPrompt("Insert your message and click Send button"); 
// pop up the form 
t.Show(); 
if (t.DialogResult == System.Windows.Forms.DialogResult.OK) 
{ 
    MessageBox.Show("RTP", "Message sent to user"); 
}