winform下实现pictureBox全屏播放
标签:全屏 width str 恢复 tde 功能 container 开发 锁定
最近开发一个项目,需要通过双击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 ///
12 /// 定义全屏抽象类
13 ///
14 public abstract class FullScreenObject
15 {
16 public abstract void FullScreen(bool flag);
17 }
18 ///
19 /// 桌面全屏
20 ///
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 ///
84 /// 在容器内部全屏
85 ///
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 ///
133 /// Windows系统API-SDK
134 ///
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 ///
178 /// 图像窗口对象
179 ///
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 ///
190 /// 图像点位位置
191 ///
192 public struct POINT
193 {
194 public int x;
195 public int y;
196 }
197
198 ///
199 /// 图像区域对象
200 ///
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全屏播放
标签:全屏 width str 恢复 tde 功能 container 开发 锁定
原文地址:https://www.cnblogs.com/tlduck/p/9087164.html
评论