winform下实现pictureBox全屏播放

Posted 淹死的鸭子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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         }

 

以上是关于winform下实现pictureBox全屏播放的主要内容,如果未能解决你的问题,请参考以下文章

C#在winform上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。

C#在winform上画一张大于全屏的图片(至少3000*3000像素)。在窗口最大化下用鼠标拖动图片,必须画面流畅。

wpf中嵌入winform控件的坑

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

winform中,播放一段全屏SWF视频,鼠标点击视频上一段区域 得到点击区域内的事件

Winform 设置panel容器的背景为pictureBox