当前位置: 首页 > news >正文

C#下如何实现无标题可拖动窗口

http://hi.baidu.com/tclaaa/blog

C#下如何实现无标题可拖动窗口  

2011-03-05 01:21:22|  分类: C#winform |字号 订阅

 

在 Windows编程中,为了界面的美观,相信很多朋友都有过把Windows的Form的标题栏隐藏掉,然后自己做一个标题栏的经验。但是,隐藏掉标题栏 后的Form怎么拖动呢?大部份人的做法都是在MouseDown,MouseMove等事件中自己写代码进行处理,用代码随着鼠标的移动,一点点的移动 窗口。其实,还有一种比较简单的方法,就是以系统的身份向窗体发送一个消息,告诉窗体,你要开始移动啦,呵呵,下面,我们来看一看具体做法。

这个功能,我们用两个常用的API函数SendMessage和ReleaseCapture来实现,介绍一下这两个函数。
ReleaseCapture函数的作用是为当前的应用程序释放鼠标的捕获
SendMessage函数的作用是调用一个窗口的窗口函数,将一条消息命令发给那个窗口。需要注意的是,这里所说的窗口不是.Net中的窗体(Form),而是相当于.Net中的控件。当然,System.Windows.Forms.Form也是一个Control.

SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

hwnd,要接收消息的那个窗口的句柄
wMsg,消息的标识符
wParam,具体取决于发送的消息 
lParam,具体取决于发送的消息
首先,调用API函数,需添加System.Runtime.InteropServices命名空间的引用。

using System.Runtime.InteropServices;
然后,在程序中声明我们要用到的API函数及要用到的参数常量。

        [DllImport("user32")]
        private static extern bool ReleaseCapture();

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

        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0Xf010;
        public const int HTCAPTION = 0x0002;

其中,WM_SYSCOMMAND常量代表要向窗口发送消息,SC_MOVE常代表要向窗口发送移动的消息。
然后,接下来就很简单了。在Form的MouseDown事件中加入以下代码即可:

            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION,0);
这里,this.Handle代表当前Form的句柄。

细心的朋友可能会注意到我前面说一我句话:
需要注意的是,这里所说的窗口不是.Net中的窗体(Form),而是相当于.Net中的控件。当然,System.Windows.Forms.Form也是一个Control.这么说,这个方法是不是还可以用来移动Form以外的其它控件呢?答案是肯定的。

我们继续往Form里添加一个Button控件,Name为 MoveButton。然后,在Button的MouseDown事件中写入以下代码:

            ReleaseCapture();
            SendMessage(this.MoveButton.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
编译运行,这时我们会发现,鼠标在Form的标题栏以外的空白地方也可以拖动窗口了。而鼠标在Button控件中时,即可以拖动按钮。

 

完整代码如下:From MouseDown时调用DraggingForm_MouseDown

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

//命名空间的引用
using System.Runtime.InteropServices;

namespace DraggingForm
{
    public partial class DraggingForm : Form
    {
        public DraggingForm()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
        [DllImport("user32.dll")]
        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        public const int WM_SYSCOMMAND = 0x0112;
        public const int SC_MOVE = 0xF010;
        public const int HTCAPTION = 0x0002;
        private void DraggingForm_MouseDown(object sender, MouseEventArgs e)
        {
            ReleaseCapture();
            SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
        }
    }
}

转载于:https://www.cnblogs.com/vmyspace/archive/2011/12/29/2306261.html

相关文章:

  • 揭开sed和awk的秘密
  • 年终总结,新年展望
  • 【转】MFC隐藏进程自身(任务管理器不可见,wSysCheck等工具可见)
  • rcna
  • 如何想要在开机启动登陆时,用户名也不输入
  • 【分析总结】ASP.NET中的状态管理原理
  • 巧用单臂
  • cocos2d-x学习笔记番外篇01:地图滚动代码
  • 【hibernate系列】hibernate的n+1问题
  • 易宝php支付
  • 看不到的“因”
  • 使用WITH提高查询效率
  • css 视图结构
  • UltraEdit批量删除空行
  • border padding margin , the difference among them
  • 345-反转字符串中的元音字母
  • Android交互
  •  D - 粉碎叛乱F - 其他起义
  • ES6简单总结(搭配简单的讲解和小案例)
  • JAVA 学习IO流
  • k8s 面向应用开发者的基础命令
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Spring框架之我见(三)——IOC、AOP
  • Vue 重置组件到初始状态
  • 飞驰在Mesos的涡轮引擎上
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 批量截取pdf文件
  • 前嗅ForeSpider采集配置界面介绍
  • 深度解析利用ES6进行Promise封装总结
  • 树莓派 - 使用须知
  • 数据结构java版之冒泡排序及优化
  • 微信小程序开发问题汇总
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 湖北分布式智能数据采集方法有哪些?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #pragma pack(1)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序(布局、渲染层基础知识)
  • (11)MSP430F5529 定时器B
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)C#调用WebService 基础
  • (转)nsfocus-绿盟科技笔试题目
  • .NET大文件上传知识整理
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net中的Queue和Stack
  • ::before和::after 常见的用法
  • ??myeclipse+tomcat
  • @WebService和@WebMethod注解的用法
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [Android]使用Retrofit进行网络请求
  • [BZOJ] 3262: 陌上花开