夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm)

有时候需要让窗口中某一块的内容全屏显示,比如视频播放、地图等等。经过摸索,暂时发现两种可行方法,如果有谁知道其他方法,敬请告知

1.使用winapi “SetParent” 接口:

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
control.Dock = DockStyle.None;
control.Left = 0;
control.Top = 0;
control.Width = Screen.PrimaryScreen.Bounds.Width;
control.Height = Screen.PrimaryScreen.WorkingArea.Height;
SetParent(control.Handle, IntPtr.Zero);

执行上面的代码后,我们的 control已经可以全屏显示了,但还有一个小问题,我们应该再提供一个功能,让用户按某个键后,退出全屏,要不然关不掉,给谁用都比较郁闷。这个时候应该给控件添加相关事件,取到键后返回。我们以Esc键为例:

private void AddEventKeyUp(Control control) {
if (control != null) {
control.KeyUp += new KeyEventHandler(control_KeyUp);
foreach (Control c in control.Controls) {// 需要给子控件也添加上,否则有可能取不到。
AddEventKeyUp(c);
}
}
}
void control_KeyUp(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Escape) {
if (control != null) {
SetParent(control.Handle, 原来的parent.Handle);
control.Dock = DockStyle.Fill;
}
}
}

修改后的代码如下:

control.Dock = DockStyle.None;
control.Left = 0;
control.Top = 0;
control.Width = Screen.PrimaryScreen.Bounds.Width;
control.Height = Screen.PrimaryScreen.WorkingArea.Height;
AddEventKeyUp(control);
control.Focus();// 获得焦点,否则也得不到按键
SetParent(control.Handle, IntPtr.Zero);

2.新建一个窗口,设置 FormBorderStyle为None,WindowState为Maximized,TopMost为True。然后具体代码如下:

AddEventKeyUp(control);
原来的parent.Controls.Clear();
frmFullscreen frm = new frmFullscreen();
frm.Controls.Add(control);
frm.ShowDialog();
private void AddEventKeyUp(Control control) {
if (control != null) {
control.KeyUp += new KeyEventHandler(control_KeyUp);
foreach (Control c in control.Controls) {
AddEventKeyUp(c);
}
}
}
void control_KeyUp(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Escape) {
if (control != null) {
if (frm != null) {
frm.Controls.Clear();
原来的parent.Controls.Add(control);// 这里不能和下面的Close顺序错了,要不然会引起错误,因为Close后把控件销毁了。
frm.Close();
frm = null;
}
}
}
}

经过实际使用验证,第二种方法很好,没有任何问题。只是需要多开一个窗口。第一种方法有点小问题,就是如果控件上有右键菜单什么的,一调用 会跑到主界面去了。好像鼠标有时候也不太灵。

C# WinForm中 让控件全屏显示的实现代码的更多相关文章

  1. winfrom实现控件全屏效果

    用常规方法实现全屏显示时,由于采用的三方控件导致界面顶端一直有一条半透明的类似标题栏的东西无法去除,原因一直没找到. 下面综合整理下网上两位博主的用WindowsAPI实现全屏的方法: 控件全屏显示: ...

  2. Winform中checklistbox控件的常用方法

    Winform中checklistbox控件的常用方法最近用到checklistbox控件,在使用其过程中,收集了其相关的代码段1.添加项checkedListBox1.Items.Add(" ...

  3. Extjs 疑难杂症 (LoadMark 遮罩、Panel Update无效、chrome浏览器date控件全屏)

    一.在extjs gridPanel中使用LoadMark无效,三步搞定. 原代码: grid = new Ext.grid.GridPanel({ store: store, title:'资料列表 ...

  4. [C#]WinForm 中 comboBox控件之数据绑定

    [C#]WinForm 中 comboBox控件之数据绑定 一.IList 现在我们直接创建一个List集合,然后绑定 IList<string> list = new List<s ...

  5. Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼

    Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...

  6. Winform中TextBox控件开启自动提示补全功能

    问题:Winform开发中,有一个TextBox控件用以输入姓名,现希望在输入名字时能够自动提示所有可能的名字. 解答:winform中的TextBox控件含有如下三个属性:   ① AutoComp ...

  7. Winform中Picture控件图片的拖拽显示

    注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...

  8. winform中comboBox控件加默认选项的问题

    winform程序设计中,label,TextBox,ComboBox等几个控件几乎是用得最多的,在设计中经常会遇到一些小问题,如:comboBox控件绑定了数据源之后,如何设置默认值? combob ...

  9. c#WinForm中TeeChart控件的注册和使用

    首先要注册好TeeChart控件,注册方法参考:https://blog.csdn.net/my_clear_mind/article/details/79741020 完成注册之后,新建一个WinF ...

随机推荐

  1. ZOJ3765 Lights Splay树

    非常裸的一棵Splay树,需要询问的是区间gcd,但是区间上每个数分成了两种状态,做的时候分别存在val[2]的数组里就好.区间gcd的时候基本上不支持区间的操作了吧..不然你一个区间里加一个数gcd ...

  2. 使用git代替FTP部署代码到服务器的例子

    这篇文章主要介绍了使用git代替FTP部署代码到服务器的例子,这种方法可以节省流量.节省时间,需要的朋友可以参考下 本地开发完成后,通常会在服务器上部署,有人会使用ftp,有人会使用scp, ftp和 ...

  3. 深入浅出Java并发包—指令重排序

    前面大致提到了JDK中的一些个原子类,也提到原子类是并发的基础,更提到所谓的线程安全,其实这些类或者并发包中的这么一些类,都是为了保证系统在运行时是线程安全的,那到底怎么样才算是线程安全呢? Java ...

  4. hdu2013

    http://acm.hdu.edu.cn/showproblem.php?pid=2013 #include<iostream> #include<stdio.h> #inc ...

  5. cojs 简单的区间问题 解题报告

    新学了些弦图和区间图的新玩意,于是就想着出一道题目 其实这道题不用弦图和区间图的理论也是可以做的 首先考虑第一问,第一问是一个NOIP普及组水平的贪心 我们把区间按照右端点从小到大排序,之后从头到尾扫 ...

  6. 【Linux高频命令专题(10)】mv

    概述 mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录. 命令格式 mv [选项] 源文件或目 ...

  7. React开发项目例子

    一.需求 1.分析:用react开发一个类似bootstrap4中的card组件http://v4-alpha.getbootstrap.com/components/card/,界面类似如下: 2. ...

  8. 打败Google的灵童今在何方?

    微软和雅虎宣布在搜索和广告上10年合作,这事儿不知是不是前不久虚惊一场的微软收购雅虎案的好戏重演之序幕. 从表面上看,这次的合作改变不了搜索和广告目前的世界格局,也构不成对Google的致命威胁,反倒 ...

  9. Wireshark抓包分析HTTPS与HTTP报文的差异

    一.什么是HTTPS: HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换 ...

  10. python基础 - 文件读写

    完成功能: 从指定位置读文件到控制台 #! /usr/bin/python # coding=utf- 方法一. try: f = open ('/root/python/file/001.txt', ...