• winform窗体this方式和handle(句柄)方式的区别


    我们来比较winform窗体的this方式和win32api handle方式实现窗体的最大化、默认窗体、半透明、不透明的区别

    1、窗体界面设计

    this方式按钮: btnMaxWindow、 btnNormalWindow、btnOpaWindow 、btnOpacityWindow

    handle方式按钮: btnMaxWindow1、 btnNormalWindow1、btnOpaWindow1 、btnOpacityWindow1

    2、使用句柄(handle)

    首先在项目中引入所需win32api的函数方法

             /// <summary>
            /// windowapi 找到指定窗体的句柄函数
            /// </summary>
            /// <param name="lpClassName">窗体类名</param>
            /// <param name="lpWindowName">窗体标题名</param>
            /// <returns>返回窗体句柄(IntPtr)</returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
            /// <summary>
            /// windowapi 通过句柄显示或隐藏窗体函数
            /// </summary>
            /// <param name="hWnd">窗体句柄</param>
            /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
            /// <returns>返回成功或失败</returns>
            [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
            public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    
            /// <summary>
            /// 设置窗体透明度属性
            /// </summary>
            /// <param name="hwnd">窗体句柄</param>
            /// <param name="crKey">掩码颜色</param>
            /// <param name="bAlpha">不透明度</param>
            /// <param name="dwFlags">透明方式</param>
            /// <returns></returns>
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

    3、比较this和handle的区别

    1) 最大化窗体

            #region  设置窗体最大化(this、handle)
           
            /// <summary>
            /// this方式  设置窗体最大化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnMaxWindow_Click(object sender, EventArgs e)
            {
                //设置窗体状态为最大化
                this.WindowState = FormWindowState.Maximized;
                //不显示在任务栏
                this.ShowInTaskbar = false;
                //设置窗体为不可见
               // this.Visible = true;
            }
    
            /// <summary>
            /// handle方式 通过句柄设置窗体最大化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnMaxWindow1_Click(object sender, EventArgs e)
            {
                //获取窗体句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,最大化窗体
                    ShowWindowAsync(handle, 3);
                }
            }
    
            #endregion

    2)默认窗体

            #region 设置窗体默认大小(this、handle)
    
            /// <summary>
            /// this方式 设置窗体默认大小
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnNormalWindow_Click(object sender, EventArgs e)
            {
                //设置窗体状态为默认大小
                this.WindowState = FormWindowState.Normal;
                //不显示在任务栏
                this.ShowInTaskbar = false;
                //设置窗体为不可见
                //this.Visible = false;
            }
    
            /// <summary>
            /// handle方法  设置窗体默认大小
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnNormalWindow1_Click(object sender, EventArgs e)
            {
                //获取窗体句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,弹出窗体默认大小
                    ShowWindowAsync(handle, 1);
                }
            }
    
            #endregion 

    3)半透明窗体

            #region 设置窗体为半透明(this、handle)
               
            /// <summary>
            /// this方式 设置窗体透明度为半透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpaWindow_Click(object sender, EventArgs e)
            {
                //设置当前窗体为不透明度为0.5
                this.Opacity = 0.5;
            }
    
            /// <summary>
            /// handle方式 设置窗体透明度为半透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpaWindow1_Click(object sender, EventArgs e)
            {
                //通过win32FindWindow()函数,获取窗体的句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
                    SetLayeredWindowAttributes(handle, 0, 128, 0x00000002);
                }
            }
    
            #endregion

    4)不透明窗体

     #region 设置窗体为不透明(this、handle)
    
            /// <summary>
            /// this方式 设置窗体为不透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpacityWindow_Click(object sender, EventArgs e)
            {
                //设置窗体为不透明(0~1)
                this.Opacity = 1;
            }
    
            /// <summary>
            /// handle方式  设置窗体为不透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpacityWindow1_Click(object sender, EventArgs e)
            {
                //通过win32FindWindow()函数,获取窗体的句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
                    SetLayeredWindowAttributes(handle, 0, 255, 0x00000002);
                }
            }
    
            #endregion 

    4、完整源码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace WindowsForms
    {
    
        public partial class Form1 : Form
        {
            /// <summary>
            /// windowapi 找到指定窗体的句柄函数
            /// </summary>
            /// <param name="lpClassName">窗体类名</param>
            /// <param name="lpWindowName">窗体标题名</param>
            /// <returns>返回窗体句柄(IntPtr)</returns>
            [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
            /// <summary>
            /// windowapi 通过句柄显示或隐藏窗体函数
            /// </summary>
            /// <param name="hWnd">窗体句柄</param>
            /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
            /// <returns>返回成功或失败</returns>
            [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
            public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    
            /// <summary>
            /// 设置窗体透明度属性
            /// </summary>
            /// <param name="hwnd">窗体句柄</param>
            /// <param name="crKey">掩码颜色</param>
            /// <param name="bAlpha">不透明度</param>
            /// <param name="dwFlags">透明方式</param>
            /// <returns></returns>
            [DllImport("user32.dll", SetLastError = true)]
            static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
        
    
            public Form1()
            {
                InitializeComponent();
                //第一次运行弹出显示在屏幕中间
                this.StartPosition = FormStartPosition.CenterScreen;
            }
    
    
            #region  设置窗体最大化(this、handle)
           
            /// <summary>
            /// this方式  设置窗体最大化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnMaxWindow_Click(object sender, EventArgs e)
            {
                //设置窗体状态为最大化
                this.WindowState = FormWindowState.Maximized;
                //不显示在任务栏
                this.ShowInTaskbar = true;
                //设置窗体为不可见
               // this.Visible = true;
            }
    
            /// <summary>
            /// handle方式 通过句柄设置窗体最大化
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnMaxWindow1_Click(object sender, EventArgs e)
            {
                //获取窗体句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,最大化窗体
                    ShowWindowAsync(handle, 3);
                }
            }
    
            #endregion
    
            #region 设置窗体默认大小(this、handle)
    
            /// <summary>
            /// this方式 设置窗体默认大小
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnNormalWindow_Click(object sender, EventArgs e)
            {
                //设置窗体状态为默认大小
                this.WindowState = FormWindowState.Normal;
                //不显示在任务栏
                this.ShowInTaskbar = false;
                //设置窗体为不可见
                //this.Visible = false;
            }
    
            /// <summary>
            /// handle方法  设置窗体默认大小
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnNormalWindow1_Click(object sender, EventArgs e)
            {
                //获取窗体句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,弹出窗体默认大小
                    ShowWindowAsync(handle, 1);
                }
            }
    
            #endregion 
    
            #region 设置窗体为半透明(this、handle)
               
            /// <summary>
            /// this方式 设置窗体透明度为半透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpaWindow_Click(object sender, EventArgs e)
            {
                //设置当前窗体为不透明度为0.5
                this.Opacity = 0.5;
            }
    
            /// <summary>
            /// handle方式 设置窗体透明度为半透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpaWindow1_Click(object sender, EventArgs e)
            {
                //通过win32FindWindow()函数,获取窗体的句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
                    SetLayeredWindowAttributes(handle, 0, 128, 0x00000002);
                }
            }
    
            #endregion
    
            #region 设置窗体为不透明(this、handle)
    
            /// <summary>
            /// this方式 设置窗体为不透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpacityWindow_Click(object sender, EventArgs e)
            {
                //设置窗体为不透明(0~1)
                this.Opacity = 1;
            }
    
            /// <summary>
            /// handle方式  设置窗体为不透明
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnOpacityWindow1_Click(object sender, EventArgs e)
            {
                //通过win32FindWindow()函数,获取窗体的句柄
                IntPtr handle = FindWindow(null, "测试窗体");
                if (handle != IntPtr.Zero)
                {
                    //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
                    SetLayeredWindowAttributes(handle, 0, 255, 0x00000002);
                }
            }
    
            #endregion      
    
        }
    
    }

    5、演示窗体顺序

    (1)先按this方式的最大化窗体,handle方式恢复默认1

    (2)先按handle方式的最大化窗体1,this方式恢复默认

    (3)先按this方式的半透明窗体,handle方式不透明窗体1

    (4)先按handle方式的半透明窗体1,this方式不透明窗体

    演示的效图

    按了this方式的半透明按钮

    按钮handle方式不透明按钮1

  • 相关阅读:
    Excel公式进阶教程
    Excel公式初级教程
    一阶常系数线性差分方程通解求法
    博客园为代码块添加复制功能
    MFC分割窗口(CSplitterWnd)与选项卡视图(CTabView)的混合使用
    自制软件改变窗口大小
    conda的基本使用
    安装GPU驱动
    更换conda源、安装pytorch
    服务器安装anaconda
  • 原文地址:https://www.cnblogs.com/xielong/p/6705243.html
Copyright © 2020-2023  润新知