参考

(3条消息) .Net下Winform程序让MessageBox.Show显示在父窗体中间_aspnet2002web的博客-CSDN博客b

背景

最近winform项目不需要使用全屏显示了,还四分屏,半屏,各种骚操作要上线,被迫学习!!!

方案

重新定义一个类,集成MessageBox.Show方法到该类中,并加入一些处理代码,好将弹框展示到指定的控件中间

代码

using System;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;namespace BingLing.UserControls
{public class MessageBoxBingLing{private static IWin32Window _owner;private static readonly HookProc _hookProc;private static IntPtr _hHook;[Obsolete]public static DialogResult Show(string text){Initialize();return MessageBox.Show(text);}[Obsolete]public static DialogResult Show(string text, string caption){Initialize();return MessageBox.Show(text, caption);}[Obsolete]public static DialogResult Show(string text, string caption, MessageBoxButtons buttons){Initialize();return MessageBox.Show(text, caption, buttons);}[Obsolete]public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){Initialize();return MessageBox.Show(text, caption, buttons, icon);}[Obsolete]public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton){Initialize();return MessageBox.Show(text, caption, buttons, icon, defButton);}[Obsolete]public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton, MessageBoxOptions options){Initialize();return MessageBox.Show(text, caption, buttons, icon, defButton, options);}[Obsolete]public static DialogResult Show(IWin32Window owner, string text){_owner = owner;Initialize();return MessageBox.Show(owner, text);}[Obsolete]public static DialogResult Show(IWin32Window owner, string text, string caption){_owner = owner;Initialize();return MessageBox.Show(owner, text, caption);}[Obsolete]public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons){_owner = owner;Initialize();return MessageBox.Show(owner, text, caption, buttons);}[Obsolete]public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon){_owner = owner;Initialize();return MessageBox.Show(owner, text, caption, buttons, icon);}[Obsolete]public static 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);}[Obsolete]public static 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);}public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);public delegate void TimerProc(IntPtr hWnd, uint uMsg, UIntPtr nIDEvent, uint dwTime);public const int WH_CALLWNDPROCRET = 12;public enum 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")]private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);[DllImport("user32.dll")]private static extern int MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);[DllImport("User32.dll")]public static extern UIntPtr SetTimer(IntPtr hWnd, UIntPtr nIDEvent, uint uElapse, TimerProc lpTimerFunc);[DllImport("User32.dll")]public static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll")]public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);[DllImport("user32.dll")]public static extern int UnhookWindowsHookEx(IntPtr idHook);[DllImport("user32.dll")]public static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, IntPtr wParam, IntPtr lParam);[DllImport("user32.dll")]public static extern int GetWindowTextLength(IntPtr hWnd);[DllImport("user32.dll")]public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int maxLength);[DllImport("user32.dll")]public static extern int EndDialog(IntPtr hDlg, IntPtr nResult);[StructLayout(LayoutKind.Sequential)]public struct CWPRETSTRUCT{public IntPtr lResult;public IntPtr lParam;public IntPtr wParam;public uint message;public IntPtr hwnd;};static MessageBoxBingLing(){_hookProc = new HookProc(MessageBoxHookProc);_hHook = IntPtr.Zero;}[Obsolete]private static void Initialize(){if (_hHook != IntPtr.Zero){throw new NotSupportedException("this operation is not support!");}if (_owner != null){_hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, _hookProc, IntPtr.Zero, AppDomain.GetCurrentThreadId());}}private static 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);}private static void CenterWindow(IntPtr hChildWnd){Rectangle recChild = new Rectangle(0, 0, 0, 0);_ = GetWindowRect(hChildWnd, ref recChild);int width = recChild.Width - recChild.X;int height = recChild.Height - recChild.Y;Rectangle recParent = new Rectangle(0, 0, 0, 0);_ = GetWindowRect(_owner.Handle, ref recParent);Point ptCenter = new Point(0, 0){X = recParent.X + ((recParent.Width - recParent.X) / 2),Y = recParent.Y + ((recParent.Height - recParent.Y) / 2)};Point ptStart = new Point(0, 0){X = (ptCenter.X - (width / 2)),Y = (ptCenter.Y - (height / 2))};ptStart.X = (ptStart.X < 0) ? 0 : ptStart.X;ptStart.Y = (ptStart.Y < 0) ? 0 : ptStart.Y;_ = MoveWindow(hChildWnd, ptStart.X, ptStart.Y, width, height, false);}}
}

使用

BingLing.UserControls.MessageBoxBingLing.Show(控件对象,"Hello World");

在原MessageBox.Show函数的基础上,前面加上控件对象即可。

比如我想展示在本窗体[this]的中间

BingLing.UserControls.MessageBoxBingLing.Show(this,"Hello World");

想展示在图片控件中间[pictureBox_Handson]的中间

BingLing.UserControls.MessageBoxBingLing.Show(pictureBox_Handson,"Hello World");

其余一些重载函数的用法就不一一列举了

Winform MessageBox.Show时居中到主页面相关推荐

  1. WinForm程序启动时不显示主窗体的实现方法

    望程序启动时不显示主窗体,而只是在SystemTray显示一个图标:当用户点击该图标时,才第一次显示出主窗体来. 作者在文章中已经说得很清楚,将Form的Visible属性设置为false是不行的,因 ...

  2. Winform之学生信息管理系统主页面

    在上次的学生登录窗口的设计中,需要修改的地方为; 1登录窗口的最大化和最小化,这个一般的登录窗口不需要,因此我们也不做,单击学生信息管理系统的窗体设计找到属性MaximizeBox和属性(窗口的最大化 ...

  3. WinForm 之 程序启动不显示主窗体

    在 WinForm 程序启动时,不显示主窗体的实现方法主要有以下5种,第五种最简单,而且效果也不错,第四种方法也值得推荐. 实例代码如下: //隐藏窗体的方法1/5:不指定任何窗体为主窗体 //注意: ...

  4. 使用虚拟登录页面jsp,跳过登录页,直接访问主页面

    最近在修改项目的一个模块,项目本身是java + springMVC开发的,重新用.net来写一个模块块,因此需要从主页面跳转到.net页面,再从.net页面返回登录成功的主页面,现总结如下: 跳转到 ...

  5. VUE任何路径都能访问到主页面

    使用路由配置登陆页面,发现不会只停留在主页面,试了试其他的页面居然不报错,找了好久.....忘记添加mode:history Vue-router 中有hash模式和history模式,vue的路由默 ...

  6. vue + element 实现主页面,主页面查询,新增模态框功能

    效果图 一.[主页面]list.vue <template><!-- 外部用户 --><div class="externalUsers">&l ...

  7. 跨域传值即主页面与iframe之间互相传值

    需求一:主页面A 怎么向 iframe B 传递数据呢? 这种方式,是主页面需要给 iframe B 传递数据,然后 iframe B 获得到数据后进行特定的处理 实现方式 实现的技巧就是利用 loc ...

  8. react router 从登录页面跳转到主页面

    在搭建React框架时,选择了create-react-app脚手架工具搭建. 在使用到router的时候,想法是这样的,在APP.js中配置一个简单的路由,路由包含两个,一个登录页,一个主页面. 默 ...

  9. javaWeb项目用过滤器filter实现登陆成功后才能访问主页面,否则直接输入主页面的地址自动跳转到登陆界面

    想用Filter实现一个登陆验证的功能,实现登陆成功后才能访问主页面,否则直接输入主页面的地址会自动跳转到登陆界面 原理很简单,每次登陆成功后,创建一个session域对象,将登陆成功的用户名保存在s ...

最新文章

  1. oracle schema与mysql_Oracle数据库之Oracle 11g R2 用户与模式(schema)
  2. linux终端定时器实验报告,定时器实验报告.doc
  3. Soft robotics:造仿生昆虫机器人柔性骨骼新技术,只需2小时,成本不到7块!
  4. 用React的方式思考
  5. 在django restful framework中设置django model的property
  6. 文巾解题1738. 找出第 K 大的异或坐标值
  7. matlab转向梯形优化设计,转向梯形优化设计matlab程序.doc
  8. 磁盘 I/O性能指标
  9. Mybatis源码之(TypeAliasRegistry)TypeAlias别名实现机制
  10. 导入开源的文件云存储平台-Seafile
  11. 模型可视化工具netron
  12. thinkphp创建对象及数据操作
  13. 返回表单字符串php,PHP字符串如何截取表单内的内容?
  14. tps协议和onvif协议_摄像头ONVIF协议,到底啥是ONVIF,又是啥意思?
  15. JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
  16. java怎么打hello,java hello word怎么打
  17. ABB控制器800模块AC800F/PM802F
  18. STM32+QRCode二维码生成
  19. (Java)输入一个字母,若是小写字母,则变为大写输出,否则,原样输出
  20. 交叉碳市场和 Web3 以实现再生变革

热门文章

  1. HR将如何做背景调查?
  2. 尤大在 Vue的生态进展中提到的 <style> 动态变量注入是啥?
  3. Unicode编码的秘密
  4. 对著名快递公司的一次艰难的oracle注入
  5. python更换窗口颜色设置_python – 默认窗口颜色Tkinter和十六进制颜色代码
  6. 导航定位向高精定位的演进与实践
  7. iOS - OC NSDate
  8. 关于Excel拼接sql语句,批量导入数据
  9. 基于JAVA家居体验平台的设计与实现计算机毕业设计源码+系统+lw文档+部署
  10. Statement详细用法