2009-10-27 17 views
7

メッセージボックスを親フォームの中央に表示します。フォームを移動してメッセージボックスを表示すると、それは常にデスクトップの中央に表示されます。私はそれをフォームと共に表示したい。 私はいくつかのトリックとアドバイスをくれますか?MessageBox.Show()

答えて

3

これを行う最善の方法は、ウィンドウフックを使用してメッセージボックスを自分の中心に置くことです。この使用法を示す完全な記事があります。

あなたはここでそれを見つけることができます: http://www.codeproject.com/KB/dialog/CenterDialog.aspx

また、それが実際にどのように動作するかを調べるためにあまりにも深くにダイビングせずにアプリケーションでクラスを使用することができます。ここで

+0

記事は素晴らしいです。私のアプリにそれを適用する前にそれを理解する必要があります。 tnx。はるかに簡単な方法はありますか? heh .. –

+1

最も簡単な方法は、自分で新しいMessageBoxフォームを作成することです。それはあなたの好みに合っていて、あなたが望むように見えます。また、好きな機能を追加することもできます。 – Yogesh

2

オーナーを設定しないで、メッセージボックスウィンドウの所有者を(.Show()の最初のパラメータを使用して)ウィンドウに設定します。

参照のためにhereを参照してください。

+1

をあなたは私を与えることができますいくつかの例? 私はこれを試しました: IWin32Window win = this; MessageBox.Show(win、 "TESTING"); 同じ結果ですが、メッセージボックスはデスクトップの真ん中にまだポップアップしています –

+0

私はそれが 'this'が何であるかにかかっていると思います。私の経験はネイティブのWin32 'MessageBox()'関数に限られているのですが、これはちょっと違っていて、WinFormsを使用していることを理解する前に、だから私は私がリファレンスで見つけたものに合うように私の答えを修正しましたが、まだいくつかの詳細が欠落しているかもしれません。 :) –

+1

MessageBoxにウィンドウハンドルを渡しても、メッセージボックスは親の中央に表示されません。親と最小化/最大化を有効にするだけで、メッセージボックスウィンドウの特定のタスクアイコンはありません。 – Yogesh

1

これまではC#でこれを行っています。ここに私が覚えていることがあります。

は、クラスを定義します。

public class IWindowWrapper : System.Windows.Forms.IWin32Window 
{ 
    public IWindowWrapper(IntPtr handle) 
    { 
     this.Handle= handle; 
    } 

    public IntPtr Handle 
    { 
     get; 
     set; 
    } 
} 

は、メッセージボックスに基づいてクラスを定義します。 メッセージボックスに基づくクラスを作成し、新しいShowメソッドを作成します。あなたの呼び出し元のコードで

public string Show(IWin32Window owner) 
{ 
    if(owner == null) 
    { 
    this.ShowDialog(); 
    } 
    else 
    { 
     //parentWindow. 
     this.StartPosition = FormStartPosition.CenterParent; 
     this.ShowDialog(owner); 
    } 

} 

(ここではWinフォームであると想定され、メッセージボックスが新しいメッセージボックスクラスに基づいています)新しいShowメソッドを呼び出しますShowなどにIWindowWrapperインスタンスを渡します。

msgBox.Show(new IWindowWrapper(this.Handle)) 
+0

「ベース」と言えば、継承するのですか? C#でちょっと新しい。 :) –

+0

はいパブリッククラスMyMessageBox:MessageBox ...など – ChrisBD

+0

これを行うにはC#を使用する必要はありませんが、それは私が使用したものです。それはあなたがプログラミングしている言語ですか? – ChrisBD

0

は、ソリューションを使用することは非常に簡単であり、それは完璧に動作します:

ステップ:

  1. コピーしてプロジェクトにそのクラスを貼り付けます。私は何も編集せずにそれを使用しました。
  2. 、修正メッセージボックスを使用して、プロジェクトにコード行を使用するには:

UserControlまたはForm内側)

MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors"); 
1

私はのためのクラスに基づいて、このクラスを作りました私が他の場所で見つけたWindows Forms。その後、メッセージボックス表示さ

MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)" 

ちょうどあなたのWPFのプロジェクトにクラスを追加し、「これ」は、このようなヘルパーメソッドのパラメータとして提供

MessageBox.Show("Hello there!"); 


/// <summary> 
/// This class makes it possible to center a MessageBox over the parent dialog. 
/// Usage example: 
///   MessageBoxHelper.PrepToCenterMessageBoxOnForm(this); 
///   MessageBox.Show("Hello there!); 
/// </summary> 
public static class MessageBoxHelper 
{ 
    public static void PrepToCenterMessageBoxOnForm(Window window) 
    { 
     MessageBoxCenterHelper helper = new MessageBoxCenterHelper(); 
     helper.Prep(window); 
    } 

    private class MessageBoxCenterHelper 
    { 
     private int messageHook; 
     private IntPtr parentFormHandle; 

     public void Prep(Window window) 
     { 
      NativeMethods.CenterMessageCallBackDelegate callBackDelegate = new NativeMethods.CenterMessageCallBackDelegate(CenterMessageCallBack); 
      GCHandle.Alloc(callBackDelegate); 
      parentFormHandle = new WindowInteropHelper(window).Handle; 
      messageHook = NativeMethods.SetWindowsHookEx(5, callBackDelegate, new IntPtr(NativeMethods.GetWindowLong(parentFormHandle, -6)), NativeMethods.GetCurrentThreadId()).ToInt32(); 
     } 

     private int CenterMessageCallBack(int message, int wParam, int lParam) 
     { 
      NativeMethods.RECT formRect; 
      NativeMethods.RECT messageBoxRect; 
      int xPos; 
      int yPos; 

      if (message == 5) 
      { 
       NativeMethods.GetWindowRect(parentFormHandle, out formRect); 
       NativeMethods.GetWindowRect(new IntPtr(wParam), out messageBoxRect); 

       xPos = (int)((formRect.Left + (formRect.Right - formRect.Left)/2) - ((messageBoxRect.Right - messageBoxRect.Left)/2)); 
       yPos = (int)((formRect.Top + (formRect.Bottom - formRect.Top)/2) - ((messageBoxRect.Bottom - messageBoxRect.Top)/2)); 

       NativeMethods.SetWindowPos(wParam, 0, xPos, yPos, 0, 0, 0x1 | 0x4 | 0x10); 
       NativeMethods.UnhookWindowsHookEx(messageHook); 
      } 

      return 0; 
     } 
    } 

    private static class NativeMethods 
    { 
     internal struct RECT 
     { 
      public int Left; 
      public int Top; 
      public int Right; 
      public int Bottom; 
     } 

     internal delegate int CenterMessageCallBackDelegate(int message, int wParam, int lParam); 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     internal static extern bool UnhookWindowsHookEx(int hhk); 

     [DllImport("user32.dll", SetLastError = true)] 
     internal static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

     [DllImport("kernel32.dll")] 
     internal static extern int GetCurrentThreadId(); 

     [DllImport("user32.dll", SetLastError = true)] 
     internal static extern IntPtr SetWindowsHookEx(int hook, CenterMessageCallBackDelegate callback, IntPtr hMod, int dwThreadId); 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     internal static extern bool SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags); 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 
    } 
} 
+0

あなたはこのコードをどこから盗んだのか忘れてしまった。帰属はここで重要です。 Google検索では、いくつかのソースが考えられます:http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp、http://code.google .com/p/lioneditor/source/browse/branches/imageEditorv2/FFTPatcher/PatcherLib/MyMessageBox.cs?spec = svn468&r = 468。 –

+0

良いアイデア。しかし、あなたの言葉を気にしてください:厳しい表現である「盗んだ」。私は明らかに「他の場所でも見つかりました」と言ったが、あなたは帰属について絶対に正しい。 –

+0

そして、元のコードはあなたが追加したリンクから来ていませんでした。それはJason Carrから来た:http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp。 WPFで動作するように変更しました。 Jasonに感謝します。 –

関連する問題