本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!


开发工具:VS2017

语言:C#

DotNet版本:.Net FrameWork 4.0及以上

一、使用的WIN32 API有两个,一个为ReleaseCapture,另外一个为SendMessage,这两个函数说明如下:

ReleaseCapture函数:为了说明ReleaseCapture的用法,需要先知道SetCapture的用法,MSDN是这样描述SetCapture函数:

该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。

而ReleaseCapture悄悄相反,函数的功能就是释放对鼠标的捕捉。

为什么要使用这个ReleaseCapture函数,原因在于移动窗体标题时,需要释放对鼠标的捕捉,否则,就不能移动窗体标题。

SendMessage函数:该函数是用来给窗体发送Windows消息,

在本文中,该函数是模拟给非窗体客户区域(如窗体标题、最大化、最小化及关闭按钮区域)发送Windows消息,使特定区域能收到拖动窗体标题的消息。

两者在C#的定义如下:

[DllImport("user32.dll")]
static extern void ReleaseCapture();
[DllImport("user32.dll")]
static extern void SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);

关于hwnd、msg、wParam,lParam的具体说明,可以自行百度。

二、构建模拟移动窗体标题的应用程序,在这里我们使用了一个label(左边,label1),用来将鼠标移到该控件并拖动时,可以移动窗体,

另外一个label(右边,label2)则用来关闭窗体,如下图所示:

我们在label1的MouseDown事件写下如下代码:

 private void label1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, );
}

其中,WM_NCLBUTTONDOWN(0x00A1),用来给非客户端发送左键按下消息,

HT_CAPTION(0x0002),为所需要作用的区域,此次为窗体标题。

我们在label2的MouseEnter、MouserLeave、Click事件写下如下代码:

private void label2_MouseEnter(object sender, EventArgs e)
{
label2.BackColor = Color.FromArgb(, , );
toolTip1.SetToolTip(label2, "关闭");
} private void label2_MouseLeave(object sender, EventArgs e)
{
label2.BackColor = Color.Silver;
toolTip1.SetToolTip(label2, "");
} private void label2_Click(object sender, EventArgs e)
{
this.Close();
}

其中,需要为关闭按钮填写显示“关闭”按钮的提示,因此需要使用ToolTip控件。

三、窗体颜色变换

这里主要用到了一个变换彩虹颜色的算法,参考如下:

public static Color Rainbow(float progress)
{
var div = (Math.Abs(progress % ) * );
var ascending = (int)((div % ) * );
var descending = - ascending; switch ((int)div)
{
case :
return Color.FromArgb(, , ascending, );
case :
return Color.FromArgb(, descending, , );
case :
return Color.FromArgb(, , , ascending);
case :
return Color.FromArgb(, , descending, );
case :
return Color.FromArgb(, ascending, , );
default:
return Color.FromArgb(, , , descending);
}
}

可以借用一个while循环,内部再嵌套一个for循环,达到不断变换颜色的目的,如下代码所示:

private void ChangeColor()
{
Task.Factory.StartNew(() =>
{
Color color;
while (true)
{
try
{
for (float i = ; i < 1f; i += 0.01f)
{
color = Rainbow(i);
this.Invoke((Action)(() =>
{
BackColor = color;
}));
Thread.Sleep();
}
}
catch { }
}
});
}

四、构建完的程序界面如下:

五、源代码及EXE如下:

源代码:

EXE:

[C#]使用Label标签控件模拟窗体标题的移动及窗体颜色不断变换的更多相关文章

  1. [C#]使用Label标签控件模拟窗体标题的移动

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.0及以 ...

  2. 基于duilib实现的可滑动tab标签控件

    最近一直在忙棋牌游戏大厅的开发,使用了duilib界面库,在大厅界面游戏菜单的展现上需要用到滑动的效果,类似悠扬棋牌,jj棋牌的菜单左右(上下)滑动的效果.通过自己的设计思路完善了一个可滑动的tab标 ...

  3. 能够附加图片的标签控件iOS项目源码

    这个源码案例是能够附加图片的标签控件,源码JTImageLabel,JTImageLabel能够附加图片的标签Label控件,图片可以随意更换.位置也能够很好的控制.效果图: <ignore_j ...

  4. swing实现QQ登录界面1.0( 实现了同一张图片只加载一次)、(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件)

    swing实现QQ登录界面1.0( 实现了同一张图片只加载一次).(以及实现简单的布局面板添加背景图片控件的标签控件和添加一个关闭按钮控件) 代码思路分析: 1.(同一张图片仅仅需要加载一次就够了,下 ...

  5. Android 标签控件

    版本号:1.0 日期:2014.7.24 版权:© 2014 kince 转载注明出处      在有的应用中可能须要设置一些标签来方便用去去查询某些信息,比方手机助手或者购物软件之类都会有一些标签. ...

  6. DS标签控件文本解析格式

    DS标签控件使用DSL文本渲染引擎,支持DSL引擎代码.目前支持代码如下: <b>粗体</b> 以粗体显示 <i>斜体</i> 以斜体显示 <u& ...

  7. ActiveReports 报表控件V12新特性 -- 文本框和标签控件的浓缩

    ActiveReports是一款专注于 .NET 平台的报表控件,全面满足 HTML5 / WinForms / ASP.NET / ASP.NET MVC / WPF 等平台下报表设计和开发工作需求 ...

  8. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  9. 让Label等控件支持HTML格式的代码? 使用NSAttributedString:

    > 如何让Label等控件支持HTML格式的代码? 使用NSAttributedString: NSString *htmlString = @"<div>Tate< ...

随机推荐

  1. Oracle EBS OM 取消订单行

    DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...

  2. Freemarket语法

    <#--freemarker HashMap取值--> <#assign maps={"1":"张三丰","2":&quo ...

  3. abp框架里使用Redis

    首先引用 nuget Abp.RedisCache 在 appsettings.json加上Redis服务器配置 "RedisCache": { "ConnectionS ...

  4. Practice telephone techniques

    https://www.englishclub.com/speaking/telephone-practice-appointments.htm https://www.englishclub.com ...

  5. [Spark Core] Spark 核心组件

    0. 说明 [Spark 核心组件示意图] 1. RDD resilient distributed dataset , 弹性数据集 轻量级的数据集合,逻辑上的集合.等价于 list 没有携带数据. ...

  6. October 12th 2017 Week 41st Thursday

    Be happy for this moment. This moment is your life. 为这一刻感到高兴,这一刻是你的人生. Yesterday Tencent became Asia ...

  7. PAT B1006 换个格式输出整数 (15 分)

    让我们用字母 B 来表示“百”.字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<),换个格式来输出任一个不超过 3 位的正整数.例如 234 应该被输出为 BBSSS123 ...

  8. CSS grid layout

      CSS网格布局用于将页面分割成数个主要区域,或者用来定义组件内部元素间大小.位置和图层之间的关系. 像表格一样,网格布局让我们能够按行或列来对齐元素. 但是,使用CSS网格可能还是比CSS表格更容 ...

  9. Java 将任意数组的任意两个位置的数据进行交换

    package yw.fanxing; /** * 自定义泛型测试 * * 写一个方法,将任意数组的任意两个位置的数据进行交换 * * @author yw-tony * */ public clas ...

  10. cloudstack网络部分知识点汇总

    UI界面的几个网络选项 DNS1:供此区域的来宾VM使用,此区域的公用IP必须路由到此服务器: 内DNS:供此区域的系统VM使用,提供点的专用IP必须路由到此服务器: 如:你在添加存储设备时,用的主机 ...