博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net下一个Winform方案可以让MessageBox.Show它显示在父窗口的中间
阅读量:7098 次
发布时间:2019-06-28

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

下面的文字,缺省值是在屏幕中间显示。

DialogResult dr = MessageBox.Show("是否要删除此数据?", "删除确认", MessageBoxButtons.OKCancel,MessageBoxIcon.Information,MessageBoxDefaultButton.Button2);if (dr == DialogResult.Cancel){    return;}

要让MessageBoxEx.Show显示在父窗口中间,须要又一次写个以下的类。调用WINAPI函数。

using System;using System.Windows.Forms;using System.Text;using System.Drawing;using System.Runtime.InteropServices;public class MessageBoxEx{    private static IWin32Window _owner;    private static HookProc _hookProc;    private static IntPtr _hHook;    public static DialogResult Show(string text)    {        Initialize();        return MessageBox.Show(text);    }    public static DialogResult Show(string text, string caption)    {        Initialize();        return MessageBox.Show(text, caption);    }    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons)    {        Initialize();        return MessageBox.Show(text, caption, buttons);    }    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)    {        Initialize();        return MessageBox.Show(text, caption, buttons, icon);    }    public static DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defButton)    {        Initialize();        return MessageBox.Show(text, caption, buttons, icon, defButton);    }    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);    }    public static DialogResult Show(IWin32Window owner, string text)    {        _owner = owner;        Initialize();        return MessageBox.Show(owner, text);    }    public static DialogResult Show(IWin32Window owner, string text, string caption)    {        _owner = owner;        Initialize();        return MessageBox.Show(owner, text, caption);    }    public static DialogResult Show(IWin32Window owner, string text, string caption, MessageBoxButtons buttons)    {        _owner = owner;        Initialize();        return MessageBox.Show(owner, text, caption, buttons);    }    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);    }    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);    }    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 MessageBoxEx()    {        _hookProc = new HookProc(MessageBoxHookProc);        _hHook = IntPtr.Zero;    }    private static void Initialize()    {        if (_hHook != IntPtr.Zero)        {            throw new NotSupportedException("multiple calls are not supported");        }        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);        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;}



版权声明:本文博主原创文章。博客,未经同意不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4876464.html,如需转载请自行联系原作者

你可能感兴趣的文章
SQLite 日期操作
查看>>
热词分享
查看>>
phpcms相关
查看>>
thinkphp空控制器的处理
查看>>
Unity优化----drawcall系列
查看>>
[转]Windows Server 2012体验之部署第一台域控制器
查看>>
ubuntu 安装 php curl
查看>>
软件包管理 之 关于Fedora Core 5.0 通过Yum在线升级说明
查看>>
Log4j使用指南
查看>>
Overview of package util.concurrent Release 1.3.4.
查看>>
C# 反射(Reflection)技术
查看>>
C# 字符串操作基本过程(Equals、Compare、EndsWith等处理方法)
查看>>
黑马程序员-关于C语言的指针一些小知识点
查看>>
实现类似街旁网的分享足迹功能
查看>>
Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
查看>>
版本升级demo(thread+service+Notification)
查看>>
zookeeper
查看>>
解决AD9中“......has no driver”的问题
查看>>
通过按键实现LED灯的亮灭(含两种情况)
查看>>
Hibernate入门_增删改查
查看>>