C#鼠标拖拽无边框浮动窗体的方法:窗体控制

目录

(1)ReleaseCapture函数

(2)SendMessage函数

(3)实例

1.Resources.Designer.cs

2.Form1.Designer.cs

3.Form1.cs


        一般情况下,在标题栏中按住鼠标左键不放即可实现拖动操作。

        当做浮动窗体时,如果包含窗体边框,那么界面给使用者的感觉将很不友好,因此浮动窗体没有边框,但对于这种没有边框的窗体,该如何进行拖放操作呢?

        主要用Windows的两个API函数,即ReleaseCapture和SendMessage来实现:

(1)ReleaseCapture函数

        该函数用来释放被当前线程中某个窗口捕获的光标。语法格式如下:

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();

(2)SendMessage函数

        该函数用来向指定的窗体发送Windows消息。语法格式如下:

[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwdn,int wMsg,int mParam,int lParam);

(3)实例

         本实例鼠标落于窗体上,在UP之前,随意拖拽窗体到任意位置。

1.Resources.Designer.cs

//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.42000
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------namespace _198.Properties {using System;/// <summary>///   一个强类型的资源类,用于查找本地化的字符串等。/// </summary>// 此类是由 StronglyTypedResourceBuilder// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen// (以 /str 作为命令选项),或重新生成 VS 项目。[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")][global::System.Diagnostics.DebuggerNonUserCodeAttribute()][global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]internal class Resources {private static global::System.Resources.ResourceManager resourceMan;private static global::System.Globalization.CultureInfo resourceCulture;[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]internal Resources() {}/// <summary>///   返回此类使用的缓存的 ResourceManager 实例。/// </summary>[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]internal static global::System.Resources.ResourceManager ResourceManager {get {if (object.ReferenceEquals(resourceMan, null)) {global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("_198.Properties.Resources", typeof(Resources).Assembly);resourceMan = temp;}return resourceMan;}}/// <summary>///   重写当前线程的 CurrentUICulture 属性,对///   使用此强类型资源类的所有资源查找执行重写。/// </summary>[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]internal static global::System.Globalization.CultureInfo Culture {get {return resourceCulture;}set {resourceCulture = value;}}/// <summary>///   查找 System.Drawing.Bitmap 类型的本地化资源。/// </summary>internal static System.Drawing.Bitmap _04 {get {object obj = ResourceManager.GetObject("_04", resourceCulture);return ((System.Drawing.Bitmap)(obj));}}}
}

2.Form1.Designer.cs

namespace _198
{partial class Form1{/// <summary>///  Required designer variable./// </summary>private System.ComponentModel.IContainer components = null;/// <summary>///  Clean up any resources being used./// </summary>/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows Form Designer generated code/// <summary>///  Required method for Designer support - do not modify///  the contents of this method with the code editor./// </summary>private void InitializeComponent(){SuspendLayout();// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;BackgroundImage = Properties.Resources._04;BackgroundImageLayout = ImageLayout.Stretch;ClientSize = new Size(311, 218);FormBorderStyle = FormBorderStyle.None;Name = "Form1";Text = "Form1";MouseDown += Form1_MouseDown;ResumeLayout(false);}#endregion}
}

3.Form1.cs

         实例中,使用的API函数 [DllImport("user32.dll")]会提示CA1401和SYSLIB1054的错误消息提示,不要理睬,否则生成的窗体不能实现拖拽。按道理讲,按照提示修改更新为最新的API函数,P/INVOKE应该是能正常工作的,可是我没有心情去调试它了,感兴趣的网友见到后,可以深入研究并攻克它,趟有结果,还请回复。我用的框架是.NET8.0。

// 拖拽无边框浮动窗体
using System.Runtime.InteropServices;
namespace _198
{public partial class Form1 : Form{#region 本程序中用到的API函数[DllImport("user32.dll")]public static extern bool ReleaseCapture();//用来释放被当前线程中某个窗口捕获的光标[DllImport("user32.dll")]public static extern bool SendMessage(IntPtr hwdn, int wMsg, int mParam, int lParam);//向指定的窗体发送Windows消息#endregion#region 本程序中需要声明的变量public const int WM_SYSCOMMAND = 0x0112;    //该变量表示将向Windows发送的消息类型public const int SC_MOVE = 0xF010;          //该变量表示发送消息的附加消息public const int HTCAPTION = 0x0002;        //该变量表示发送消息的附加消息#endregionpublic Form1(){InitializeComponent();}/// <summary>/// 鼠标落在窗体上,随意拖拽/// </summary>private void Form1_MouseDown(object sender, MouseEventArgs e){ReleaseCapture();                                                                                       //用来释放被当前线程中某个窗口捕获的光标SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); //向Windows发送拖动窗体的消息}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测的迁移学习

目标检测的迁移学习是指利用已经在一个数据集上预训练好的目标检测模型&#xff0c;在另一个相关但不同的数据集上进行微调或者直接应用&#xff0c;以提升目标检测任务的性能。这种方法通常可以加快新数据集上的训练速度&#xff0c;并且可以在少量标注数据的情况下实现较好的…

代码随想录算法训练营第三十七天|738.单调递增的数字,968.监控二叉树

目录 738.单调递增的数字思路代码 968.监控二叉树思路代码 738.单调递增的数字 题目链接&#xff1a;704. 二分查找 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;贪心算法&#xff0c;思路不难想&#xff0c;但代码不好写&#xff01;LeetCode:738.单调自增的数字 思路…

园区智慧化转型新篇章:解码智慧技术如何助力园区实现精细化管理,提升运营效率

目录 一、智慧技术概述及其在园区管理中的应用 &#xff08;一&#xff09;物联网技术的应用 &#xff08;二&#xff09;大数据技术的应用 &#xff08;三&#xff09;云计算技术的应用 二、智慧技术助力园区实现精细化管理 &#xff08;一&#xff09;实现资源优化配置…

SqlServer 查询表、视图、存储过程被哪些引用

1.查询表、视图、存储过程在哪些视图、存储过程、函数中被使用 SELECT DISTINCT OBJECT_NAME(id) name FROM syscomments WHERE id IN ( SELECT idFROM sysobjectsWHERE type IN ( V, P ,TF) ) --V表示视图&#xff0c;P表示存储过程&#xff0c;TF表示函数AND (te…

OpenAI“VoiceEngine”震撼来袭,深度合成算法备案需抓紧

近日&#xff0c;OpenAI在官网首次展示了其全新自定义音频模型“VoiceEngine”&#xff0c;这一技术突破令人瞩目。通过仅提供15秒左右的参考声音&#xff0c;VoiceEngine便能生成几乎与原音一模一样的全新音频&#xff0c;无论是在清晰度、语音连贯性、音色还是自然度方面&…

轻松上手,无缝对接:详述如何接入企讯通空号检测接口API

企讯通空号检测接口API作为一款高效、精准的手机号码状态检测工具&#xff0c;能够帮助企业及开发者快速识别手机号码的有效性&#xff0c;优化通讯资源&#xff0c;提升营销效果。本篇文章将带领您一步步了解如何轻松、无缝地对接企讯通空号检测接口API&#xff0c;让您的业务…

【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文&#xff1a;Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity ⭐⭐⭐⭐ Code&#xff1a;github.com/starsuzi/Adaptive-RAG NAACL 2024&#xff0c;arXiv:2403.14403 文章目录 一、论文速读二、实现细节2.1 三种…

c++-msys2程序工作原理?

文章目录 1. 子系统&#xff1a;2. MinGW-w64&#xff1a;3. Pacman 包管理器&#xff1a;4. POSIX 兼容性&#xff1a; MSYS2 是一个为 Windows 用户设计的 Unix-like 开发环境和命令行接口&#xff0c;它允许用户在 Windows 上编译和运行许多原本为类 Unix 系统设计的软件。M…

使用FPGA实现逐级进位加法器

介绍 逐级进位加法器就是将上一位的输出作为下一位的进位输入&#xff0c;依次这样相加。下面以一个8位逐级进位加法器给大家展示。 我增加了电路结构&#xff0c;应该很容易理解吧。 下面我也列举了一位加法器&#xff0c;可以看下。 电路结构 设计文件 1位加法器 librar…

Docker 的数据管理 端口映射 容器互联 镜像的创建

目录 概念 概念 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。总结&#xff1a;因为容器数据是临时保存的为了安全&#xff0c;就要让数据保持持久化。 1&#…

OceanBase单机版安装体验

前情提要 上周OceanBase开发者大会过后&#xff0c;作为观察员也来体验一下OB的安装。业内有某个国产安装用了两周&#xff0c;这种其实有点劝退了。话说就是10年前&#xff0c;没搞过Oracle的人也不用两周安装一个数据库啊。今天看看OB的&#xff08;一体化&#xff09;安装。…

计算机网络----第十三天

DNS协议和文件传输协议 DNS&#xff1a; 含义&#xff1a;用于域名和IP地址的互相解析 DNS域名&#xff1a; 背景&#xff1a;通过IP地址访问目标主机&#xff0c;不便于记忆 域名的树形层次化结构&#xff1a; ①根域 ②顶级域&#xff1a;主机所处的国家/区域&#xf…

一纸歉文难挽人心,特步站在了“悬崖边”

撰稿|多客 来源|贝多财经 日前&#xff0c;一场马拉松赛事风波把特步推上了舆论风口。 此次事件说起来也并不复杂&#xff0c;在4月14日举办的2024北京半程马拉松赛最后冲刺的几百米&#xff0c;几位外籍选手在超过何杰后&#xff0c;对何杰做出回头看、摆手示意的动作&…

【Python】使用Python连接ClickHouse进行批量数据写入

有许多时候 眼泪就要流 那扇窗是让我 坚强的理由 小小的门口 还有她的温柔 给我温暖陪伴我左右 曾经的乡音 悄悄地隐藏 说不出的诺言 一直放心上 &#x1f3b5; 李健《异乡人》 在本教程中&#xff0c;我们将探讨如何使用Python连接到ClickHouse数据库&am…

谁是存储器市场下一个“宠儿”?

AI浪潮对存储器提出了更高要求&#xff0c;高容量、高性能存储产品重要性正不断凸显&#xff0c;存储产业技术与产能之争也因此愈演愈烈&#xff1a;NAND Flash领域&#xff0c;闪存堆叠层数持续提升&#xff1b;DRAM领域HBM持续扩产&#xff0c;技术不断迭代&#xff0c;同时3…

Spring 5源码学习

文章目录 一. 访问[spring官网], 找到Spring Framework&#xff0c;点击红色标记github仓库&#xff0c;下载对应的分支代码&#xff0c;本人下载5.1.x二. 安装gradle三. 调整spring-framework配置四. 开始编译五.导入idea 一. 访问[spring官网], 找到Spring Framework&#xf…

【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

实现目标 1、学会STM32CubeMX软件关于ADC的配置 2、掌握ADC三种模式&#xff08;查询、中断、DMA&#xff09;编程 3、具体目标&#xff1a;1、将开发板单片机采集到的电压值上传至上位机串口调试助手显示。 一、ADC 概述 1、什么是ADC? ADC&#xff08;Analog to Digit…

【课程发布】软考高项目十大管理ITTO宫殿记忆法新版第四版正式发布

软考高项十大管理ITTO宫殿记忆法视频课程&#xff1a; 平台&#xff1a;荔枝微课 连接&#xff1a;十方教育 各位软考高级信息系统项目管理师考生好&#xff0c;新版第四版十大管理ITTO宫殿记忆法视频课程终于发布了&#xff0c;之前苦等的考生终于迎来了救星&#xff0c;再也…

浅谈数据模型

1&#xff1a;事实表和维表的概述 前言&#xff1a;数据仓库是一种用于存储和管理大量数据的技术。其中&#xff0c;事实表和维表是数据仓库中的两个重要概念&#xff0c;首先了解一下事实表和维度表 1.事实表&#xff1a;是指用于存储测量“事实数据”的表&#xff0c;事实数…

算法学习笔记Day8——回溯算法

本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;回溯算法代码是否有规律可循&#xff1f; 一、介绍 1.回溯算法是什么&#xff1f; 回溯算法就是个多叉树的遍历问题&#xff0c;关键在于在前序和后序时间点做一些操作…