首页 > 编程语言 >C#无标题栏窗体的移动

C#无标题栏窗体的移动

时间:2024-02-25 21:46:34浏览次数:25  
标签:point C# void 标题栏 start Form1 窗体 mouse

C#无标题栏窗体的移动

转载于:https://www.cnblogs.com/magicianlyx/p/4918153.html

首先C#无标题栏窗体的实现代码

在load时实现无工具栏+无窗口标题

private void Form1_Load(object sender, EventArgs e)
        {
            this.ControlBox = false;
            this.Text = "";
        }

这样就可以实现无标题栏窗体了,示例效果

第一种实现点击窗口内区域移动窗体的方法重写wndproc,截取在窗体区域内移动的消息:

protected override void WndProc(ref Message m)
         {
             base.WndProc(ref m);
                if (m.Msg == 0x84&&m.Result.ToInt32()==1)
                {
                        m.Result = new IntPtr(2);
                    
                }
        }  

第二种实现方法:

private void Form1_Load(object sender, EventArgs e)
        {
            this.MouseMove+=Form1_MouseMove;
        }

        
        [DllImport("user32.dll", EntryPoint = "SendMessage")]  
        public static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);  
        [DllImport("user32.dll", EntryPoint = "ReleaseCapture")]  
        public static extern int ReleaseCapture();  

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {  
            ReleaseCapture();//使鼠标事件对当前窗体持续有效
            SendMessage(this.Handle, 0x0112, 0xF012, 0);  
        }  

第三种截取鼠标在窗体内按下左键时的消息,改为鼠标在标题栏下按下左击的事件实现移动:

protected override void WndProc(ref Message m)
        {
           if(m.Msg==0x201)
            {
                m.Msg = 0xA1;
               m.WParam = new IntPtr(2);
            }
            base.WndProc(ref m);
        }

第四种最原始的方法:

mousedown事件:改变一个bool变量

mousemove事件:先判断bool变量,移动时设置窗体的location

mouseup事件:改变bool变量

        bool mouse_down = false;//鼠标左键是否被按下
        Point mouse_start_point;//记录按下左键时的鼠标位置
        Point form_start_point;//记录按下左键时窗口位置
        private void Form1_Load(object sender, EventArgs e)
        {
            this.ControlBox = false;
            this.Text = "";

            this.MouseMove += Form1_MouseMove;
            this.MouseUp += Form1_MouseUp;
            this.MouseDown += Form1_MouseDown;
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                this.mouse_down = true;
                this.mouse_start_point = Control.MousePosition;
                this.form_start_point = this.Location;
            }
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            this.mouse_down = false;
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            if (this.mouse_down == true)
            {
                this.Location = new Point(this.form_start_point.X + PointToScreen(e.Location).X - this.mouse_start_point.X, this.form_start_point.Y + PointToScreen(e.Location).Y - this.mouse_start_point.Y);
            }
        }

标签:point,C#,void,标题栏,start,Form1,窗体,mouse
From: https://www.cnblogs.com/mayishangtaijie/p/18033110

相关文章

  • C# 根据坐标获取句柄
    C#根据坐标获取句柄//获取窗口标题[DllImport("user32",SetLastError=true)]publicstaticexternintGetWindowText(IntPtrhWnd,//窗口句柄StringBuilderlpString,//标题intnMaxCount//最大值);//获取类的名字[DllImport("user32.dll")]priv......
  • C# 理解Thread.Sleep()方法
    C#理解Thread.Sleep()方法转载:https://www.cnblogs.com/nzbbody/archive/2012/03/06/2381359.html我们可能经常会用到Thread.Sleep函数来使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:1、假设现在是2008-4-712:00:00.000,如果我调用一下......
  • docker使用btrfs存储驱动
    ubuntu22环境1.ddif=/dev/zeroof=btrfs.imgbs=1mcount=20002.losetup/dev/loop16btrfs.img3.aptinstallbtrfs-progs4.mkfs.btrfs-f/dev/loop165.mount-tbtrfs/dev/loop16/var/lib/docker6.root@nmx-virtual-machine:/home/nmx#df-TFilesystemType1K......
  • docker-compose更新镜像
    实现方式通过环境变量的方式实现,docker-compose.yaml文件中image段指定的镜像通过变量方式引入,以下是示例:docker-compose.yaml文件内容如下:version:'3'services:svc-new-pro:image:${SVC_NEW_PRO}environment:TZ:Asia/Shanghaiports:-"80......
  • Docker安装mariadb数据库与web管理工具phpmyadmin
    安装mariadb数据库获取指定版本的mariadb数据库docker镜像使用dockersearchmariadb搜索相关镜像;MacBook-Pro:~chenxiaolong$dockersearchmariadbNAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDmar......
  • Leetcode 560 和为k的子数组
    Problem:560.和为K的子数组难点怎么通过前缀和找到和为k的子数组如官方题解所言,[j···i]的子数组=k可转化为pre[i]-pre[j-1]==k要找到前缀和找到和为k的子数组个数就是“找到当前前缀和pre[i]-之前求得的前缀和=k”的总情况。我们通过哈希表记录每个前缀和(的值)出......
  • Part1: Overview of Diffusion Process
    本文将会概括性地介绍\(\textit{DiffusionProcess}\)算法与实践,主要参考论文《DenoisingDiffusionProbabilisticModels》。它的一些改进与优化,将“扩散方法”带入主流视野。而具体的数学推导部分,请参考其它系列文章。整个系列有相对完整的公式推导,若正文中有涉及到的省略部分......
  • Docker-常见报错和解决办法
    1、问题1: error:RPCfailed;result=18,HTTPcode=200MiB|181.00KiB/s##gitclonehttps://github.com/apache/doris.gitCloninginto'doris'...remote:Enumeratingobjects:505750,done.remote:Countingobjects:100%(30319/30319),done.remote:C......
  • 【国产化】禁止使用不安全的密码算法:DES、RC2,RSA(1024位及以下),MD5,SHA1
    一、引言随着互联网的普及和技术的发展,网络安全问题日益严重。密码算法作为网络安全的基石,其安全性直接关系到用户数据的安全。一些不安全的密码算法不断被曝光,给用户带来了极大的安全隐患。二、不安全的密码算法1.DESDES(DataEncryptionStandard)是一种对称加密算法,自1977年......
  • 本地启动RocketMQ未映射主机名产生的超时问题
    问题描述参考RocketMQ官方文档在本地启动一个验证环境的时候遇到超时报错问题。本地环境OS:CentOSLinuxrelease8.5.2111首先,进入到RocketMQ安装目录,如:~/opt/rocketmq-all-5.2.0-bin-release。执行如下命令启动NameServer:$shbin/mqnamesrv该命令执行很慢,但是最终还是显......