博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# messagebox 居中父窗体
阅读量:7070 次
发布时间:2019-06-28

本文共 8007 字,大约阅读时间需要 26 分钟。

在右边项目上点击右键->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 = 9110     }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 CWPRETSTRUCT144     {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             try184             {185                 CenterWindow(msg.hwnd);186             }187             finally188             {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");

 

转载于:https://www.cnblogs.com/njflash/p/10769677.html

你可能感兴趣的文章
func 安装之艰辛历程
查看>>
Ubuntu Server 10.10 操作手记
查看>>
Java静态代码分析工具Infer
查看>>
AIX系统学习之-CRS安装后校验
查看>>
从Code Review 谈如何做技术(zz)酷 壳
查看>>
堆和栈的区别(转过无数次的文章)
查看>>
检测您的CPU是否支持RemoteFX(SLAT二级地址转换)
查看>>
Internet Connectivity Evaluation Tool
查看>>
微小宝中实际支出是如何计算的?
查看>>
[SoftGrid 系列] Microsoft SoftGrid Server 安装篇
查看>>
【驱动】linux设备驱动·扫盲
查看>>
SSRS 2012 Report Items -- 表格类对象
查看>>
System Error. Code:1722. RPC服务器不可用解决办法
查看>>
gitlab gerrit jenkins CI/CD环境集成
查看>>
Struts1.x 跨站脚本(XSS)漏洞的解决
查看>>
只有rman的备份文件恢复过程
查看>>
linux--armv4l的安装
查看>>
Stucts应用引起的OutOfMemoryError
查看>>
自己制作 XP With SP3 系统光盘 包括驱动SATA集成AHCI驱动
查看>>
Struts2利用拦截器实现权限控制
查看>>