winform下实现pictureBox全屏播放

最近开发一个项目,需要通过双击pictureBox实现全屏的功能,网上查找资料,加上一点摸索,最终实现了。做一下记录,以备以后需要。

主要功能都在下面这个类里面

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Runtime.InteropServices;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7 using System.Windows.Forms;
  8
  9 namespace UAVRadar
 10 {
 11     /// <summary>
 12     /// 定义全屏抽象类
 13     /// </summary>
 14     public abstract class FullScreenObject
 15     {
 16         public abstract void FullScreen(bool flag);
 17     }
 18     /// <summary>
 19     /// 桌面全屏
 20     /// </summary>
 21     public unsafe class FullScreenHelper : FullScreenObject
 22     {
 23         public bool m_bFullScreen = false;
 24
 25         WINDOWPLACEMENT m_OldWndPlacement = new WINDOWPLACEMENT();
 26
 27         Control m_control = null;
 28
 29         public FullScreenHelper(Control control)
 30         {
 31             m_control = control;
 32         }
 33
 34         private IntPtr m_OldWndParent = IntPtr.Zero;
 35
 36         DockStyle old_docker_style;
 37         int old_left;
 38         int old_width;
 39         int old_height;
 40         int old_top;
 41
 42         public override void FullScreen(bool flag)
 43         {
 44             m_bFullScreen = flag;
 45             if (!m_bFullScreen)
 46             {
 47                 // 取消全屏设置
 48                 m_control.Dock = old_docker_style;
 49                 m_control.Left = old_left;
 50                 m_control.Top = old_top;
 51                 m_control.Width = old_width;
 52                 m_control.Height = old_height;
 53                 ShellSDK.SetParent(m_control.Handle, m_OldWndParent);
 54
 55             }
 56             else
 57             {
 58
 59                 // 记录原来的数据
 60                 old_docker_style = m_control.Dock;
 61                 old_left = m_control.Left;
 62                 old_width = m_control.Width;
 63                 old_height = m_control.Height;
 64                 old_top = m_control.Top;
 65                 m_OldWndParent = ShellSDK.GetParent(m_control.Handle);
 66                 // 设置全屏数据
 67                 int nScreenWidth = ShellSDK.GetSystemMetrics(0);
 68                 int nScreenHeight = ShellSDK.GetSystemMetrics(1);
 69                 m_control.Dock = DockStyle.None;
 70                 m_control.Left = 0;
 71                 m_control.Top = 0;
 72                 m_control.Width = nScreenWidth;
 73                 m_control.Height = nScreenHeight;
 74                 ShellSDK.SetParent(m_control.Handle, ShellSDK.GetDesktopWindow());
 75                 ShellSDK.SetWindowPos(m_control.Handle, -1, 0, 0, m_control.Right - m_control.Left, m_control.Bottom - m_control.Top, 0);
 76
 77             }
 78             m_bFullScreen = !m_bFullScreen;
 79         }
 80
 81     }
 82
 83     /// <summary>
 84     /// 在容器内部全屏
 85     /// </summary>
 86     public class FullScreenInContainerHelper : FullScreenObject
 87     {
 88         bool m_bFullScreen = false;
 89
 90         Control m_control = null;
 91
 92         public FullScreenInContainerHelper(Control control)
 93         {
 94             m_control = control;
 95         }
 96
 97         private IntPtr m_OldWndParent = IntPtr.Zero;
 98         private IntPtr m_father_hwnd;
 99         private RECT m_rect = new RECT();
100
101         public override void FullScreen(bool flag)
102         {
103             m_bFullScreen = flag;
104             if (!m_bFullScreen)
105             {
106                 ShellSDK.SetParent(m_control.Handle, m_father_hwnd);
107                 ShellSDK.SetWindowPos(m_control.Handle, 0, m_rect.left, m_rect.top, m_rect.right - m_rect.left, m_rect.bottom - m_rect.top, 0);
108                 ShellSDK.SetForegroundWindow(m_father_hwnd);
109             }
110             else
111             {
112                 m_father_hwnd = ShellSDK.GetParent(m_control.Handle);
113                 RECT rect;
114                 RECT rect_fature;
115                 ShellSDK.GetWindowRect(m_control.Handle, out rect);
116                 POINT pt = new POINT();
117                 pt.x = rect.left;
118                 pt.y = rect.top;
119                 ShellSDK.ScreenToClient(m_father_hwnd, ref pt);
120                 rect.right = rect.right - rect.left + pt.x;
121                 rect.bottom = rect.bottom - rect.top + pt.y;
122                 rect.left = pt.x;
123                 rect.top = pt.y;
124                 m_rect = rect;
125                 ShellSDK.GetWindowRect(m_father_hwnd, out rect_fature);
126                 ShellSDK.SetWindowPos(m_control.Handle, 0, 0, 0, rect_fature.right - rect_fature.left, rect_fature.bottom - rect_fature.top, 0);
127             }
128             m_bFullScreen = !m_bFullScreen;
129         }
130     }
131
132     /// <summary>
133     /// Windows系统API-SDK
134     /// </summary>
135     public class ShellSDK
136     {
137         //锁定指定窗口,禁止它更新。同时只能有一个窗口处于锁定状态。锁定指定窗口,禁止它更新。同时只能有一个窗口处于锁定状态
138         [DllImport("User32.dll")]
139         public static extern bool LockWindowUpdate(IntPtr hWndLock);
140
141         //函数来设置弹出式窗口,层叠窗口或子窗口的父窗口。新的窗口与窗口必须属于同一应用程序
142         [DllImport("User32.dll")]
143         public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
144
145         //函数设置指定窗口的显示状态和恢复,最大化,最小化位置。函数功能: 函及原型
146         [DllImport("User32.dll")]
147         public static extern bool SetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
148
149         //函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号
150         [DllImport("User32.dll")]
151         public static extern bool SetForegroundWindow(IntPtr hWnd);
152
153         //该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域
154         [DllImport("User32.dll")]
155         public static extern IntPtr GetDesktopWindow();
156
157         //函数名。该函数返回指定窗口的显示状态以及被恢复的、最大化的和最小化的窗口位置
158         [DllImport("User32.dll")]
159         public static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
160
161         //是用于得到被定义的系统数据或者系统配置信息的一个专有名词
162         [DllImport("User32.dll")]
163         public static extern int GetSystemMetrics(int nIndex);
164
165         [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
166         public static extern IntPtr GetParent(IntPtr hWnd);
167         [DllImport("user32.dll", CharSet = CharSet.Auto)]
168         public static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
169         [DllImport("user32.dll", CharSet = CharSet.Auto)]
170         public static extern System.IntPtr GetForegroundWindow();
171         [DllImport("user32")]
172         public static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
173         [DllImport("user32.dll")]
174         public static extern uint ScreenToClient(IntPtr hwnd, ref POINT p);
175     }
176
177     /// <summary>
178     /// 图像窗口对象
179     /// </summary>
180     public struct WINDOWPLACEMENT
181     {
182         public uint length;
183         public uint flags;
184         public uint showCmd;
185         public POINT ptMinPosition;
186         public POINT ptMaxPosition;
187         public RECT rcNormalPosition;
188     }
189     /// <summary>
190     /// 图像点位位置
191     /// </summary>
192     public struct POINT
193     {
194         public int x;
195         public int y;
196     }
197
198     /// <summary>
199     /// 图像区域对象
200     /// </summary>
201     public struct RECT
202     {
203         public int left;
204         public int top;
205         public int right;
206         public int bottom;
207     }
208 }

然后界面调用就比较简单了,pictureBox控件定义一个DoubleClick事件,然后调用如下代码即可

 1 private FullScreenHelper fullScreenHelper = null;
 2 private void pictureBox2_DoubleClick(object sender, EventArgs e)
 3         {
 4             if (fullScreenHelper == null)
 5             {
 6                 fullScreenHelper = new FullScreenHelper(pictureBox2);
 7                 fullScreenHelper.FullScreen(true);
 8             }
 9             else
10             {
11                 fullScreenHelper.FullScreen(false);
12                 fullScreenHelper = null;
13             }
14         }

原文地址:https://www.cnblogs.com/tlduck/p/9087164.html

时间: 2024-10-09 00:41:19

winform下实现pictureBox全屏播放的相关文章

[Winform]Media Player组件全屏播放的设置

摘要 在设置程序开始运行时,让视频全屏播放时,直接设置 windowsMediaPlay.fullScreen = true; 会报错,代码如下 windowsMediaPlay.URL = _videoPath; windowsMediaPlay.Ctlcontrols.play(); windowsMediaPlay.fullScreen = true; windowsMediaPlay.ClickEvent += windowsMediaPlay_ClickEvent; windowsMe

iOS开发——在不支持横屏情况下,实现播放器全屏播放

在使用MPMoviePlayerController实现播放器播放时,发现不能全屏播放,原来是因为项目不支持横屏,把支持横屏的选项勾住就OK啦,但是其他页面不支持横屏,这个方法就行不通了. 在网上找了很多的资料,很多都是在iOS 6之后就舍弃的,都没用,下面我就来介绍下,在不支持横屏的情况下,实现视频播放器的全屏播放. 1. 首先在AppDelegate.h 定义@property (nonatomic, assign) BOOL allowRotation; // 标记是否可以旋转 2. 同时

audio与video控件/标签的隐藏,iso/Android下自动全屏播放,短暂黑屏问题

(一)audio音频标签 <audio src="xxx.mp3"></audio> (二)video视频标签 <video src="xxx.mp4"></video> (三)使用video代替audio (1) 有时候audio标签被屏蔽,不能被浏览器解释通过,可以选择使用video来代替: <video src="xxx.mp3"></video> (2) 若想要将音乐

Android编程实现WebView全屏播放的方法

这篇文章主要介绍了Android编程实现WebView全屏播放的方法,结合实例形式较为详细的分析了Android实现WebView全屏播放的布局与功能相关技巧,需要的朋友可以参考下! 本文实例讲述了Android编程实现WebView全屏播放的方法.分享给大家供大家参考,具体如下: 最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧. 首先写布局文件activity_main.xml: <LinearLayout xmlns:an

Chromium为视频标签&lt;video&gt;全屏播放的过程分析

在Chromium中,<video>标签有全屏和非全屏两种播放模式.在非全屏模式下,<video>标签播放的视频嵌入在网页中显示,也就是视频画面作为网页的一部分显示.在全屏模式下,我们是看不到网页其它内容的,因此<video>标签播放的视频可以在一个独立的全屏窗口中显示.这两种截然不同的播放模式,导致Chromium使用不同的方式渲染视频画面.本文接下来就详细分析<video>标签全屏播放的过程. 从前面Chromium为视频标签<video>渲

webview加载网页与全屏播放视频?

上篇我们大致了解了webview的一些属性,以及重要的方法.这篇我们就要一些案列来说明,一般webview最广泛的作用就是,加载一个html的网页(实现与js交互),,webview加载网页网页当中含有视频,webview文件下载等等. 首先我们来了解下webview是如何加载网页的?首先我们看下网页在家的效果? 代码也是比较简单 1 package cn.xiao.webviewplayvideo; 2 import android.app.Activity; 3 import android

【Win 10应用开发】实现全屏播放的方法

原文:[Win 10应用开发]实现全屏播放的方法 有人会问,以前的MediaElement控件不是有现成的一排操作按钮吗?而且可以直接进入全屏播放.是的,我们知道,以往的Store App都是在全屏模式下运行的,只要MediaElement控件填满整个窗口,就等于全屏播放了,但是,Win10应用是窗口化的,将MediaElement控件的IsFullWindow属性设置为true后,就会这样: 从上面的截图看,MediaElement控件只是覆盖整个窗口而已,并没有实现全屏.那有办法让它全屏播放

3d 视频切换到全屏播放

项目:3d场景中播放一个小窗口的视频,点击视频,放大为屏幕上的全屏视频.再点击视频,缩小为原来的小窗口的视频继续播放视频. 1.Unity3D 中,在三维场景中呈现播放视频,将视频组件放到相应的Plane下,调整其位置,缩放,旋转. 2.在视频所附Plane上放置世界空间的UI canvas Button,大小一致,处于透明状态,注意UGUI的Image组件不能remove,button点击的效果可以设为无. 3.全屏播放视频,需要加入屏幕UI Canvas,加入子节点raw image组件,再

Android之针对WebView的全屏播放

转载请标明转载处:http://bbs.csdn.net/topics/390839259 本人刚学android,菜鸟一个,第一次写帖子,最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧.首先写布局文件activity_main.xml: XML/HTML code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <LinearLayout