窗体标题栏外的拖动操作

窗体标题栏外的拖动操作

(作者:张均洪) 2004-9-3

我们知道对窗体的拖动只需要点住标题栏,拖动鼠标就可以了.但有些时候我们想在窗体的标题栏外的区域实行拖动窗体的操作.这时就要需要我们自已写些代码了,下面是我的做法,供大家参观.

新建一个窗体FORM1,并放入两个RADIOBUTTON控件,第一个是确定是否窗体拖动,第三个是确定是否指定某一区域进行窗体拖动.

以下是窗体代码:

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

namespace WindowsApplication1
{
partial class Form1 : Form
{
Point _StartXY; //鼠标按下的位置
bool _MoveDown=false; //鼠标是不是按下了
//指定一个区域,好写字在ONPAINT中
Rectangle _rec = new Rectangle(50, 50, 70, 70);
public Form1()
{
InitializeComponent();
}

protected override void OnMouseDown(MouseEventArgs e)
{
//要移动吗?由按下鼠标(onMouseDown)确定哈
bool OktoMove=false;
base.OnMouseDown(e);

if(this.radioButton1.Checked)
{
OktoMove=true;
}
else
{
//如果按下鼠标的点坐标在_rec指定的区域内
//那么我们同意移动窗体操作哈。
if(this._rec.Contains(this.PointToClient(MousePosition)))
{
OktoMove = true;

}
}
//如果同意移动,就把按下鼠标一瞬的坐标给_StartXY
//并同意按着鼠标移动。
if(OktoMove==true)
{
//把当前的鼠标位置赋给变量
_StartXY = MousePosition;
_MoveDown = true;
}
}

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
//如果同意按着鼠标移动,就把移动的量给变量
//以便窗体按你的量移动。
if (_MoveDown)
{
int Xdiff,Ydiff;
Xdiff = MousePosition.X - _StartXY.X;
Ydiff = MousePosition.Y - _StartXY.Y;
//改变窗体位置
this.Left = this.Left + Xdiff;
this.Top = this.Top + Ydiff;
//把新位置给_StartXY变量了哈
_StartXY = MousePosition;
}
}

protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
_MoveDown = false;

}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//要一支新画笔,向NET要哈
SolidBrush b = new SolidBrush(Color.Red);
if (radioButton2.Checked)
{
//填充_rec的区域,笔的颜色是红的哈
e.Graphics.FillRectangle(b, _rec);
//改变笔的颜色
b.Color = Color.White;
//重新定义一个区域,这个区域其实就是_rec变量的区域
RectangleF recF = new RectangleF(_rec.X,
_rec.Y,
_rec.Width,
_rec.Height);
//在这个区域写几个字呢
e.Graphics.DrawString("click on me drag", Font, b, recF);
}
else
{
//如果不同意用区域改变窗体位置,就把背景设为窗体的
//颜色,免得影响视觉。
b.Color = BackColor;
//把这个区域涂了
e.Graphics.FillRectangle(b, _rec);
}
b.Dispose();//把笔丢了,免得占我地方
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
this.Invalidate(this._rec);//使_rec指定的地方无效了
}

}
}

时间: 2024-10-04 14:45:18

窗体标题栏外的拖动操作的相关文章

无标题栏对话框的拖动

很多基于对话框的应用程序都是不带框架的,也就是说对话框没有标题栏.众所周知,窗口的移动都是通过鼠标点住标题栏拖动窗口实现的,那么现在没有了标题栏,如何移动对话框呢?本文拟针对这个问题提出解决的办法. 解决这个问题有两种方案.一种很业余,另外一种比较专业.前者使用一种常规思路处理鼠标拖拽事件.当窗口获得WM_LBUTTONDOWN(OnLButtonDown)时,通过设置标志并调用SetCapture控制鼠标使应用程序进入移动模式.进入移动模式之后,只要有WM_MOUSEMOVE消息过来,就可以据

再谈客户区对话框拖动操作

<无标题对话框的拖动>,示范了如何用鼠标点击窗口或对话框背景(即客户区)进行拖动操作,文章中提供的解决方法在没有上下文菜单的情况下运行很正常,一旦有上下文菜单时,文中所提供的方法便显现出了缺陷--上下文菜单无法显示出来.本文将针对这个问题对前一篇提出的方法进行改进. 当初实现拖动的基本思路是改写 OnNcHitTest 例程,让鼠标在客户区中的点击始终返回 HTCAPTION 而不是 HTCLIENT,从而诱使 Windows 实现拖动操作.没想到这样做使上下文菜单的操作出现了混乱,原因是如果

关于简单拖动操作的交互思考

一个非常简单的题目:设计一个交互方式,把一个图标从A处移动到B处. 通常最直接的方式是在A处用鼠标左键按住图标 ,然后移动到B处松开.好了,就是这样一个简单的交互操作. 这里面其实有很多问题需要考虑周全,才能让一个简单的拖动给人感觉从容流畅,让用户毫无障碍的去完成他的目标,仅仅是一个简单拖动操作. 简单列举一下用户可能会遇到的问题: 用户可能不知道这个图标可以拖动 用户拖动了图标不知道B处可以放下图标就会停留在B处 用户在拖动的过程中会担心是不是半路这个图标就掉了 用户的鼠标不太好用 AB两个位

修改窗体非客户区大小更改窗体标题栏高度

想修改窗体的非客户区,首先就得明白为什么要修改非客户区,什么是非客户区 从窗体或控件来看,非客户区就是无法放置控件的区域,比如窗体的标题栏,和边框,菜单栏也是非客户区,菜单栏不是控件是画上去的 文本框的边框,滚动条区域都是非客户区 为什么要修改非客户区呢?? 原因是为了自绘,让边框好看一些,比如要加高窗体标题栏,就需要改非客户区,自绘非客户区会响应 WM_NCPAINT消息 在这个消息里,你可以进行窗体,控件,非客户区的自绘 好啦,现在转入正题,要修改非客户大小,必须处理 WM_NCCALCSI

浅谈博客外链的操作

博客外链一直处于争议中,有些"高手"们说博客外链被隐权了或者没有用了,其实不然,博客外链到目前为止还是非常有用的,在百度里domian一些比较有权重的网站就知道,domian出来的反向链接中,博客外链基本上都有,而且搜出来的博客外链也是排在前面,权重都比较高.这已可以说明博客外链还是非常有用的,也是必须做的,这里浅谈几点博客外链接的操作. 一.广泛的博客外链做法.这种博客外链,用免费的博客来做,其一是免费;其二可以大量生产;其三本身就具有一定权重;其四可以借助博客营销软件来操作.这种博

python模拟鼠标拖动操作的方法_python

本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧,我可以喝点水,休息一下了 1. Python代码 复制代码 代码如下: # # _*_ coding:UTF-8 _*_ __author__ = 'wp' import win32api import win32con import win32gui from ctypes import * i

窗体 标题栏上加个图片

问题描述 窗体 标题栏上加个图片 解决方案 http://blog.sina.com.cn/s/blog_631611220100j1j5.html 解决方案二: 响应WM_NCPAINT消息,用BitBlt()之类的的函数把图贴上去. 解决方案三: 右键点击窗体属性,在Icon属性可以自定义图片 解决方案四: 设置属性background

用showDialog打开了一个模式窗体,但为什么我在该模式窗体中做了一个操作后并没有主动关闭或者隐藏该窗体,但是它却主动关闭了该模式窗体,回到了调用它的主窗体

问题描述 用showDialog打开了一个模式窗体,但为什么我在该模式窗体中做了一个操作后并没有主动关闭或者隐藏该窗体,但是它却主动关闭了该模式窗体,回到了调用它的主窗体,为什么?简单介绍一下我的代码:FormMain主窗体FormInfo要打开的模式窗体FormMain主窗体里的代码:一个buttun按钮事件:FormInfof=FormInfo();f.showDialog();FormInfo要打开的模式窗体代码:当我信息填写完以后,点击提交按钮,可是有的信息验证没有通过,这时我就希望能停

使用DOTNETBAR控件, 想实现DATAGRIDVIEWX数据往advTree的节点上的拖动操作

问题描述 如题,在使用DOTNETBAR控件时,想实现DATAGRIDVIEWX数据往advTree的节点上的拖动操作,拖动到advTree控件上后,如何选定节点? 解决方案 解决方案二:没人来吗~自己顶下,有实例最好~