C#实现GDI+基本图的缩放、拖拽、移动
C#实现GDI+基本图的缩放、拖拽、移动示例代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace ResizableControls
{
public partial class MainForm : Form
{
/// <summary>
/// 有关鼠标样式的相关枚举
/// </summary>
private enum EnumMousePointPosition
{
MouseSizeNone = 0, //无
MouseSizeRight = 1, //拉伸右边框
MouseSizeLeft = 2, //拉伸左边框
MouseSizeBottom = 3, //拉伸下边框
MouseSizeTop = 4, //拉伸上边框
MouseSizeTopLeft = 5,//拉伸左上角
MouseSizeTopRight = 6,//拉伸右上角
MouseSizeBottomLeft = 7,//拉伸左下角
MouseSizeBottomRight = 8,//拉伸右下角
MouseDrag = 9 //鼠标拖动
}
const int Band = 5;//范围半径
const int MinWidth = 10;//最低宽度
const int MinHeight = 10;//最低高度
private EnumMousePointPosition m_MousePointPosition; //鼠标样式枚举
private Point m_lastPoint; //光标上次移动的位置
private Point m_endPoint; //光标移动的当前位置
public MainForm()
{
InitializeComponent();
//窗体中控件的事件晚期绑定
for (int i = 0; i < this.Controls.Count; i++)
{
this.Controls[i].MouseDown += new MouseEventHandler(MyMouseDown);
this.Controls[i].MouseLeave += new EventHandler(MyMouseLeave);
this.Controls[i].MouseMove += new MouseEventHandler(MyMouseMove);
}
}
//鼠标按下事件
private void MyMouseDown(object sender,MouseEventArgs e)
{
m_lastPoint.X = e.X;
m_lastPoint.Y = e.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y;
}
//鼠标离开控件的事件
private void MyMouseLeave(object sender, System.EventArgs e)
{
m_MousePointPosition = EnumMousePointPosition.MouseSizeNone;
this.Cursor = Cursors.Arrow;
} //鼠标移过控件的事件
private void MyMouseMove(object sender, MouseEventArgs e)
{
Control lCtrl = (sender as Control);//获得事件源
//左键按下移动
if (e.Button == MouseButtons.Left)
{
switch (m_MousePointPosition)
{
case EnumMousePointPosition.MouseDrag:
lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
lCtrl.Top = lCtrl.Top + e.Y - m_lastPoint.Y;
break;
case EnumMousePointPosition.MouseSizeBottom:
lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y; //记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeBottomRight:
lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;
lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y; //记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeRight:
lCtrl.Width = lCtrl.Width + e.X - m_endPoint.X;
//lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y; //记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTop:
lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
break;
case EnumMousePointPosition.MouseSizeLeft:
lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
lCtrl.Height = lCtrl.Height + e.Y - m_endPoint.Y;
m_endPoint.X = e.X;
m_endPoint.Y = e.Y; //记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTopRight:
lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
lCtrl.Width = lCtrl.Width + (e.X - m_endPoint.X);
lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
m_endPoint.X = e.X;
m_endPoint.Y = e.Y; //记录光标拖动的当前点
break;
case EnumMousePointPosition.MouseSizeTopLeft:
lCtrl.Left = lCtrl.Left + e.X - m_lastPoint.X;
lCtrl.Top = lCtrl.Top + (e.Y - m_lastPoint.Y);
lCtrl.Width = lCtrl.Width - (e.X - m_lastPoint.X);
lCtrl.Height = lCtrl.Height - (e.Y - m_lastPoint.Y);
break;
default:
break;
}
if (lCtrl.Width < MinWidth) lCtrl.Width = MinWidth;
if (lCtrl.Height < MinHeight) lCtrl.Height = MinHeight;
}
else
{
//'判断光标的位置状态
m_MousePointPosition = MousePointPosition(lCtrl.Size, e);
switch (m_MousePointPosition) //改变光标
{
case EnumMousePointPosition.MouseSizeNone:
this.Cursor = Cursors.Arrow;//箭头
break;
case EnumMousePointPosition.MouseDrag:
this.Cursor = Cursors.SizeAll;//四方向
break;
case EnumMousePointPosition.MouseSizeBottom:
this.Cursor = Cursors.SizeNS;//南北
break;
case EnumMousePointPosition.MouseSizeTop:
this.Cursor = Cursors.SizeNS;//南北
break;
case EnumMousePointPosition.MouseSizeLeft:
this.Cursor = Cursors.SizeWE;//东西
break;
case EnumMousePointPosition.MouseSizeRight:
this.Cursor = Cursors.SizeWE;//东西
break;
case EnumMousePointPosition.MouseSizeBottomLeft:
this.Cursor = Cursors.SizeNESW;//东北到南西
break;
case EnumMousePointPosition.MouseSizeBottomRight:
this.Cursor = Cursors.SizeNWSE;//东南到西北
break;
case EnumMousePointPosition.MouseSizeTopLeft:
this.Cursor = Cursors.SizeNWSE;//东南到西北
break;
case EnumMousePointPosition.MouseSizeTopRight:
this.Cursor = Cursors.SizeNESW;//东北到南西
break;
default:
break;
}
}
}
//坐标位置判定
private EnumMousePointPosition MousePointPosition(Size size, System.Windows.Forms.MouseEventArgs e)
{
if ((e.X >= -1 * Band) | (e.X <= size.Width) |
(e.Y >= -1 * Band) | (e.Y <= size.Height))
{
if (e.X < Band)
{
if (e.Y < Band)
{
return EnumMousePointPosition.MouseSizeTopLeft;
}
else
{
if (e.Y > -1 * Band + size.Height)
{
return EnumMousePointPosition.MouseSizeBottomLeft;
}
else
{
return EnumMousePointPosition.MouseSizeLeft;
}
}
}
else
{
if (e.X > -1 * Band + size.Width)
{
if (e.Y < Band)
{ return EnumMousePointPosition.MouseSizeTopRight; }
else
{
if (e.Y > -1 * Band + size.Height)
{ return EnumMousePointPosition.MouseSizeBottomRight; }
else
{ return EnumMousePointPosition.MouseSizeRight; }
}
}
else
{
if (e.Y < Band)
{ return EnumMousePointPosition.MouseSizeTop; }
else
{
if (e.Y > -1 * Band + size.Height)
{ return EnumMousePointPosition.MouseSizeBottom; }
else
{ return EnumMousePointPosition.MouseDrag; }
}
}
}
}
else
{ return EnumMousePointPosition.MouseSizeNone; }
}
}
}
C#实现GDI+基本图的缩放、拖拽、移动的更多相关文章
- wpf图片查看器,支持鼠标滚动缩放拖拽
最近项目需要,要用到一个图片查看器,类似于windows自带的图片查看器那样,鼠标滚动可以缩放,可以拖拽图片,于是就写了这个简单的图片查看器. 前台代码: <Window x:Class=&qu ...
- svg图片的缩放拖拽
svg是一种不错的矢量图,有时候我们会使用这样的图片来作为展示图,因为它不会因为放大缩小而失真. 好了,不扯淡了,废话少说,直入主题吧. 首先确定你是要深入学习还是要简单的把遇到的小任务解决一下,以后 ...
- 【Android】HorizontalScrollView内子控件横向拖拽
前言 网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园 ...
- C#pictureBox滚轮缩放与拖拽
[转载]C#pictureBox滚轮缩放与拖拽 [转载]C#中图像平移.缩放的实现技巧 [转载]c# 通过鼠标拖动.放大图片,GDI绘图通过鼠标拖动.放大
- Qt拖拽界面 (*.ui) 缩放问题及解决办法
问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...
- Winform图片拖拽与缩放
最近做项目的时候遇到上传施工平面布置图,查看,因为图片比较大,一般的显示器分辨率无法显示全,然后还需要放大看清楚图片里面的文字内容,所以需要用到图片的拖拽与缩放功能.这里整理下具体操作. 首先新建一个 ...
- Qt拖拽界面 (*.ui) 缩放问题及解决办法(在最顶层放一个Layout)
问题 使用Qt Designer 设计的界面,在缩放的时候不能随着主窗口一起缩放. 解决办法 之前遇到这个问题的时候,都是直接重写resizeEvent接口来实现的,在自动生成的Ui_Widget或U ...
- 缩放系列(三):一个可以手势缩放、拖拽、旋转的layout
弄了一个下午,终于搞出来了,PowerfulLayout 下面是一个功能强大的改造的例子: 可以实现以下需求: 1.两个手指进行缩放布局 2.所有子控件也随着缩放, 3.子控件该有的功能不能丢失(像b ...
- js手写图片查看器(图片的缩放、旋转、拖拽)
在做一次代码编辑任务中,要查看图片器.在时间允许的条件下,放弃了已经封装好的图片jq插件,现在自己手写js实现图片的缩放.旋转.推拽功能! 具体代码如下: <!DOCTYPE html> ...
随机推荐
- rJava配置
1. 下载安装R-3.1.1-win.exe: 2. 在R中安装rJava > install.packages("rJava") 3. 设置环境变量: PATH:D:\So ...
- Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp
题目链接: 题目 A. Reberland Linguistics time limit per test:1 second memory limit per test:256 megabytes 问 ...
- uoj 67 新年的毒瘤 割点
题目链接: 题目 #67. 新年的毒瘤 问题描述 辞旧迎新之际,喜羊羊正在打理羊村的绿化带,然后他发现了一棵长着毒瘤的树. 这个长着毒瘤的树可以用 nn 个结点 mm 条无向边的无向图表示.这个图中有 ...
- 前端MVC学习——模块发开发、seajs学习
这份学习链接已经足够了:http://seajs.org/docs/#intro 我假设你至少已经浏览过上述链接文档.并且掌握了基本的seajs基础知识~ 手把手教你创建helloworld~ Hel ...
- ios开发之网络访问的数据类型
1> JSON 特点:1. [ ] 表示数组 {} 表示字典 - 对象模型建立关系 2. 应用非常多,基本上移动开发的主要数据传输都是JSON 要使用JSON,从网络上获取到数据data后,直 ...
- 【WCF--初入江湖】08 并发与实例模式
08 并发与实例模式 1. 实例上下文模式 一个服务代理:servicePoxy ChannelFactory<IService1> factoryservicel = new Cha ...
- Mac OS X 快捷键(完整篇) 转载
转载自:http://www.nooidea.com/2011/01/mac-os-x-keyboard-shortcuts.html 快捷键是通过按下键盘上的组合键来调用 Mac OS X 功能的一 ...
- poj 2253 Frogger (最短路变种,连通图的最长边)
题目 这里的dijsktra的变种代码是我看着自己打的,终于把代码和做法思路联系上了,也就是理解了算法——看来手跟着画一遍真的有助于理解. #define _CRT_SECURE_NO_WARNING ...
- HTTP 408请求超时错误解决办法
错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...
- Android学习及开发随记1:Android Studio安装配置
1.本系列仅为个人使用,概不负责.随着时间推移,部分内容可能因为软件更新而出现不能对应的情况. 本文的配置情况,仅针对Android Studio v1.1.0 windows版本 全新安装. Goo ...