2009-10-27 32 views
7

Me gustaría mostrar mi Messagebox en el centro de su forma principal. si muevo el formulario y muestro el cuadro de mensaje, siempre aparece en el centro del escritorio. Quiero que aparezca junto con el formulario. ¿Me puede dar algunos trucos y consejos?MessageBox.Show()

Respuesta

3

La mejor manera de hacerlo es utilizar Window Hooks y centrar el cuadro de mensaje usted mismo. Hay un artículo perfecto que muestra este uso.

Se puede encontrar aquí: http://www.codeproject.com/KB/dialog/CenterDialog.aspx

También puede utilizar la clase en su aplicación sin bucear demasiado profundo para averiguar cómo funciona realmente.

+0

El artículo es genial. Solo necesito entenderlo antes de aplicarlo a mi aplicación. tnx. ¿Hay una manera mucho más fácil? heh .. –

+1

La manera más fácil sería crear un nuevo MessageBox usted mismo. Eso será de acuerdo a su gusto y se verá de la manera que usted desea. Además, puede agregar cualquier funcionalidad que desee. – Yogesh

2

Establezca el propietario de la ventana del cuadro de mensaje en su ventana (utilizando el primer parámetro de .Show()), en lugar de no configurar un propietario.

Ver here para referencia.

+1

¿Me puede dar algún ejemplo? He intentado esto: IWin32Window win = this; MessageBox.Show (win, "TESTING"); Aunque, el mismo resultado. Messagebox sigue apareciendo en el medio del escritorio –

+0

Supongo que depende de qué es 'this'. Me temo que mi experiencia se limita a la función Win32 'MessageBox()' nativa, que es un poco diferente, y llegué a la mitad de la respuesta antes de darme cuenta de que estaba usando WinForms. Así que modifiqué mi respuesta para adaptarme a lo que encontré en la referencia, pero aún me faltan algunos detalles. :) –

+1

Pasar un identificador de ventana a MessageBox no muestra el cuadro de mensaje en el centro del elemento primario. Es solo para permitir minimizar/maximizar con el elemento primario y no hay un icono de tarea específico para la ventana del cuadro de mensaje. – Yogesh

1

He hecho esto antes en C#. Esto es lo que recuerdo.

definir una clase:

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

    public IntPtr Handle 
    { 
     get; 
     set; 
    } 
} 

definir una clase de mensaje basado en. Crear una clase basada en cuadro de mensaje y crear un nuevo método Show:

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

} 

En su código de llamada (en este caso se supone que es un WinForm y MSGBOX se basa en la nueva clase de cuadro de mensaje) llamar al nuevo método Show y pasar una instancia de IWindowWrapper en Show, por ejemplo

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

Cuando dice "basado", ¿quiere decir heredar? Soy un poco nuevo en C#. :) –

+0

Sí, p. clase pública MyMessageBox: MessageBox ... etc. – ChrisBD

+0

No tiene que usar C# para hacer esto, pero eso es lo que he usado. ¿Es ese el idioma en el que estás programando? – ChrisBD

0

Aquí es muy fácil de usar solución, y funciona perfectamente:

Pasos:

  1. copiar y pegar esa clase en su proyecto. Lo usé sin ninguna edición.
  2. Para utilizar el cuadro de mensaje modificado, utilice esta línea de código en su proyecto:

(dentro de un UserControl o una Form)

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

Hice esta clase basada en una clase para Windows Forms que encontré en otra parte.

Sólo tiene que añadir la clase a su proyecto de WPF y proporcionar "esto" como un parámetro para el método de ayuda como esto:

MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)" 

A continuación, mostrar el cuadro de mensaje:

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

Olvidó decir * de dónde * robó este código. La atribución es importante aquí. Una búsqueda en Google muestra algunas fuentes posibles: 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

Buena idea. Pero por favor, tenga en cuenta sus palabras: "robó" que es una expresión dura. Dije explícitamente "encontré otro lugar", pero tienes toda la razón sobre la atribución. –

+0

Y no, el código original no proviene del enlace que ha agregado. Vino de Jason Carr: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp. Acabo de modificarlo para que funcione en WPF. Gracias Jason. –

Cuestiones relacionadas