首页 > 其他分享 >Winform无边框窗体实现拖动

Winform无边框窗体实现拖动

时间:2023-09-03 16:45:41浏览次数:28  
标签:IntPtr 拖动 边框 int 窗体 Location Winform

winfrom窗体自带的边框不好看,可以将FormBorderStyle设置为None去除边框,但这样窗体无法拖动

下面记录无边框窗体拖动的几种方法[参考其他博主的]:

1.Form触发MouseDown事件时,记录鼠标坐标:

rawPoint = e.Location;

MouseMove时根据鼠标坐标的移动偏移量,设置窗体位置同步变化:

void Form1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button != System.Windows.Forms.MouseButtons.Left)
        return;
    int x = e.X - rawPoint.X;
    int y = e.Y - rawPoint.Y;
    this.Location = new Point(this.Location.X + x, this.Location.Y + y);
}

2.Form上方放置控件(如Label)来模拟边框,通过控件的MouseDown和MouseMove事件来实现,同方法1;

3.调用win32 api,Form的MoveDown触发时,向系统发送鼠标点击窗体非客户区的消息(模拟点击窗体边框):

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

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

private const int LeftButtonDown = 0xA1;
private const int HTCaption = 0x02;

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    ReleaseCapture();
    SendMessage((IntPtr)this.Handle, LeftButtonDown, HTCaption, 0);
}

4.重写WndProc函数,拦截鼠标左击窗体的消息,改为左击窗体的非客户区:

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case 0x0201:
            {
                m.Msg = 0xA1;
                m.WParam = new IntPtr(2);
                m.LParam = new IntPtr(0);
            }
            break;
    }
    base.WndProc(ref m);
}

以上方式均可实现窗体拖动。

 

  

 

  

 

标签:IntPtr,拖动,边框,int,窗体,Location,Winform
From: https://www.cnblogs.com/cfsl/p/17675151.html

相关文章

  • Winform实现验证码功能
    介绍下Winform实现验证码的步骤:首先拖入控件:PictureBox显示验证码;TextBox输入验证码;Check按钮;Label标签-点击更换验证码;1.随机产生一个4位的字符串,由数字,大小写字母组成:stringRandomCode(){stringretCode="";for(inti=0;i<4;i++){while......
  • winform,c#左链接查询两张表或多张表,数据库正常,但是发现查出来的同一条记录变成了好几
    这个样子就是犯了笛卡尔积,我有两张表那我自己项目来说一下吧:a表的内容如下: b表的内容如下: 到这里,你会发现,又五六个字段内容是一模一样的,该字段两张表都用,那么查询出来数据翻倍就很好解决了在where后面加上a.字段1=b.字段1and......anda.字段n=b.字段n就可以了......
  • WPF 动态更改启动窗体startupUri
    第一步:在App.xaml里,把StartupUri=""去掉,改成Startup="Application_Startup"第二步:在App.xaml.cs里,增加Application_Startup事件:privatevoidApplication_Startup(objectsender,StartupEventArgse){ApplicationcurrApp=Application.Current;currAp......
  • Vue【原创】可拖动列表 darg-list
    可拖动排序的列表drag-list,这个比较简单易懂,拿例子直接运行看效果就好了。组件代码:1<template>2<ulclass="list"ref="parentNode"@dragstart="onDragStart"@dragover="onDragOver"@dragend="onDragEnd">3<......
  • 鼠标任意拖动元素排列顺序(vue)
    参考地址:https://codesandbox.io/s/condescending-butterfly-enjqpr?file=/src/App.vue <template><div><transition-groupname="drag"class="list"tag="ul"><li@dragstart="dragStart(......
  • Winform微信扫码支付
    微信扫码支付引用的是第三方的:Senparc.Weixin引用:usingSenparc.Weixin.MP.TenPayLibV3;首先,在Form_Load里面调用生成支付二维码的方法:///<summary>///Form_Load事件///</summary>///<paramname="sender"></param>///<......
  • c# WinForm--微信Native支付
    c#WinForm--微信Native支付 一、了解Native支付流程我用的是模式二,模式二的流程如下二、如何将Demo用在我的WinForm里面打开Demo工程,复制里面的lib、third文件夹到我的工程下,添加引用,引用的内容就是third文件夹里的。还有Demo里面的business文件夹,里面的代码可以参考(复......
  • 【C#】【Windows 窗体应用】TextBox 的多行实现换行
    1.设置TextBox空间允许多行: this.textBox1.Multiline=true;  2.换行字符是使用"\r\n"。1textBox1.Text+="第0行\r\n";2textBox1.Text+="第1行\r\n";3textBox1.Text+="第2行\r\n";4textBox1.Text+="第3行\r\n";5......
  • WPF-利用装饰器实现空间的自由拖动
    在项目中经常会遇到类似如下要求的需求,创建允许自由拖动的控件,这样的需求可以使用WPF的装饰器Adorner来实现。 一、什么是装饰器?装饰器是一种特殊类型的FrameworkElement,装饰器始终呈现在被装饰元素的顶部,用于向用户提供可视化提示。装饰器可以在不改变原有控件结构的基......
  • WinForm微信扫码登录
    源码还需优化,不喜勿喷。微信官方文档: https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html前期准备:1.微信开放平台开发者资质认证  https://open.weixin.qq.com/  费用300大概1-2天时间 2.创建网站应用,需要已备案域名、......