winform下实现pictureBox全屏播放
最近开发一个项目,需要通过双击pictureBox实现全屏的功能,网上查找资料,加上一点摸索,最终实现了。做一下记录,以备以后需要。
主要功能都在下面这个类里面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace UAVRadar
{
/// <summary>
/// 定义全屏抽象类
/// </summary>
public abstract class FullScreenObject
{
public abstract void FullScreen(bool flag);
}
/// <summary>
/// 桌面全屏
/// </summary>
public unsafe class FullScreenHelper : FullScreenObject
{
public bool m_bFullScreen = false; WINDOWPLACEMENT m_OldWndPlacement = new WINDOWPLACEMENT(); Control m_control = null; public FullScreenHelper(Control control)
{
m_control = control;
} private IntPtr m_OldWndParent = IntPtr.Zero; DockStyle old_docker_style;
int old_left;
int old_width;
int old_height;
int old_top; public override void FullScreen(bool flag)
{
m_bFullScreen = flag;
if (!m_bFullScreen)
{
// 取消全屏设置
m_control.Dock = old_docker_style;
m_control.Left = old_left;
m_control.Top = old_top;
m_control.Width = old_width;
m_control.Height = old_height;
ShellSDK.SetParent(m_control.Handle, m_OldWndParent); }
else
{ // 记录原来的数据
old_docker_style = m_control.Dock;
old_left = m_control.Left;
old_width = m_control.Width;
old_height = m_control.Height;
old_top = m_control.Top;
m_OldWndParent = ShellSDK.GetParent(m_control.Handle);
// 设置全屏数据
int nScreenWidth = ShellSDK.GetSystemMetrics();
int nScreenHeight = ShellSDK.GetSystemMetrics();
m_control.Dock = DockStyle.None;
m_control.Left = ;
m_control.Top = ;
m_control.Width = nScreenWidth;
m_control.Height = nScreenHeight;
ShellSDK.SetParent(m_control.Handle, ShellSDK.GetDesktopWindow());
ShellSDK.SetWindowPos(m_control.Handle, -, , , m_control.Right - m_control.Left, m_control.Bottom - m_control.Top, ); }
m_bFullScreen = !m_bFullScreen;
} } /// <summary>
/// 在容器内部全屏
/// </summary>
public class FullScreenInContainerHelper : FullScreenObject
{
bool m_bFullScreen = false; Control m_control = null; public FullScreenInContainerHelper(Control control)
{
m_control = control;
} private IntPtr m_OldWndParent = IntPtr.Zero;
private IntPtr m_father_hwnd;
private RECT m_rect = new RECT(); public override void FullScreen(bool flag)
{
m_bFullScreen = flag;
if (!m_bFullScreen)
{
ShellSDK.SetParent(m_control.Handle, m_father_hwnd);
ShellSDK.SetWindowPos(m_control.Handle, , m_rect.left, m_rect.top, m_rect.right - m_rect.left, m_rect.bottom - m_rect.top, );
ShellSDK.SetForegroundWindow(m_father_hwnd);
}
else
{
m_father_hwnd = ShellSDK.GetParent(m_control.Handle);
RECT rect;
RECT rect_fature;
ShellSDK.GetWindowRect(m_control.Handle, out rect);
POINT pt = new POINT();
pt.x = rect.left;
pt.y = rect.top;
ShellSDK.ScreenToClient(m_father_hwnd, ref pt);
rect.right = rect.right - rect.left + pt.x;
rect.bottom = rect.bottom - rect.top + pt.y;
rect.left = pt.x;
rect.top = pt.y;
m_rect = rect;
ShellSDK.GetWindowRect(m_father_hwnd, out rect_fature);
ShellSDK.SetWindowPos(m_control.Handle, , , , rect_fature.right - rect_fature.left, rect_fature.bottom - rect_fature.top, );
}
m_bFullScreen = !m_bFullScreen;
}
} /// <summary>
/// Windows系统API-SDK
/// </summary>
public class ShellSDK
{
//锁定指定窗口,禁止它更新。同时只能有一个窗口处于锁定状态。锁定指定窗口,禁止它更新。同时只能有一个窗口处于锁定状态
[DllImport("User32.dll")]
public static extern bool LockWindowUpdate(IntPtr hWndLock); //函数来设置弹出式窗口,层叠窗口或子窗口的父窗口。新的窗口与窗口必须属于同一应用程序
[DllImport("User32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //函数设置指定窗口的显示状态和恢复,最大化,最小化位置。函数功能: 函及原型
[DllImport("User32.dll")]
public static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); //函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号
[DllImport("User32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd); //该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域
[DllImport("User32.dll")]
public static extern IntPtr GetDesktopWindow(); //函数名。该函数返回指定窗口的显示状态以及被恢复的、最大化的和最小化的窗口位置
[DllImport("User32.dll")]
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl); //是用于得到被定义的系统数据或者系统配置信息的一个专有名词
[DllImport("User32.dll")]
public static extern int GetSystemMetrics(int nIndex); [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
public static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern System.IntPtr GetForegroundWindow();
[DllImport("user32")]
public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
[DllImport("user32.dll")]
public static extern uint ScreenToClient(IntPtr hwnd, ref POINT p);
} /// <summary>
/// 图像窗口对象
/// </summary>
public struct WINDOWPLACEMENT
{
public uint length;
public uint flags;
public uint showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
}
/// <summary>
/// 图像点位位置
/// </summary>
public struct POINT
{
public int x;
public int y;
} /// <summary>
/// 图像区域对象
/// </summary>
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
}
然后界面调用就比较简单了,pictureBox控件定义一个DoubleClick事件,然后调用如下代码即可
private FullScreenHelper fullScreenHelper = null;
private void pictureBox2_DoubleClick(object sender, EventArgs e)
{
if (fullScreenHelper == null)
{
fullScreenHelper = new FullScreenHelper(pictureBox2);
fullScreenHelper.FullScreen(true);
}
else
{
fullScreenHelper.FullScreen(false);
fullScreenHelper = null;
}
}
winform下实现pictureBox全屏播放的更多相关文章
- [Winform]Media Player组件全屏播放的设置
摘要 在设置程序开始运行时,让视频全屏播放时,直接设置 windowsMediaPlay.fullScreen = true; 会报错,代码如下 windowsMediaPlay.URL = _vid ...
- 用原生VideoView进行全屏播放时的问题
之前参加了一个课程,里面有一节讲到了用视频作为启动界面.讲师用的是自定义VideoView,重写onMeasure方法,因为原生的VideoView在那情况下不能实现全屏播放.当时没有深入研究,现在补 ...
- audio与video控件/标签的隐藏,iso/Android下自动全屏播放,短暂黑屏问题
(一)audio音频标签 <audio src="xxx.mp3"></audio> (二)video视频标签 <video src="xx ...
- MUI ios下用video标签默认全屏播放
前几天用Hbuilder+MUI做了个应用,里边用到<video>标签,在Android下正常,但是在苹果手机老是默认全屏播放. 解决办法: 首先在video标签加上playsinline ...
- 【Win 10应用开发】实现全屏播放的方法
有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整 ...
- iphone H5视频行内播放(禁止全屏播放)
一般用户都知道,ios在网页点击视频播放时,视频会弹出全屏播放框. video标签的playsinline.webkit-playsinline标记根本就不会起作用. 还有传闻说对于没有声音的视频不会 ...
- HTML5新标签video在iOS上默认全屏播放
今天做一个app时发现一个问题,应用html5中的video标签加载视频,在Android手机上默认播放大小,但是换成iPhone手机上出问题了,默认弹出全屏播放,查找了好多论坛,都没有谈论这个的.然 ...
- video自动全屏播放
video自动全屏播放 关于Screen.lockOrientation() https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockO ...
- iOS 全局禁止横屏,但UIWebView 全屏播放视频,横屏,解决办法(任意页面横竖屏或禁止)
iOS 全局禁止横屏,但UIWebView 全屏播放视频,横屏,解决办法 时间 2015-07-14 20:59:00 博客园-原创精华区 原文 http://www.cnblogs.com/fe ...
随机推荐
- Factorialize a Number
计算一个整数的阶乘 如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积. 阶乘通常简写成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120 当你完成不了挑战的时候 ...
- springmvc日期格式化
jsp页面String类型转Controller后台Date类型 方法1.在实体中加入日期格式化注解 @DateTimeFormat(pattern="yyyy-MM-dd") p ...
- 为eclipse EE(汉化版) 配置Tomcat服务器
为eclipse EE(汉化版) 配置Tomcat服务器 很多小朋友在初次使用eclipse进行web开发的时候,很是蒙蔽.以前都是文本编辑器写好,做好目录结构,往tomcat下一扔,重启,搞定. ...
- 【Html 学习笔记】第五节——表格
表格也是日常用到的. 普通表格:<table> 表格边框:border 表头:th 表格标题:caption 横/纵向合并的单元格:colspan .rawspan 表格内标签: 单元格间 ...
- windows 下git 的配置安装与使用
一.安装GIT(过于简单略过) 二.配置git 二(一).配置git的user name和email 打开 git bash,输入 $ git config --global user.name &q ...
- PHP exec()函数的介绍和使用DEMO
exec()函数用来执行一个外部程序,我们再用这函数基本是在linux. 开启exec()函数: exec()函数是被禁用的,要使用这个函数必须先开启.首先是 要关掉 安全模式 safe_mode = ...
- 201621123005《Java程序设计》第三周作业学习总结
201621123005<Java程序设计>第三周 学习总结 标签(空格分隔): 未分类 1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化 ...
- hdu 1098
http://acm.hdu.edu.cn/showproblem.php?pid=1098 假设x=m时,65|f(m),即65|5*m^13+13*m^5+k*a*m 计算f(m+1)=(5*m^ ...
- Mysql Innodb 引擎优化 参数(innodb_buffer_pool_size)
在mysql的学习过程中,要是不把一些基本概率弄的很清楚,难免显得过于不专业. 作用: 这个参数主要作用是缓存innodb表的索引,数据,插入数据时的缓冲 默认值:128M 专用mysql服务器设置的 ...
- vuex(一)mutations
前言:vuex的使用,想必大家也都知道,类似于状态库的东西,存储某种状态,共互不相干的两个组件之间数据的共享传递等.我会分开给大家讲解vuex的使用,了解并掌握vuex的核心(state,mutati ...