メッセージボックスを親フォームの中央に表示します。フォームを移動してメッセージボックスを表示すると、それは常にデスクトップの中央に表示されます。私はそれをフォームと共に表示したい。 私はいくつかのトリックとアドバイスをくれますか?MessageBox.Show()
答えて
これを行う最善の方法は、ウィンドウフックを使用してメッセージボックスを自分の中心に置くことです。この使用法を示す完全な記事があります。
あなたはここでそれを見つけることができます: http://www.codeproject.com/KB/dialog/CenterDialog.aspx
また、それが実際にどのように動作するかを調べるためにあまりにも深くにダイビングせずにアプリケーションでクラスを使用することができます。ここで
オーナーを設定しないで、メッセージボックスウィンドウの所有者を(.Show()
の最初のパラメータを使用して)ウィンドウに設定します。
参照のためにhereを参照してください。
をあなたは私を与えることができますいくつかの例? 私はこれを試しました: IWin32Window win = this; MessageBox.Show(win、 "TESTING"); 同じ結果ですが、メッセージボックスはデスクトップの真ん中にまだポップアップしています –
私はそれが 'this'が何であるかにかかっていると思います。私の経験はネイティブのWin32 'MessageBox()'関数に限られているのですが、これはちょっと違っていて、WinFormsを使用していることを理解する前に、だから私は私がリファレンスで見つけたものに合うように私の答えを修正しましたが、まだいくつかの詳細が欠落しているかもしれません。 :) –
MessageBoxにウィンドウハンドルを渡しても、メッセージボックスは親の中央に表示されません。親と最小化/最大化を有効にするだけで、メッセージボックスウィンドウの特定のタスクアイコンはありません。 – Yogesh
これまでは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))
は、ソリューションを使用することは非常に簡単であり、それは完璧に動作します:
ステップ:
- コピーしてプロジェクトにそのクラスを貼り付けます。私は何も編集せずにそれを使用しました。
- 、修正メッセージボックスを使用して、プロジェクトにコード行を使用するには:
(UserControl
またはForm
内側)
MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors");
私はのためのクラスに基づいて、このクラスを作りました私が他の場所で見つけた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);
}
}
あなたはこのコードをどこから盗んだのか忘れてしまった。帰属はここで重要です。 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。 –
良いアイデア。しかし、あなたの言葉を気にしてください:厳しい表現である「盗んだ」。私は明らかに「他の場所でも見つかりました」と言ったが、あなたは帰属について絶対に正しい。 –
そして、元のコードはあなたが追加したリンクから来ていませんでした。それはJason Carrから来た:http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp。 WPFで動作するように変更しました。 Jasonに感謝します。 –
- 1. MessageBox.Show()カスタムアイコン?
- 2. MessageBox.Show()の問題
- 3. ASP.NETのSelfMade MessageBox.Show()
- 4. MessageBox.Show on WPF
- 5. catchのMessageBox.Showの問題
- 6. MessageBox.ShowとDialogResultはMonoTouchで同等です
- 7. WinForms MessageBox.Showモーダルポップアップを防止する
- 8. MessageBox.Show埋め込みコードSSRSレポート
- 9. MessageBox.Showフレーバーがタスクバーに表示される
- 10. MessageBox.showでハイパーリンクを作成するには?
- 11. MonoCodeにMessageBox.Show()equivelantはありますか
- 12. )(messagebox.showをクリック私はWPFのコード次きにShowDialog()ウィンドウ
- 13. messagebox.showのインスタンスを1つだけ表示する#
- 14. C#アプリケーションでmessagebox.show()の使用を無効にする
- 15. Silverlight MessageBox.Show BackgroundWorkerでWCFサービス呼び出しをブロックします。
- 16. WPF MessageBox.Show非同期に呼び出します
- 17. MsgBoxとMessageBox.Showに違いはありますか?
- 18. MessageBox.show()関数がいつか動作しません
- 19. なぜMessageBox.ShowがUnhandledExceptionを引き起こすのですか?
- 20. 強制的にMessageBox.Showを表示するには
- 21. Cursors.WaitCursorは、Messagebox.Showが利用可能な場合にのみ動作します。
- 22. ASP.NET MVC5 Webアプリケーションの代わりにMessageBox.Showの代わりになるもの
- 23. MessageBox.Show()は、ALTを打つ場合を除き、winformsアプリをフリーズします
- 24. MessageBox.Showがサーバー側でタイムアウトの問題を引き起こしますか?
- 25. ローカルIISサーバーでASP.NETコードをホストするとMessageBox.Showが機能しません。
- 26. なぜMessageBox.Show( "asdfasdf {0}"、i);?を書くことができません。
- 27. MVVMでMessageBox.Show()の機能をどのようにして正常に実装しましたか?
- 28. 文字列に上付き文字を書き、MessageBox.Show()を使用して表示する方法は?
- 29. これはどういう意味ですか?MessageBox.Show((見つかったのは "Password": "Username")+ "incorrect")?
- 30. MouseHoverイベントは、その前にmessagebox.show()またはブレークポイントが発生した場合にのみ呼び出されるのはなぜですか?
記事は素晴らしいです。私のアプリにそれを適用する前にそれを理解する必要があります。 tnx。はるかに簡単な方法はありますか? heh .. –
最も簡単な方法は、自分で新しいMessageBoxフォームを作成することです。それはあなたの好みに合っていて、あなたが望むように見えます。また、好きな機能を追加することもできます。 – Yogesh