C\#창 프로그램 전체 화면 구현 및 전체 화면 취소 절차
구체 적 인 실현 인터페이스 그림:
이것 은 초기 상태 입 니 다.비디오 상자 의 오른쪽 상단 은 전체 화면 을 제어 하 는 버튼 입 니 다.
이것 은 전체 화면 뒤의 상태 로,이때 전체 화면 버튼 은 전체 화면 을 취소 하 는 스타일 로 바 뀌 었 다.
주:인터페이스의 아름다움 을 위해 제 전체 화면 은 왼쪽 에 있 는 컨트롤 도 덮 지 않 았 지만 설정 할 수 있 습 니 다.아래 코드 부분 은 제 가 설명 하 겠 습 니 다.
1.먼저 제 가 사용 하 는 컨트롤 과 제 프로젝트 의 컨트롤 이름 을 설명 하여 이해 하도록 하 겠 습 니 다.
동 영상 을 표시 하 는 검 은 상 자 는 picturebox 즉 코드 에 있 는 VideoPlayWnd 입 니 다.전체 화면/전체 화면 취 소 는 button 즉 코드 에 있 는 button 4 입 니 다.
2.구체 적 인 코드 는 다음 과 같다.
전체 화면 과 전체 화면 을 취소 하 는 단 추 는 button 4 입 니 다.
private Int16 zoom = -1;// button4 ,
//
private void button4_Click(object sender, EventArgs e)
{
if(zoom<0)
{
float w = this.Width - 210; // 210
float h = this.Height - 50;// , , 50
this.VideoPlayWnd.Size = Size.Ceiling(new SizeF(w, h));// picturebox
VideoPlayWnd.Location = new System.Drawing.Point(210, 0);// , 210 ( )
button4.Location = new System.Drawing.Point(795, 0);// picturebox , button ,
// button4.BackgroundImage = Image.FromFile(@"E:\lwj\addpersoninfo\addpersoninfo\Resources\ .png");// ( )
button4.BackgroundImage = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @" .png");//AppDomain.CurrentDomain.BaseDirectory bin ,
zoom = 1;// , , zoom
}
else
{ // , , ,
VideoPlayWnd.Location = new System.Drawing.Point(495, 360);
this.VideoPlayWnd.Size = Size.Ceiling(new SizeF(323, 271));
button4.Location = new System.Drawing.Point(795, 360);
button4.BackgroundImage = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + @" .png");
zoom = -1;// , -1( 0, if )
}
}
위 코드 의 단 추 는 전체 화면 스타일 의 배경 그림 을 추가 하고 클릭 할 때 배경 그림 을 전환 하 는 것 입 니 다.추가 지식:C\#창 영상 컨트롤 전체 화면 모드 진입 및 전체 화면 모드 종료
창 컨트롤 은 전체 화면 모드 에 들 어가 고 전체 화면 모드 를 종료 합 니 다.영상 재생 시 이 기능 을 사용 합 니 다.
도구 클래스 코드
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 CvNetVideo.Play
{
class FullScreenHelper
{
bool m_bFullScreen = false;
IntPtr m_OldWndParent = IntPtr.Zero;
WINDOWPLACEMENT m_OldWndPlacement = new WINDOWPLACEMENT();
Control m_control = null;
public FullScreenHelper(Control c)
{
m_control = c;
}
struct POINT
{
int x;
int y;
};
struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
};
// , 。 。 , 。
[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);
public void FullScreen(bool flag)
{
m_bFullScreen = flag;
if (!m_bFullScreen)
{
LockWindowUpdate(m_control.Handle);
SetParent(m_control.Handle, m_OldWndParent);
SetWindowPlacement(m_control.Handle, ref m_OldWndPlacement);
SetForegroundWindow(m_OldWndParent);
LockWindowUpdate(IntPtr.Zero);
}
else
{
GetWindowPlacement(m_control.Handle, ref m_OldWndPlacement);
int nScreenWidth = GetSystemMetrics(0);
int nScreenHeight = GetSystemMetrics(1);
m_OldWndParent = GetParent(m_control.Parent.Handle);
SetParent(m_control.Handle, GetDesktopWindow());
WINDOWPLACEMENT wp1 = new WINDOWPLACEMENT();
wp1.length = (uint)Marshal.SizeOf(wp1);
wp1.showCmd = 1;
wp1.rcNormalPosition.left = 0;
wp1.rcNormalPosition.top = 0;
wp1.rcNormalPosition.right = nScreenWidth;
wp1.rcNormalPosition.bottom = nScreenHeight;
SetWindowPlacement(m_control.Handle, ref wp1);
SetForegroundWindow(GetDesktopWindow());
SetForegroundWindow(m_control.Handle);
}
m_bFullScreen = !m_bFullScreen;
}
struct WINDOWPLACEMENT
{
public uint length;
public uint flags;
public uint showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
};
}
}
호출 방식
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UCVideo_DoubleClick(object sender, EventArgs e)
{
//
//sdlVideo.SDL_MaximizeWindow();
fullScreenHelper = new CvNetVideo.Play.FullScreenHelper(this);
fullScreenHelper.FullScreen(true);
Console.WriteLine("Entrance FullScreen Mode");
}
/// <summary>
///
/// </summary>
private void UCVideo_KeyUp(object sender, KeyEventArgs e)
{
// ESC
if (e.KeyCode == Keys.Escape&& fullScreenHelper!=null)
{
fullScreenHelper.FullScreen(false);
fullScreenHelper = null;
Console.WriteLine("Exit FullScreen Mode");
}
}
테스트 효과 도메모:SDL 을 사용 하 는 전체 화면 작업 과정 에서 설정 이 잘못 되 었 습 니 다.동 영상 을 재생 하 는 과정 에서 수정 할 수 없습니다.코드 는 다음 과 같 습 니 다:
public void SDL_MaximizeWindow()
{
Console.WriteLine(" ");
SDL.SDL_MaximizeWindow(screen);
SDL.SDL_SetWindowFullscreen(screen, SDL.SDL_GetWindowFlags(screen));
SDL.SDL_ShowWindow(screen);
//int width, height;
//SDL2.SDL.SDL_GetWindowMaximumSize(screen, out width, out height);
//if (width>0&&height>0)
//{
// SDL2.SDL.SDL_SetWindowMaximumSize(screen, width, height);
// Console.WriteLine(" ...... !width=" + width + ",height=" + height);
//}
//else
//{
// Console.WriteLine(" ...... !width=" + width + ",height=" + height);
// SDL2.SDL.SDL_SetWindowMaximumSize(screen, w, h);
//}
}
도구 코드 기능 개선
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 CvNetVideo.Play
{
/// <summary>
///
/// </summary>
public abstract class FullScreenObject
{
public abstract void FullScreen(bool flag);
}
/// <summary>
///
/// </summary>
public unsafe class FullScreenHelper: FullScreenObject
{
bool m_bFullScreen = false;
WINDOWPLACEMENT m_OldWndPlacement = new WINDOWPLACEMENT();
UCVideo m_control = null;
public FullScreenHelper(UCVideo 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)
{
#region : , IE
//ShellSDK.LockWindowUpdate(m_control.Handle);
//ShellSDK.SetParent(m_control.Handle, m_OldWndParent);
//ShellSDK.SetWindowPlacement(m_control.Handle, ref m_OldWndPlacement);
//ShellSDK.SetForegroundWindow(m_OldWndParent);
//ShellSDK.LockWindowUpdate(IntPtr.Zero);
#endregion
#region : , IE
//
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);
#endregion
}
else
{
#region : , IE
//ShellSDK.GetWindowPlacement(m_control.Handle, ref m_OldWndPlacement);
//int nScreenWidth = ShellSDK.GetSystemMetrics(0);
//int nScreenHeight = ShellSDK.GetSystemMetrics(1);
//m_OldWndParent = ShellSDK.GetParent(m_control.Handle);
//ShellSDK.SetParent(m_control.Handle, ShellSDK.GetDesktopWindow());
//WINDOWPLACEMENT wp1 = new WINDOWPLACEMENT();
//wp1.length = (uint)Marshal.SizeOf(wp1);
//wp1.showCmd = 1;
//wp1.rcNormalPosition.left = 0;
//wp1.rcNormalPosition.top = 0;
//wp1.rcNormalPosition.right = Screen.PrimaryScreen.Bounds.Width/*nScreenWidth*/;
//wp1.rcNormalPosition.bottom = Screen.PrimaryScreen.WorkingArea.Height/* nScreenHeight*/;
//ShellSDK.SetWindowPlacement(m_control.Handle, ref wp1);
//ShellSDK.SetForegroundWindow(ShellSDK.GetDesktopWindow());
//ShellSDK.SetForegroundWindow(m_control.Handle);
#endregion
#region : , IE
//
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(0);
int nScreenHeight = ShellSDK.GetSystemMetrics(1);
m_control.Dock = DockStyle.None;
m_control.Left = 0;
m_control.Top = 0;
m_control.Width = nScreenWidth;
m_control.Height = nScreenHeight;
ShellSDK.SetParent(m_control.Handle, ShellSDK.GetDesktopWindow());
ShellSDK.SetWindowPos(m_control.Handle, -1, 0, 0, m_control.Right - m_control.Left, m_control.Bottom - m_control.Top, 0);
#endregion
}
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, 0, m_rect.left, m_rect.top, m_rect.right - m_rect.left, m_rect.bottom - m_rect.top, 0);
ShellSDK.SetForegroundWindow(m_father_hwnd);
}
else
{
m_father_hwnd = ShellSDK.GetParent(m_control.Handle);
ShellSDK.GetWindowRect(m_control.Handle, out RECT 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 rect_fature);
ShellSDK.SetWindowPos(m_control.Handle, 0, 0, 0, rect_fature.right - rect_fature.left, rect_fature.bottom - rect_fature.top, 0);
}
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 RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
/// <summary>
///
/// </summary>
public struct POINT
{
public int x;
public int y;
}
/// <summary>
///
/// </summary>
public struct WINDOWPLACEMENT
{
public uint length;
public uint flags;
public uint showCmd;
public POINT ptMinPosition;
public POINT ptMaxPosition;
public RECT rcNormalPosition;
}
}
이상 의 C\#창 프로그램 이 전체 화면 을 실현 하고 전체 화면 을 취소 하 는 절 차 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.