C\#창 프로그램 전체 화면 구현 및 전체 화면 취소 절차

17251 단어 C#풀 스크린창문
프로젝트 가 필요 하기 때문에 vs 창 프로그램 으로 동 영상 을 재생 하 는 창의 전체 화면 과 전체 화면 을 취소 해 야 합 니 다.
구체 적 인 실현 인터페이스 그림:


이것 은 초기 상태 입 니 다.비디오 상자 의 오른쪽 상단 은 전체 화면 을 제어 하 는 버튼 입 니 다.
이것 은 전체 화면 뒤의 상태 로,이때 전체 화면 버튼 은 전체 화면 을 취소 하 는 스타일 로 바 뀌 었 다.
주:인터페이스의 아름다움 을 위해 제 전체 화면 은 왼쪽 에 있 는 컨트롤 도 덮 지 않 았 지만 설정 할 수 있 습 니 다.아래 코드 부분 은 제 가 설명 하 겠 습 니 다.
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\#창 프로그램 이 전체 화면 을 실현 하고 전체 화면 을 취소 하 는 절 차 는 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기