WinForm 无边框窗体 拖动工作区移动窗体

 

WinForm 无边框窗体 拖动工作区移动窗体

分类: C# WinForm 280人阅读 评论(1) 收藏 举报

方案1 通过重载消息处理实现。重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了,不用声明api函数。

鼠标的拖动只对窗体本身有效,不能在窗体上的控件区域点击拖动

  1. protected override void WndProc(ref Message m)  
  2.         {  
  3.             base.WndProc(ref m);  
  4.             if (m.Msg == 0x84)  
  5.             {  
  6.                 switch (m.Result.ToInt32())  
  7.                 {  
  8.                     case 1:  
  9.                         m.Result = new IntPtr(2);  
  10.                         break;  
  11.                 }  
  12.             }  
  13.         }  

方案2 调用非托管的动态链接库,通过控件的鼠标按下事件(MouseDown)发送一个拖动的消息,可以给控件添加MouseDown事件后,拖动这个控件来移动窗体

  1. using System.Runtime.InteropServices;  
  2. [DllImport("User32.DLL")]  
  3. public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);  
  4. [DllImport("User32.DLL")]  
  5. public static extern bool ReleaseCapture();  
  6. public const uint WM_SYSCOMMAND = 0x0112;  
  7. public const int SC_MOVE = 61456;  
  8. public const int HTCAPTION = 2;  
  9. private void Form1_MouseDown(object sender, MouseEventArgs e)  
  10. {  
  11.     ReleaseCapture();  
  12.     SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);  
  13. }  

方案3 直接在控件上写事件,朋友的是一个PictureBox 停靠在主窗体,然后主窗体设置的无边框,用的是这中方法

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Text;  
  7. using System.Windows.Forms;  
  8. namespace TestShow  
  9. {  
  10.     public partial class Form1 : Form  
  11.     {  
  12.         public Form1()  
  13.         {  
  14.             InitializeComponent();  
  15.         }  
  16.         Point downPoint;  
  17.         private void pictureBox1_MouseDown(object sender, MouseEventArgs e)  
  18.         {  
  19.             downPoint = new Point(e.X, e.Y);  
  20.         }  
  21.         private void pictureBox1_MouseMove(object sender, MouseEventArgs e)  
  22.         {  
  23.             if (e.Button == MouseButtons.Left)  
  24.             {  
  25.                 this.Location = new Point(this.Location.X + e.X - downPoint.X,  
  26.                     this.Location.Y + e.Y - downPoint.Y);  
  27.             }  
  28.         }  
  29.     }  
  30. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值