c#: 模态窗口最小化主窗口
起源:
产品中,通常有些耗时操作比如视频转换、DVD刻录等,在模态窗口中执行。此时最小化它,主窗体不能跟着最小化,影响操作体验。
如何让主窗体最小化,并且可以还原呢?搜索一番,未找到满意结果,自己动手吧!
1、改造Program.cs文件
其目的即以MainForm静态属性记录程序主窗体以为它用。
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm = new MainForm();
Application.Run(MainForm);
} public static MainForm MainForm
{
get;
set;
}
}
2、改写Modal窗体SizeChanged事件
在OnSizeChanged事件中处理FormWindowState.Minimized信号,最小化主窗体
public partial class TestForm : Form
{
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("User32.dll")]
public static extern int SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
//ShowWindow参数
private const int SW_SHOWMINIMIZED = ;
private const int SWP_SHOWWINDOW = 0x40; public TestForm()
{
InitializeComponent();
this.ShowInTaskbar = false;
} protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e); if (this.WindowState == FormWindowState.Minimized)
{
ShowWindow(Program.MainForm.Handle, SW_SHOWMINIMIZED);
this.Visible = true;
//移到屏幕外面,模拟最小化效果
SetWindowPos(this.Handle, IntPtr.Zero, Program.MainForm.Left, Program.MainForm.Top, , , SWP_SHOWWINDOW);
//Trace.WriteLine(string.Format("x: {0}, y: {1}", Program.MainForm.Left, Program.MainForm.Top));
}
}
}
或直接用Owner做控制。如果其Owner为主窗体,这样就不需第1步设置MainForm属性记录:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e); if (this.WindowState == FormWindowState.Minimized)
{
var owner = this.Owner;
if (owner != null)
{
ShowWindow(owner.Handle, SW_SHOWMINIMIZED);
this.Visible = true;
//移到屏幕外面,模拟最小化效果
SetWindowPos(this.Handle, IntPtr.Zero, owner.Left, owner.Top, , , SWP_SHOWWINDOW);
//Trace.WriteLine(string.Format("x: {0}, y: {1}", Program.MainForm.Left, Program.MainForm.Top));
}
}
}
3、主窗体调用
using (var form = new TestForm())
{
form.ShowDialog(this);
}
显示效果如图:

c#: 模态窗口最小化主窗口的更多相关文章
- C#winform如何最小化主窗口
1.如果不想让程序在任务栏中显示,请把窗体的属性ShowInTaskbar设置为false;2.如果想让程序启动时就最小化,请设置窗体的属性WindowState设置为Minimized.(Minim ...
- WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)
无论是在工作和学习中使用WPF时,我们通常都会接触到CustomControl,今天我们就CustomWindow之后的一些边角技术进行探讨和剖析. 窗口(对话框)模态闪动(Blink) 自定义窗口的 ...
- MFC修改初始窗口大小和窗口名字禁止窗口最大,最小化
2,在里面就可以修改初始窗口大小和窗口名字 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){if( !CFrameWnd::PreCrea ...
- C# WinForm窗口最小化到系统托盘
* C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...
- QT:窗口最小化时显示一个小浮标
有些窗口在自身最小化时要在桌面上显示一个小浮标,让用户利用这个小浮标进行各种操作(例如迅雷的悬浮窗一样),我试着用QT实现一下这个功能. PS:本来以为这个功能很简单,却搞了我两个晚上,泪奔... 思 ...
- Mac OS X窗口最小化方法的几个快捷键
大家都知道在 OS X 系统中,点击窗口左上角中间的小黄按钮就可以最小化当前窗口.而事实上,还有一些比点击这个按钮更快的窗口最小化方法.这里一起分享给大家! 使用快捷键 Command+M,可以实现快 ...
- 转 原生js canvas实现苹果电脑mac OS窗口最小化效果
http://www.17sucai.com/pins/demo-show?id=2459 http://www.17sucai.com/pins/demo-show?id=2458 很多资料 ,前 ...
- ShowWindow 隐藏、显示、最大化、最小化窗口
#include <Windows.h> #include <tchar.h> int WINAPI _tWinMain(HINSTANCE hInstance, HINSTA ...
- delphi代码实现窗口最小化,最大化,关闭消息发送
分类: 代码实现窗口最小化,最大化,关闭 var hwnd: hwnd;//句柄 PostMessage(hwnd,WM_SYSCOMMAND, SC_MINIMIZE,0); //最小化Post ...
随机推荐
- c# sql等微型代码工具LinqPad
- JavaScript随机生成信用卡卡号的方法
这段JS代码根据信用卡卡号产生规则随机生成信用卡卡号,是可以通过验证的,仅供学习参考,请不要用于非法用途,否则后果自负. var visaPrefixList = new Array( "4 ...
- jquery接触初级-----juqery DOM操作 之二
DOm 操作之: 1.1 children(),这个函数只是查找元素的子元素,而不考虑其他后代元素 <body> <p title="请选择你最喜欢的水果"&g ...
- kvm配置USB直通
参照:https://www.linuxidc.com/Linux/2014-12/110919.htm WebVirMgr界面是没有直接的途径了,只能靠修改xml文件,在<device> ...
- mac下node安装提示command not found
官网下载了node的.pkg文件安装node,安装好后,在mac终端下输入npm -v 和 node -v均提示 command not found,参考了网上的方法,终于得解 第一步:创建.bash ...
- C:\\MFC控件大小随窗体大小而改变
一.大小和位置都改变 1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小. 2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize(): 注意 ...
- FMS Dev Guide学习笔记(权限控制)
一.开发交互式的媒体应用程序 1.关于访问(权限)控制 当一个用户访问服务器的时候,默认情况下,他可以访问所有的流媒体文件和共享对象.但是你可以使用服务端ActionScript为流媒体文件和 ...
- 立个FLAG
今天再次初步浏览了寒假生活: 三篇阅读笔记(人月神话,梦断代码,程序员修炼之道:从小工到专家),2月24日之前发表开发记账本软件,连续七天以上发表开发进度 学会使用GitHub,录制抖音(父母评价作品 ...
- jdk 11特性
JDK 11 总共包含 17 个新的 JEP ,分别为: 181: Nest-Based Access Control(基于嵌套的访问控制) 309: Dynamic Class-File Const ...
- 用Navicat for MySQL 连接 CentOS 6.5
navicat for mysql windows 端 连接mysql服务器 用SSH通道访问 , 新建连接时配置如下 (两张图解释) 1.配置SSH . 配置常规