2009-10-27 14 views
7

मैं अपने संदेश बॉक्स को अपने मूल रूप के केंद्र में दिखाना चाहता हूं। अगर मैं फॉर्म को ले जाता हूं और संदेशबॉक्स दिखाता हूं, तो यह हमेशा डेस्कटॉप के केंद्र में दिखाता है। मैं इसे फॉर्म के साथ दिखाना चाहता हूं। क्या आप मुझे कुछ चाल और सलाह दे सकते हैं?संदेशबॉक्स। शो()

उत्तर

3

ऐसा करने का सबसे अच्छा तरीका विंडो हुक का उपयोग करना और संदेश बॉक्स को स्वयं केंद्रित करना है। एक आदर्श लेख है जो इस उपयोग को दिखाता है।

आप इसे यहाँ पा सकते हैं: http://www.codeproject.com/KB/dialog/CenterDialog.aspx

तुम भी वर्ग अपने आवेदन में गोताखोरी के बिना बहुत गहरा में उपयोग कर सकते हैं पता लगाने के लिए यह वास्तव में कैसे काम करता है।

+0

आलेख महान है। इसे अपने ऐप पर लागू करने से पहले इसे समझने की जरूरत है। tnx। क्या कोई आसान तरीका है? हे .. –

+1

सबसे आसान तरीका एक नया संदेश बॉक्स स्वयं बना देगा। यह आपके स्वाद के अनुसार होगा और जिस तरह से आप चाहते हैं उतना दिखेंगे। साथ ही, आप अपनी पसंद की कोई भी कार्यक्षमता जोड़ सकते हैं। – Yogesh

2

किसी मालिक को सेट करने की बजाय, संदेश विंडो विंडो के मालिक को अपनी विंडो पर सेट करें (.Show() के पहले पैरामीटर का उपयोग करके)।

संदर्भ के लिए here देखें।

+1

तुम मुझे दे सकते हैं कुछ उदाहरण? मैंने यह कोशिश की है: IWin32Window win = this; संदेशबॉक्स। दिखाएं (जीतें, "परीक्षण"); हालांकि, वही परिणाम। संदेशबॉक्स अभी भी डेस्कटॉप के बीच में पॉप-अप –

+0

मुझे लगता है कि यह 'यह' पर निर्भर करता है। मुझे डर है कि मेरा अनुभव देशी Win32 'MessageBox() 'फ़ंक्शन तक सीमित है, जो थोड़ा अलग है, और मुझे एहसास हुआ कि आप WinForms का उपयोग कर रहे थे इससे पहले मुझे जवाब देने के माध्यम से आधे रास्ते मिल गए। इसलिए मैंने संदर्भ में जो पाया, उसे फिट करने के लिए मैंने अपना जवाब संशोधित किया, लेकिन मुझे अभी भी कुछ विवरण गुम हो सकते हैं। :) –

+1

संदेश बॉक्स में विंडो हैंडल पास करना माता-पिता के केंद्र में संदेश बॉक्स प्रदर्शित नहीं करता है। यह केवल माता-पिता के साथ न्यूनतम/अधिकतम करने में सक्षम है और संदेश बॉक्स विंडो के लिए कोई विशिष्ट कार्य आइकन नहीं है। – Yogesh

1

मैंने इसे सी # में पहले किया है। मुझे याद है कि मुझे क्या याद है।

एक वर्ग को परिभाषित करें:

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

    public IntPtr Handle 
    { 
     get; 
     set; 
    } 
} 

एक वर्ग MessageBox के आधार पर परिभाषित करें। एक वर्ग MessageBox के आधार पर बना सकते हैं और एक नए शो विधि बनाने के लिए: अपने बुला कोड में

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

} 

(यहाँ यह एक WinForm माना जाता है और MsgBox नया संदेश बॉक्स वर्ग पर आधारित है) नए शो विधि कॉल और शो I पर एक IWindowWrapper उदाहरण पास करें

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

जब आप "आधारित" कहते हैं, तो क्या आपका उत्तराधिकारी है? मैं सी # में नया नया हूँ। :) –

+0

हां उदा। पब्लिक क्लास माईमेसेजबॉक्स: संदेशबॉक्स ... आदि – ChrisBD

+0

आपको ऐसा करने के लिए सी # का उपयोग करने की ज़रूरत नहीं है, लेकिन यही वह है जो मैंने उपयोग किया था। क्या वह भाषा है जिसमें आप प्रोग्रामिंग कर रहे हैं? – ChrisBD

0

यहाँ एक बहुत ही आसान समाधान का उपयोग करने के लिए है, और यह पूरी तरह से काम करता है:

कदम:

  1. कॉपी करके अपनी परियोजना में उस वर्ग पेस्ट करें। मैंने इसे बिना किसी संपादन के इस्तेमाल किया।
  2. संशोधित MessageBox का उपयोग करने के लिए, अपने प्रोजेक्ट के कोड की इस पंक्ति का उपयोग करें:

(एक UserControl अंदर या एक Form)

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

मैं के लिए एक वर्ग के आधार पर इस वर्ग बनाया विंडोज फॉर्म जो मैंने कहीं और पाया।

बस अपने WPF परियोजना के लिए वर्ग जोड़ सकते हैं और उपलब्ध कराने के "इस" इस तरह सहायक विधि को पैरामीटर के रूप: संदेश बॉक्स

MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)" 

फिर दिखाने:

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/पी/lioneditor/स्रोत/ब्राउज़/शाखाओं/imageEditorv2/FFTPatcher/PatcherLib/MyMessageBox.cs? कल्पना = svn468 और आर = 468। –

+0

अच्छा विचार। लेकिन कृपया अपने शब्दों को ध्यान दें: "चुरा लिया" यह एक कठोर अभिव्यक्ति है। मैंने स्पष्ट रूप से कहा "कहीं और पाया", लेकिन आप एट्रिब्यूशन के बारे में बिल्कुल सही हैं। –

+0

और नहीं, मूल कोड आपके द्वारा जोड़े गए लिंक से नहीं आया था। यह जेसन कैर से आया: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp। मैंने इसे WPF में काम करने के लिए संशोधित किया। धन्यवाद जेसन। –

संबंधित मुद्दे