C#技巧【Winform程式讓MessageBox.Show顯示在父窗體中間】
阿新 • • 發佈:2019-01-05
Winform程式讓MessageBox.Show顯示在父窗體中間
下面的寫法,預設是顯示在螢幕的中間。
- DialogResult dr = MessageBox.Show("是否要刪除此資料?", "刪除確認", MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button2);
- if (dr == DialogResult.Cancel)
- {
- return;
- }
要讓MessageBoxEx.Show顯示在父窗體中間,需要重新寫個下面的類,呼叫WINAPI函式。
- using
- using System.Windows.Forms;
- using System.Text;
- using System.Drawing;
- using System.Runtime.InteropServices;
- publicclass MessageBoxEx
- {
- privatestatic IWin32Window _owner;
- privatestatic HookProc _hookProc;
- privatestatic IntPtr _hHook;
- publicstatic DialogResult Show(string
- {
- Initialize();
- return MessageBox.Show(text);
- }
- publicstatic DialogResult Show(string text, string caption)
- {
- Initialize();
- return MessageBox.Show(text, caption);
- }
- publicstatic DialogResult Show(string text, string caption, MessageBoxButtons buttons)
- {
- Initialize();
- return MessageBox.Show(text, caption, buttons);
- }
- publicstatic DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
- {
- Initialize();
- return MessageBox.Show(text, caption, buttons, icon);
- }
- publicstatic DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
- {
- Initialize();
- return MessageBox.Show(text, caption, buttons, icon, defButton);
- }
- publicstatic DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
- {
- Initialize();
- return MessageBox.Show(text, caption, buttons, icon, defButton, options);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text, string caption)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text, caption);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text, caption, buttons);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text, caption, buttons, icon);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
- }
- publicstatic DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
- {
- _owner = owner;
- Initialize();
- return MessageBox.Show(owner, text, caption, buttons, icon,
- defButton, options);
- }
- publicdelegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
- publicdelegatevoid TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);
- publicconstint WH_CALLWNDPROCRET = 12;
- publicenum CbtHookAction : int
- {
- HCBT_MOVESIZE = 0,
- HCBT_MINMAX = 1,
- HCBT_QS = 2,
- HCBT_CREATEWND = 3,
- HCBT_DESTROYWND = 4,
- HCBT_ACTIVATE = 5,
- HCBT_CLICKSKIPPED = 6,
- HCBT_KEYSKIPPED = 7,
- HCBT_SYSCOMMAND = 8,
- HCBT_SETFOCUS = 9
- }
- [DllImport("user32.dll")]
- privatestaticexternbool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
- [DllImport("user32.dll")]
- privatestaticexternint MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
- [DllImport("User32.dll")]
- publicstaticextern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);
- [DllImport("User32.dll")]
- publicstaticextern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
- [DllImport("user32.dll")]
- publicstaticextern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
- [DllImport("user32.dll")]
- publicstaticexternint UnhookWindowsHookEx(IntPtr idHook);
- [DllImport("user32.dll")]
- publicstaticextern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
- [DllImport("user32.dll")]
- publicstaticexternint GetWindowTextLength(IntPtr hWnd);
- [DllImport("user32.dll")]
- publicstaticexternint GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
- [DllImport("user32.dll")]
- publicstaticexternint EndDialog(IntPtr hDlg, IntPtr nResult);
- [StructLayout(LayoutKind.Sequential)]
- publicstruct CWPRETSTRUCT
- {
- public IntPtr lResult;
- public IntPtr lParam;
- public IntPtr wParam;
- publicuint message;
- public IntPtr hwnd;
- } ;
- static MessageBoxEx()
- {
- _hookProc = new HookProc(MessageBoxHookProc);
- _hHook = IntPtr.Zero;
- }
- privatestaticvoid Initialize()
- {
- if (_hHook != IntPtr.Zero)
- {
- thrownew NotSupportedException("multiple calls are not supported");
- }
- if (_owner != null)
- {
- _hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
- }
- }
- privatestatic IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
- {
- if (nCode < 0)
- {
- return CallNextHookEx(_hHook, nCode, wParam, lParam);
- }
- CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
- IntPtr hook = _hHook;
- if (msg.message == (int)CbtHookAction.HCBT_ACTIVATE)
- {
- try
- {
- CenterWindow(msg.hwnd);
- }
- finally
- {
- UnhookWindowsHookEx(_hHook);
- _hHook = IntPtr.Zero;
- }
- }
- return CallNextHookEx(hook, nCode, wParam, lParam);
- }
- privatestaticvoid CenterWindow(IntPtr hChildWnd)
- {
- Rectangle recChild = new Rectangle(0, 0, 0, 0);
- bool success = GetWindowRect(hChildWnd, ref recChild);
- int width = recChild.Width - recChild.X;
- int height = recChild.Height - recChild.Y;
- Rectangle recParent = new Rectangle(0, 0, 0, 0);
- success = GetWindowRect(_owner.Handle, ref recParent);
- Point ptCenter = new Point(0, 0);
- ptCenter.X = recParent.X + ((recParent.Width - recParent.X) / 2);
- ptCenter.Y = recParent.Y + ((recParent.Height - recParent.Y) / 2);
- Point ptStart = new Point(0, 0);
- ptStart.X = (ptCenter.X - (width / 2));
- ptStart.Y = (ptCenter.Y - (height / 2));
- ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;
- ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;
- int result = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width, height, false);
- }
- }
- DialogResult dr = MessageBoxEx.Show(this,"是否要刪除此資料?", "刪除確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2);
- if (dr == DialogResult.Cancel)
- {
- return;
- }