• C# messagebox 居中父窗体


    在右边项目上点击右键->Add->class,添加MessageBoxEx类:

      1 using System;
      2 using System.Windows.Forms;
      3 using System.Text;
      4 using System.Drawing;
      5 using System.Runtime.InteropServices;   
      6 
      7 public class MessageBoxEx
      8 {
      9     private static IWin32Window _owner;
     10     private static HookProc _hookProc;
     11     private static IntPtr _hHook;
     12 
     13     public static DialogResult Show(string text)
     14     {
     15         Initialize();
     16         return MessageBox.Show(text);
     17     }
     18 
     19     public static DialogResult Show(string text, string caption)
     20     {
     21         Initialize();
     22         return MessageBox.Show(text, caption);
     23     }
     24 
     25     public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)
     26     {
     27         Initialize();
     28         return MessageBox.Show(text, caption, buttons);
     29     }
     30 
     31     public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
     32     {
     33         Initialize();
     34         return MessageBox.Show(text, caption, buttons, icon);
     35     }
     36 
     37     public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
     38     {
     39         Initialize();
     40         return MessageBox.Show(text, caption, buttons, icon, defButton);
     41     }
     42 
     43     public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
     44     {
     45         Initialize();
     46         return MessageBox.Show(text, caption, buttons, icon, defButton, options);
     47     }
     48 
     49     public static DialogResult Show(IWin32Window owner, string text)
     50     {
     51         _owner = owner;
     52         Initialize();
     53         return MessageBox.Show(owner, text);
     54     }
     55 
     56     public static DialogResult Show(IWin32Window owner, string text, string caption)
     57     {
     58         _owner = owner;
     59         Initialize();
     60         return MessageBox.Show(owner, text, caption);
     61     }
     62 
     63     public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)
     64     {
     65         _owner = owner;
     66         Initialize();
     67         return MessageBox.Show(owner, text, caption, buttons);
     68     }
     69 
     70     public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
     71     {
     72         _owner = owner;
     73         Initialize();
     74         return MessageBox.Show(owner, text, caption, buttons, icon);
     75     }
     76 
     77     public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)
     78     {
     79         _owner = owner;
     80         Initialize();
     81         return MessageBox.Show(owner, text, caption, buttons, icon, defButton);
     82     }
     83 
     84     public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options)
     85     {
     86         _owner = owner;
     87         Initialize();
     88         return MessageBox.Show(owner, text, caption, buttons, icon,
     89                                defButton, options);
     90     }
     91 
     92     public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
     93 
     94     public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);
     95 
     96     public const int WH_CALLWNDPROCRET = 12;
     97 
     98     public enum CbtHookAction : int
     99     {
    100         HCBT_MOVESIZE = 0,
    101         HCBT_MINMAX = 1,
    102         HCBT_QS = 2,
    103         HCBT_CREATEWND = 3,
    104         HCBT_DESTROYWND = 4,
    105         HCBT_ACTIVATE = 5,
    106         HCBT_CLICKSKIPPED = 6,
    107         HCBT_KEYSKIPPED = 7,
    108         HCBT_SYSCOMMAND = 8,
    109         HCBT_SETFOCUS = 9
    110     }
    111 
    112     [DllImport("user32.dll")]
    113     private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);
    114 
    115     [DllImport("user32.dll")]
    116     private static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
    117 
    118     [DllImport("User32.dll")]
    119     public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);
    120 
    121     [DllImport("User32.dll")]
    122     public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
    123 
    124     [DllImport("user32.dll")]
    125     public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
    126 
    127     [DllImport("user32.dll")]
    128     public static extern int UnhookWindowsHookEx(IntPtr idHook);
    129 
    130     [DllImport("user32.dll")]
    131     public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);
    132 
    133     [DllImport("user32.dll")]
    134     public static extern int GetWindowTextLength(IntPtr hWnd);
    135 
    136     [DllImport("user32.dll")]
    137     public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);
    138 
    139     [DllImport("user32.dll")]
    140     public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);
    141 
    142     [StructLayout(LayoutKind.Sequential)]
    143     public struct CWPRETSTRUCT
    144     {
    145         public IntPtr lResult;
    146         public IntPtr lParam;
    147         public IntPtr wParam;
    148         public uint message;
    149         public IntPtr hwnd;
    150     } ;
    151 
    152     static MessageBoxEx()
    153     {
    154         _hookProc = new HookProc(MessageBoxHookProc);
    155         _hHook = IntPtr.Zero;
    156     }
    157 
    158     private static void Initialize()
    159     {
    160         if (_hHook != IntPtr.Zero)
    161         {
    162             throw new NotSupportedException("multiple calls are not supported");
    163         }
    164 
    165         if (_owner != null)
    166         {
    167             _hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());
    168         }
    169     }
    170 
    171     private static IntPtr MessageBoxHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    172     {
    173         if (nCode < 0)
    174         {
    175             return CallNextHookEx(_hHook, nCode, wParam, lParam);
    176         }
    177 
    178         CWPRETSTRUCT msg = (CWPRETSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPRETSTRUCT));
    179         IntPtr hook = _hHook;
    180 
    181         if (msg.message == (int)CbtHookAction.HCBT_ACTIVATE)
    182         {
    183             try
    184             {
    185                 CenterWindow(msg.hwnd);
    186             }
    187             finally
    188             {
    189                 UnhookWindowsHookEx(_hHook);
    190                 _hHook = IntPtr.Zero;
    191             }
    192         }
    193 
    194         return CallNextHookEx(hook, nCode, wParam, lParam);
    195     }
    196 
    197     private static void CenterWindow(IntPtr hChildWnd)
    198     {
    199         Rectangle recChild = new Rectangle(0, 0, 0, 0);
    200         bool success = GetWindowRect(hChildWnd, ref recChild);
    201 
    202         int width = recChild.Width - recChild.X;
    203         int height = recChild.Height - recChild.Y;
    204 
    205         Rectangle recParent = new Rectangle(0, 0, 0, 0);
    206         success = GetWindowRect(_owner.Handle, ref recParent);
    207 
    208         Point ptCenter = new Point(0, 0);
    209         ptCenter.X = recParent.X + ((recParent.Width - recParent.X) / 2);
    210         ptCenter.Y = recParent.Y + ((recParent.Height - recParent.Y) / 2);
    211 
    212 
    213         Point ptStart = new Point(0, 0);
    214         ptStart.X = (ptCenter.X - (width / 2));
    215         ptStart.Y = (ptCenter.Y - (height / 2));
    216 
    217         ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;
    218         ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;
    219 
    220         int result = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width,
    221                                 height, false);
    222     }
    223 
    224 }

    调用办法

    MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors");
  • 相关阅读:
    Linux systemctl命令笔记
    网站建设部署与发布--笔记4-部署mysql
    网站建设部署与发布--笔记3-部署Nginx
    c++模板文件,方便调试与运行时间的观察
    最大公约数-辗转相除及其证明
    汉诺塔-递归
    全排列算法-递归
    蓝桥-愤怒的小鸟
    PAT Basic 1032
    浮点数精度的修正 相等,大于小于
  • 原文地址:https://www.cnblogs.com/njflash/p/10769677.html
Copyright © 2020-2023  润新知