2013-05-09 19 views
16

私はポップアップウィンドウが必要なプロジェクトに取り組んでいます。しかし、私はまた、このポップアップウィンドウでフォームデザイナーを使ってテキストボックスなどを追加できるようにしたいと思っています。winformのポップアップウィンドウ#

基本的にはボタンがあります。クリックすると、フォームデザイナーで設計した別のウィンドウが開きます。

私はいくつかのグーグルをやっていますが、私はまだ私があなたが私を助けることができるように私はまだ必要なものを見つけていない!

+0

解読するサンプルコードを投稿してください。 – Sean

+0

あなたがしたいことを正確に行うために独自のフォームを作成する方がよいでしょう。 – gwin003

答えて

19

Visual Studioを使用して別のフォーム(FormPopoupと呼ぶ)を作成してください。 form.Show();:あなたは非モーダルウィンドウを使用する必要がある場合

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

:ボタンハンドラでfollowngコードを記述します。ダイアログが必要な場合(開かれたフォームを閉じるまで、この呼び出しでコードが停止する):form.ShowDialog()

+0

コードスニペットのコメントは://非​​モーダルウィンドウが必要な場合 – AdamBT

+0

@AdamBTは修正のためにありがとう –

+0

20年後にまだupvote! –

5

C#でのフォームは、Formベースクラスを継承するクラスです。

ポップアップを表示するには、クラスのインスタンスを作成し、ShowDialog()を呼び出します。

2

ボタンをクリックしたときに新しいフォームを作成する場合は、次のコードを使用することができます:

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

ここから、あなたも'Show Dialog' method

1

を使用することができます「しかし、事は、私はまた、フォームデザイナスルーこのポップアップウィンドウにテキストボックスなどを追加できるようにしたいです。」

それはあなたがにいる開発プロセスのどの段階でのあなたの説明からは不明だあなたはすでにそれを考え出したていない場合は、 プロジェクトをクリックして新しいフォームを作成する

- 。>その後、Windowsフォームを追加します。フォームの名前を入力し、「追加」ボタンを押します。これで、フォームにコントロールを追加することができます。

これを表示するには、他のポストのアドバイスに従ってインスタンスを作成し、必要に応じてShow()またはShowDialog()を呼び出します。

5

基本的なポップアップはWindowsフォームではサポートされていないため、これは簡単ではありません。 Windowsフォームはwin32に基づいており、win32ではポップアップがサポートされています。 いくつかのトリックを受け入れると、次のコードでポップアップが表示されます。

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

少し試してみると、その位置とサイズで遊ぶ必要があります。間違って使用しても何も表示されません。

+0

ニース、これはUserControlから継承できますか、それとも問題が発生しますか? wm_mouseactivateを上書きする目的は何ですか?最後の質問、this.Activate()を使用してモノとの互換性を保つことはできますか?これはフォームではないので動作しませんか? ty – Behrooz

+1

ユーザーコントロールについてはわかりませんが、既にコントロールから派生しているため、コントロールよりも特殊な動作がありますが、動作する可能性があります。モノでもこれをテストしたことはありません。より具体的になるようにdllのインポートについてはわかりません。要するに、基本的なwin32 apiシステムを利用しています。 –

+0

こんにちはフィリップ、あなたはこの質問に関するアイデアを持っていますかhttps://stackoverflow.com/questions/47384504/in-c-sharp-winforms-how-can-i-prevent-form-from-being-activated-when- a-コントロール – barlop

0

私はこの方法を使用しています。

ポップアップを追加するには、必要なコントロールをすべて追加します。コード内の を使用すると、ユーザーの入力を処理して呼び出し元に結果を返すことができます。 フォームをポップアップするには、フォームの新しいインスタンスを作成し、メソッドを表示するだけです。

/* 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"); 
} 
関連する問題