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, );
- }
- }
- #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, );
- }
- }
- #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, , , 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 = ;
- }
- /// <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, , , 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, );
- }
- }
- #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, );
- }
- }
- #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, , , 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 = ;
- }
- /// <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, , , 0x00000002);
- }
- }
- #endregion
- }
- }
5、演示窗体顺序
(1)先按this方式的最大化窗体,handle方式恢复默认1
(2)先按handle方式的最大化窗体1,this方式恢复默认
(3)先按this方式的半透明窗体,handle方式不透明窗体1
(4)先按handle方式的半透明窗体1,this方式不透明窗体
演示的效图
按了this方式的半透明按钮
按钮handle方式不透明按钮1
winform窗体this方式和handle(句柄)方式的区别的更多相关文章
- winform窗体控件(全)
回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...
- 重绘Winform窗体
本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...
- 单例模式(Winform窗体的实现)
在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...
- 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果
最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...
- winform窗体嵌套HTML页面,开发出炫彩桌面程序
一:CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开发 ...
- C# winform窗体间传值(使用委托或事件)
窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...
- exe程序嵌入Winform窗体
1.新建winform程序,添加一个Panel控件和一个button控件,winform窗体命名为:Mainform: 2.新建一个类文件,方便引用,命名为:exetowinform: 3.Mainf ...
- C# Winform 窗体传值 利用委托 子窗体传值给父窗体
常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...
- C#使用事件方式Winform窗体之间传值
[摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...
随机推荐
- C++中两个类中互相包含对方对象的指针问题(转载)
出处:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html // A.h #include "B.h" clas ...
- 自定义Web框架与jinja2模板
web应用与web框架 web应用 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 import socket def handle_reque ...
- openwrt的编译方法
1.获取最新包 ./scripts/feeds update -a 2.安装包 ./scripts/feeds install -a 3.配置 make menuconfig 4.编译 make -j ...
- 分布式系统一致性协议--Paxos算法
Paxos: Paxos算法背景介绍: Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与者逐步达成一致意见.用好理解的方式来说,就是在一个选举过程 ...
- 2018 leetcode
2018-8-6 Lowest Common Ancestor of a Binary Tree(二叉树) Merge Intervals(排序) 2018-8-7 Maximal Square (动 ...
- java 从List中随机取出一个元素
java 从List中随机取出一个元素 List<Integer> list = new ArrayList<>(); Random random = new Random() ...
- python 判断字符串是否以数字结尾
import re def end_num(string): #以一个数字结尾字符串 text = re.compile(r".*[0-9]$") if text.match(st ...
- MAC下Java安装之后的路径
pwd /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home 安装好jdk之后,就开始配置环境变量了. 首先,在终端输入 s ...
- spring boot 开发 org.springframework.context.ApplicationContextException: Unable to start web server;
Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...
- 《剑指offer》第二十四题(反转链表)
// 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...