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

1、窗体界面设计

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

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

2、使用句柄(handle)

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

  1. /// <summary>
  2. /// windowapi 找到指定窗体的句柄函数
  3. /// </summary>
  4. /// <param name="lpClassName">窗体类名</param>
  5. /// <param name="lpWindowName">窗体标题名</param>
  6. /// <returns>返回窗体句柄(IntPtr)</returns>
  7. [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
  8. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  9.  
  10. /// <summary>
  11. /// windowapi 通过句柄显示或隐藏窗体函数
  12. /// </summary>
  13. /// <param name="hWnd">窗体句柄</param>
  14. /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
  15. /// <returns>返回成功或失败</returns>
  16. [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
  17. public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  18.  
  19. /// <summary>
  20. /// 设置窗体透明度属性
  21. /// </summary>
  22. /// <param name="hwnd">窗体句柄</param>
  23. /// <param name="crKey">掩码颜色</param>
  24. /// <param name="bAlpha">不透明度</param>
  25. /// <param name="dwFlags">透明方式</param>
  26. /// <returns></returns>
  27. [DllImport("user32.dll", SetLastError = true)]
  28. static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

3、比较this和handle的区别

1) 最大化窗体

  1. #region 设置窗体最大化(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体最大化
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnMaxWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体状态为最大化
  11. this.WindowState = FormWindowState.Maximized;
  12. //不显示在任务栏
  13. this.ShowInTaskbar = false;
  14. //设置窗体为不可见
  15. // this.Visible = true;
  16. }
  17.  
  18. /// <summary>
  19. /// handle方式 通过句柄设置窗体最大化
  20. /// </summary>
  21. /// <param name="sender"></param>
  22. /// <param name="e"></param>
  23. private void btnMaxWindow1_Click(object sender, EventArgs e)
  24. {
  25. //获取窗体句柄
  26. IntPtr handle = FindWindow(null, "测试窗体");
  27. if (handle != IntPtr.Zero)
  28. {
  29. //通过句柄,最大化窗体
  30. ShowWindowAsync(handle, );
  31. }
  32. }
  33.  
  34. #endregion

2)默认窗体

  1. #region 设置窗体默认大小(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体默认大小
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnNormalWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体状态为默认大小
  11. this.WindowState = FormWindowState.Normal;
  12. //不显示在任务栏
  13. this.ShowInTaskbar = false;
  14. //设置窗体为不可见
  15. //this.Visible = false;
  16. }
  17.  
  18. /// <summary>
  19. /// handle方法 设置窗体默认大小
  20. /// </summary>
  21. /// <param name="sender"></param>
  22. /// <param name="e"></param>
  23. private void btnNormalWindow1_Click(object sender, EventArgs e)
  24. {
  25. //获取窗体句柄
  26. IntPtr handle = FindWindow(null, "测试窗体");
  27. if (handle != IntPtr.Zero)
  28. {
  29. //通过句柄,弹出窗体默认大小
  30. ShowWindowAsync(handle, );
  31. }
  32. }
  33.  
  34. #endregion

3)半透明窗体

  1. #region 设置窗体为半透明(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体透明度为半透明
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnOpaWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置当前窗体为不透明度为0.5
  11. this.Opacity = 0.5;
  12. }
  13.  
  14. /// <summary>
  15. /// handle方式 设置窗体透明度为半透明
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. private void btnOpaWindow1_Click(object sender, EventArgs e)
  20. {
  21. //通过win32FindWindow()函数,获取窗体的句柄
  22. IntPtr handle = FindWindow(null, "测试窗体");
  23. if (handle != IntPtr.Zero)
  24. {
  25. //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  26. SetLayeredWindowAttributes(handle, , , 0x00000002);
  27. }
  28. }
  29.  
  30. #endregion

4)不透明窗体

  1. #region 设置窗体为不透明(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体为不透明
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnOpacityWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体为不透明(0~1)
  11. this.Opacity = ;
  12. }
  13.  
  14. /// <summary>
  15. /// handle方式 设置窗体为不透明
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. private void btnOpacityWindow1_Click(object sender, EventArgs e)
  20. {
  21. //通过win32FindWindow()函数,获取窗体的句柄
  22. IntPtr handle = FindWindow(null, "测试窗体");
  23. if (handle != IntPtr.Zero)
  24. {
  25. //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  26. SetLayeredWindowAttributes(handle, , , 0x00000002);
  27. }
  28. }
  29.  
  30. #endregion

4、完整源码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace WindowsForms
  13. {
  14.  
  15. public partial class Form1 : Form
  16. {
  17. /// <summary>
  18. /// windowapi 找到指定窗体的句柄函数
  19. /// </summary>
  20. /// <param name="lpClassName">窗体类名</param>
  21. /// <param name="lpWindowName">窗体标题名</param>
  22. /// <returns>返回窗体句柄(IntPtr)</returns>
  23. [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
  24. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  25.  
  26. /// <summary>
  27. /// windowapi 通过句柄显示或隐藏窗体函数
  28. /// </summary>
  29. /// <param name="hWnd">窗体句柄</param>
  30. /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
  31. /// <returns>返回成功或失败</returns>
  32. [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
  33. public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  34.  
  35. /// <summary>
  36. /// 设置窗体透明度属性
  37. /// </summary>
  38. /// <param name="hwnd">窗体句柄</param>
  39. /// <param name="crKey">掩码颜色</param>
  40. /// <param name="bAlpha">不透明度</param>
  41. /// <param name="dwFlags">透明方式</param>
  42. /// <returns></returns>
  43. [DllImport("user32.dll", SetLastError = true)]
  44. static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
  45.  
  46. public Form1()
  47. {
  48. InitializeComponent();
  49. //第一次运行弹出显示在屏幕中间
  50. this.StartPosition = FormStartPosition.CenterScreen;
  51. }
  52.  
  53. #region 设置窗体最大化(this、handle)
  54.  
  55. /// <summary>
  56. /// this方式 设置窗体最大化
  57. /// </summary>
  58. /// <param name="sender"></param>
  59. /// <param name="e"></param>
  60. private void btnMaxWindow_Click(object sender, EventArgs e)
  61. {
  62. //设置窗体状态为最大化
  63. this.WindowState = FormWindowState.Maximized;
  64. //不显示在任务栏
  65. this.ShowInTaskbar = true;
  66. //设置窗体为不可见
  67. // this.Visible = true;
  68. }
  69.  
  70. /// <summary>
  71. /// handle方式 通过句柄设置窗体最大化
  72. /// </summary>
  73. /// <param name="sender"></param>
  74. /// <param name="e"></param>
  75. private void btnMaxWindow1_Click(object sender, EventArgs e)
  76. {
  77. //获取窗体句柄
  78. IntPtr handle = FindWindow(null, "测试窗体");
  79. if (handle != IntPtr.Zero)
  80. {
  81. //通过句柄,最大化窗体
  82. ShowWindowAsync(handle, );
  83. }
  84. }
  85.  
  86. #endregion
  87.  
  88. #region 设置窗体默认大小(this、handle)
  89.  
  90. /// <summary>
  91. /// this方式 设置窗体默认大小
  92. /// </summary>
  93. /// <param name="sender"></param>
  94. /// <param name="e"></param>
  95. private void btnNormalWindow_Click(object sender, EventArgs e)
  96. {
  97. //设置窗体状态为默认大小
  98. this.WindowState = FormWindowState.Normal;
  99. //不显示在任务栏
  100. this.ShowInTaskbar = false;
  101. //设置窗体为不可见
  102. //this.Visible = false;
  103. }
  104.  
  105. /// <summary>
  106. /// handle方法 设置窗体默认大小
  107. /// </summary>
  108. /// <param name="sender"></param>
  109. /// <param name="e"></param>
  110. private void btnNormalWindow1_Click(object sender, EventArgs e)
  111. {
  112. //获取窗体句柄
  113. IntPtr handle = FindWindow(null, "测试窗体");
  114. if (handle != IntPtr.Zero)
  115. {
  116. //通过句柄,弹出窗体默认大小
  117. ShowWindowAsync(handle, );
  118. }
  119. }
  120.  
  121. #endregion
  122.  
  123. #region 设置窗体为半透明(this、handle)
  124.  
  125. /// <summary>
  126. /// this方式 设置窗体透明度为半透明
  127. /// </summary>
  128. /// <param name="sender"></param>
  129. /// <param name="e"></param>
  130. private void btnOpaWindow_Click(object sender, EventArgs e)
  131. {
  132. //设置当前窗体为不透明度为0.5
  133. this.Opacity = 0.5;
  134. }
  135.  
  136. /// <summary>
  137. /// handle方式 设置窗体透明度为半透明
  138. /// </summary>
  139. /// <param name="sender"></param>
  140. /// <param name="e"></param>
  141. private void btnOpaWindow1_Click(object sender, EventArgs e)
  142. {
  143. //通过win32FindWindow()函数,获取窗体的句柄
  144. IntPtr handle = FindWindow(null, "测试窗体");
  145. if (handle != IntPtr.Zero)
  146. {
  147. //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  148. SetLayeredWindowAttributes(handle, , , 0x00000002);
  149. }
  150. }
  151.  
  152. #endregion
  153.  
  154. #region 设置窗体为不透明(this、handle)
  155.  
  156. /// <summary>
  157. /// this方式 设置窗体为不透明
  158. /// </summary>
  159. /// <param name="sender"></param>
  160. /// <param name="e"></param>
  161. private void btnOpacityWindow_Click(object sender, EventArgs e)
  162. {
  163. //设置窗体为不透明(0~1)
  164. this.Opacity = ;
  165. }
  166.  
  167. /// <summary>
  168. /// handle方式 设置窗体为不透明
  169. /// </summary>
  170. /// <param name="sender"></param>
  171. /// <param name="e"></param>
  172. private void btnOpacityWindow1_Click(object sender, EventArgs e)
  173. {
  174. //通过win32FindWindow()函数,获取窗体的句柄
  175. IntPtr handle = FindWindow(null, "测试窗体");
  176. if (handle != IntPtr.Zero)
  177. {
  178. //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  179. SetLayeredWindowAttributes(handle, , , 0x00000002);
  180. }
  181. }
  182.  
  183. #endregion
  184.  
  185. }
  186.  
  187. }

5、演示窗体顺序

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

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

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

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

演示的效图

按了this方式的半透明按钮

按钮handle方式不透明按钮1

winform窗体this方式和handle(句柄)方式的区别的更多相关文章

  1. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  2. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...

  3. 单例模式(Winform窗体的实现)

    在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...

  4. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果

    最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...

  5. winform窗体嵌套HTML页面,开发出炫彩桌面程序

    一:CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开发 ...

  6. C# winform窗体间传值(使用委托或事件)

    窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...

  7. exe程序嵌入Winform窗体

    1.新建winform程序,添加一个Panel控件和一个button控件,winform窗体命名为:Mainform: 2.新建一个类文件,方便引用,命名为:exetowinform: 3.Mainf ...

  8. C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...

  9. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

随机推荐

  1. 20145329 《网络对抗技术》Web基础

    实践目标 Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. Web前端javascipt 理解JavaScript的基本 ...

  2. python学习笔记比较全

    注:本笔记基于python2.6而编辑,尽量的偏向3.x的语法 Python的特色 1.简单 2.易学 3.免费.开源 4.高层语言: 封装内存管理等 5.可移植性: 程序如果避免使用依赖于系统的特性 ...

  3. swift设计模式学习 - 原型模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 定义 用原型实例指定创建对象的种类,并且通 ...

  4. github上不去了

    这几天发现github.com上不去了 可能是由于要杜绝国外的人使用最新的技术??从而屏蔽了吗?

  5. 网页图片提取助手(支持背景图、选择dom范围)

    网页图片提取助手(支持背景图.选择dom范围) 网页图片下载工具.网页图片批量保存. 使用场景: 作为web前端开发首——学习小生的你我,仿学在线页面是常有的事,但是一些在线资源,比如图片,图片有im ...

  6. c++之数组形参

    1.问题,最近看项目log模块,_log模板函数中的一个参数竟然看蒙x了.函数原形是这样: template<size_t size>void _Log(char (&strDes ...

  7. BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...

  8. setSupportActionBar()方法报错

    在Android开发中,使用ToolBar控件替代ActionBar控件,需要在java代码中使用setSupportActionBar()方法,如下: Toolbar toolbar = (Tool ...

  9. 浅谈PHP5中垃圾回收算法

    原文链接:http://www.cnblogs.com/leoo2sk/archive/2011/02/27/php-gc.html PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源 ...

  10. Goroutines和Channels(四)

    如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制. 一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值 ...