2013-05-09 32 views
16

Pracuję nad projektem, w którym potrzebuję wyskakującego okienka. Ale chodzi o to, że chcę też móc dodawać pola tekstowe itp. W tym wyskakującym okienku przez projektanta formularzy.Okno wyskakujące w winform C#

W zasadzie mam przycisk i po kliknięciu na nim otworzy się kolejne okno, które zaprojektowałem w projektancie formularzy.

Zrobiłem trochę googlowania, ale nie znalazłem tego, czego potrzebowałem, więc miałem nadzieję, że możesz mi pomóc!

+0

Czy możesz przesłać nam przykładowy kod do odszyfrowania? – Sean

+0

Lepiej byłoby stworzyć własny formularz, aby zrobić dokładnie to, co chcesz zrobić. – gwin003

Odpowiedz

19

Po prostu utwórz kolejny formularz (zadzwoń pod numer FormPopoup) za pomocą Visual Studio. W przycisku obsługi napisać kod followng:

var form = new FormPopoup(); 
form.Show(this); // if you need non-modal window 

Jeśli potrzebujesz non-modalnego okna zastosowanie: form.Show();. Jeśli potrzebujesz okna dialogowego (aby Twój kod zawiesił się w tym wywołaniu do momentu zamknięcia otwartego formularza) użyj: form.ShowDialog()

+0

komentarz w fragmencie kodu powinien brzmieć: // jeśli potrzebujesz niemodalnego okna – AdamBT

+0

@AdamBT dzięki za naprawę –

+0

20 lat później i nadal przegrywasz! –

5

Formularze w języku C# są klasami dziedziczącymi klasę podstawową Form.

Możesz pokazać wyskakujące okienko, tworząc instancję klasy i wywołując ShowDialog().

2

Jeśli chcesz utworzyć nowy formularz po kliknięciu przycisku, poniższy kod może być dla ciebie przydatny :

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(); 
} 

Stamtąd można również użyć 'Show Dialog' method

1

„Ale jest to również chcę, aby móc dodać otaczaniem itp w tym oknie popup thru projektanta formularza.”

Z twojego opisu nie wiadomo, na jakim etapie procesu rozwoju się znajdujesz. Jeśli jeszcze tego nie wiesz, aby utworzyć nowy formularz, kliknij przycisk Projekt -> Dodaj formularz Windows, a następnie wpisz nazwę formularza i naciśnij przycisk "Dodaj". Teraz możesz dodawać elementy sterujące do formularza, jak można się spodziewać.

Kiedy przychodzi czas, aby go wyświetlić, postępuj zgodnie z poradami innych postów, aby utworzyć instancję i wywołaj odpowiednio Show() lub ShowDialog().

5

To nie jest takie proste, ponieważ w zasadzie pop-upy nie są obsługiwane w formularzach Windows. Chociaż formularze okien są oparte na win32, a w win32 popup są obsługiwane. Jeśli zaakceptujesz kilka sztuczek, poniższy kod ustawi Cię za pomocą wyskakującego okienka. Zdecydować, czy chcesz, aby umieścić go do dobrego wykorzystania:

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); 
    } 
} 

eksperymentowania z nim trochę, trzeba się bawić z jego położenia i jego wielkości. Użyj go źle i nic nie pokazuje.

+0

Dobrze, czy może to odziedziczyć po UserControl, czy może spowodować problemy? Jaki jest cel nadpisania wm_mouseactivate? ostatnie pytanie, czy mogę użyć this.Activate(), aby zachować zgodność z mono lub czy to nie zadziała, ponieważ nie jest to forma? ty – Behrooz

+1

Nie wiem o kontroli użytkownika, jest ona już wyprowadzona z kontroli, więc ma inne wyspecjalizowane zachowanie niż kontrola, ale może działać. Nigdy nie testowałem tego na mono, nie jestem pewien co do bardziej konkretnego importu dll. W skrócie wykorzystuje bazowy system api win32. –

+0

hi phillip, czy masz pojęcie dotyczące tego pytania https://stackoverflow.com/questions/47384504/in-c-sharp-winforms-how-can-i-prevent-form-from-being-activated-when- a-kontrola – barlop

0

Używam tej metody.

dodaj z tego, co chcesz wyskoczyć, dodaj wszystkie potrzebne elementy sterujące. w kodzie możesz obsłużyć dane wprowadzane przez użytkownika i wyniki zwracane do dzwoniącego. , aby wyświetlić formularz, wystarczy utworzyć nowe wystąpienie formularza i pokazać metodę.