2009-10-27 9 views
7

Vorrei mostrare la mia Messagebox al centro del suo modulo padre. se sposto il modulo e mostro la messagebox, viene sempre visualizzato al centro del desktop. voglio che appaia insieme al modulo. Puoi darmi qualche consiglio e consiglio?MessageBox.Show()

risposta

3

Il modo migliore per farlo è utilizzare Window Hooks e centrare la finestra di messaggio. C'è un articolo perfetto che mostra questo utilizzo.

Lo si può trovare qui: http://www.codeproject.com/KB/dialog/CenterDialog.aspx

È inoltre possibile utilizzare la classe nell'applicazione senza immergersi troppo in profondità per scoprire come funziona realmente.

+0

L'articolo è fantastico. Devo solo capirlo prima di applicarlo alla mia app. tnx. c'è un modo molto più semplice? heh .. –

+1

Il modo più semplice sarebbe creare un nuovo modulo MessageBox da solo. Questo sarà secondo il tuo gusto e sembrerà come vuoi che sia. Inoltre, puoi aggiungere qualsiasi funzionalità che ti piace. – Yogesh

2

Impostare il proprietario della finestra della finestra di messaggio nella finestra (utilizzando il primo parametro di .Show()), invece di non impostare un proprietario.

Vedere here per un riferimento.

+1

Mi può dare qualche esempio? ho provato questo: IWin32Window win = this; MessageBox.Show (win, "TESTING"); Anche se, lo stesso risultato. Messagebox appare ancora nel mezzo del desktop –

+0

Suppongo che dipenda da cosa sia questo. Ho paura che la mia esperienza sia limitata alla funzione nativa di 'MessageBox()' di Win32, che è un po 'diversa, e ho ottenuto a metà risposta prima di rendermi conto che stavi usando WinForms. Così ho modificato la mia risposta per adattarla a ciò che ho trovato nel riferimento, ma potrei avere ancora qualche dettaglio mancante. :) –

+1

Il passaggio di un handle di finestra a MessageBox non visualizza la finestra di messaggio nel centro del padre. È solo per consentire minimizzare/massimizzare con il genitore e non esiste un'icona di attività specifica per la finestra della finestra di messaggio. – Yogesh

1

L'ho già fatto in C#. Ecco cosa ricordo

definire una classe:

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

    public IntPtr Handle 
    { 
     get; 
     set; 
    } 
} 

definire una classe base di MessageBox. Creare una classe basata su MessageBox e creare un nuovo metodo Show:

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

} 

Nel codice di chiamata (qui si presume essere una WinForm e MsgBox si basa sulla nuova classe finestra di messaggio) chiamare il nuovo metodo Show e passare un'istanza IWindowWrapper su Mostra ad es

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

Quando dici "basato", intendi ereditare? Sono un po 'nuovo in C#. :) –

+0

Sì, ad es. public class MyMessageBox: MessageBox ... ecc. – ChrisBD

+0

Non è necessario utilizzare C# per farlo, ma è quello che ho usato. È la lingua in cui stai programmando? – ChrisBD

0

Ecco una soluzione facile da usare, e funziona perfettamente:

Passi:

  1. copiare e incollare questa classe nel progetto. L'ho usato senza alcun editing.
  2. Per utilizzare il MessageBox modificato, utilizzare questa riga di codice nel progetto:

(all'interno di un UserControl o un Form)

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

ho fatto questa classe sulla base di una classe per Windows Forms che ho trovato da nessun'altra parte.

Basta aggiungere la classe al progetto WPF e fornire "questo" come parametro per il metodo di supporto in questo modo:

MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)" 

poi mostrare la finestra di messaggio:

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

Hai dimenticato di dire * dove * hai rubato questo codice da. L'attribuzione è importante qui. Una ricerca su Google mostra un paio di possibili fonti: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp, http://code.google .com/p/lioneditor/source/sfoglia/rami/imageEditorv2/FFTPatcher/PatcherLib/MyMessageBox.cs? spec = svn468 & r = 468. –

+0

Buona idea. Ma per favore ricorda le tue parole: "rubato" che è un'espressione dura. Ho detto esplicitamente "trovato altrove", ma hai assolutamente ragione sull'attribuzione. –

+0

E no, il codice originale non è venuto dal link che hai aggiunto. Veniva da Jason Carr: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp. L'ho appena modificato per funzionare in WPF. Grazie Jason. –

Problemi correlati