C#自定义大小与改变大下的方法
在用VS的窗体设计器时,我们可以发现控件都是可以拖动的,并且还可以调整大小。怎么在自己的程序中可以使用上述功能呢? 下面的方法值得借鉴!
- using System;
- using System.Windows.Forms;
- using System.Drawing;
- namespace ControlSizeChangeEx
- {
- /// <summary>
- /// This class implements sizing and moving functions for
- /// runtime editing of graphic controls
- /// </summary>
- public class PickBox
- {
- //////////////////////////////////////////////////////////////////
- // PRIVATE CONSTANTS AND VARIABLES
- //////////////////////////////////////////////////////////////////
- private const int BOX_SIZE = 8;
- private Color BOX_COLOR = Color.White;
- private ContainerControl m_container;
- private Control m_control;
- private Label[] lbl = new Label[8];
- private int startl;
- private int startt;
- private int startw;
- private int starth;
- private int startx;
- private int starty;
- private bool dragging;
- private Cursor[] arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,
- Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,
- Cursors.SizeNESW, Cursors.SizeWE};
- private Cursor oldCursor;
- private const int MIN_SIZE = 20;
- //
- // Constructor creates 8 sizing handles & wires mouse events
- // to each that implement sizing functions
- //
- public PickBox()
- {
- for (int i = 0; i < 8; i++)
- {
- lbl[i] = new Label();
- lbl[i].TabIndex = i;
- lbl[i].FlatStyle = 0;
- lbl[i].BorderStyle = BorderStyle.FixedSingle;
- lbl[i].BackColor = BOX_COLOR;
- lbl[i].Cursor = arrArrow[i];
- lbl[i].Text = "";
- lbl[i].BringToFront();
- lbl[i].MouseDown += new MouseEventHandler(this.lbl_MouseDown);
- lbl[i].MouseMove += new MouseEventHandler(this.lbl_MouseMove);
- lbl[i].MouseUp += new MouseEventHandler(this.lbl_MouseUp);
- }
- }
- //////////////////////////////////////////////////////////////////
- // PUBLIC METHODS
- //////////////////////////////////////////////////////////////////
- //
- // Wires a Click event handler to the passed Control
- // that attaches a pick box to the control when it is clicked
- //
- public void WireControl(Control ctl)
- {
- ctl.Click += new EventHandler(this.SelectControl);
- }
- /////////////////////////////////////////////////////////////////
- // PRIVATE METHODS
- /////////////////////////////////////////////////////////////////
- //
- // Attaches a pick box to the sender Control
- //
- private void SelectControl(object sender, EventArgs e)
- {
- if (m_control is Control)
- {
- m_control.Cursor = oldCursor;
- //Remove event any pre-existing event handlers appended by this class
- m_control.MouseDown -= new MouseEventHandler(this.ctl_MouseDown);
- m_control.MouseMove -= new MouseEventHandler(this.ctl_MouseMove);
- m_control.MouseUp -= new MouseEventHandler(this.ctl_MouseUp);
- m_control = null;
- }
- m_control = (Control)sender;
- //Add event handlers for moving the selected control around
- m_control.MouseDown += new MouseEventHandler(this.ctl_MouseDown);
- m_control.MouseMove += new MouseEventHandler(this.ctl_MouseMove);
- m_control.MouseUp += new MouseEventHandler(this.ctl_MouseUp);
- //Add sizing handles to Control's <a href="http://lib.csdn.net/base/docker" class='replace_word' title="Docker知识库" target='_blank' style='color:#df3434; font-weight:bold;'>Container</a> (Form or PictureBox)
- for (int i = 0; i < 8; i++)
- {
- m_control.Parent.Controls.Add(lbl[i]);
- lbl[i].BringToFront();
- }
- //Position sizing handles around Control
- MoveHandles();
- //Display sizing handles
- ShowHandles();
- oldCursor = m_control.Cursor;
- m_control.Cursor = Cursors.SizeAll;
- }
- public void Remove()
- {
- HideHandles();
- m_control.Cursor = oldCursor;
- }
- private void ShowHandles()
- {
- if (m_control != null)
- {
- for (int i = 0; i < 8; i++)
- {
- lbl[i].Visible = true;
- }
- }
- }
- private void HideHandles()
- {
- for (int i = 0; i < 8; i++)
- {
- lbl[i].Visible = false;
- }
- }
- private void MoveHandles()
- {
- int sX = m_control.Left - BOX_SIZE;
- int sY = m_control.Top - BOX_SIZE;
- int sW = m_control.Width + BOX_SIZE;
- int sH = m_control.Height + BOX_SIZE;
- int hB = BOX_SIZE / 2;
- int[] arrPosX = new int[] {sX+hB, sX + sW / 2, sX + sW-hB, sX + sW-hB,
- sX + sW-hB, sX + sW / 2, sX+hB, sX+hB};
- int[] arrPosY = new int[] {sY+hB, sY+hB, sY+hB, sY + sH / 2, sY + sH-hB,
- sY + sH-hB, sY + sH-hB, sY + sH / 2};
- for (int i = 0; i < 8; i++)
- lbl[i].SetBounds(arrPosX[i], arrPosY[i], BOX_SIZE, BOX_SIZE);
- }
- /////////////////////////////////////////////////////////////////
- // MOUSE EVENTS THAT IMPLEMENT SIZING OF THE PICKED CONTROL
- /////////////////////////////////////////////////////////////////
- //
- // Store control position and size when mouse button pushed over
- // any sizing handle
- //
- private void lbl_MouseDown(object sender, MouseEventArgs e)
- {
- dragging = true;
- startl = m_control.Left;
- startt = m_control.Top;
- startw = m_control.Width;
- starth = m_control.Height;
- HideHandles();
- }
- //
- // Size the picked control in accordance with sizing handle being dragged
- // 0 1 2
- // 7 3
- // 6 5 4
- //
- private void lbl_MouseMove(object sender, MouseEventArgs e)
- {
- int l = m_control.Left;
- int w = m_control.Width;
- int t = m_control.Top;
- int h = m_control.Height;
- if (dragging)
- {
- switch (((Label)sender).TabIndex)
- {
- case 0: // Dragging top-left sizing box
- l = startl + e.X < startl + startw - MIN_SIZE ? startl + e.X : startl + startw - MIN_SIZE;
- t = startt + e.Y < startt + starth - MIN_SIZE ? startt + e.Y : startt + starth - MIN_SIZE;
- w = startl + startw - m_control.Left;
- h = startt + starth - m_control.Top;
- break;
- case 1: // Dragging top-center sizing box
- t = startt + e.Y < startt + starth - MIN_SIZE ? startt + e.Y : startt + starth - MIN_SIZE;
- h = startt + starth - m_control.Top;
- break;
- case 2: // Dragging top-right sizing box
- w = startw + e.X > MIN_SIZE ? startw + e.X : MIN_SIZE;
- t = startt + e.Y < startt + starth - MIN_SIZE ? startt + e.Y : startt + starth - MIN_SIZE;
- h = startt + starth - m_control.Top;
- break;
- case 3: // Dragging right-middle sizing box
- w = startw + e.X > MIN_SIZE ? startw + e.X : MIN_SIZE;
- break;
- case 4: // Dragging right-bottom sizing box
- w = startw + e.X > MIN_SIZE ? startw + e.X : MIN_SIZE;
- h = starth + e.Y > MIN_SIZE ? starth + e.Y : MIN_SIZE;
- break;
- case 5: // Dragging center-bottom sizing box
- h = starth + e.Y > MIN_SIZE ? starth + e.Y : MIN_SIZE;
- break;
- case 6: // Dragging left-bottom sizing box
- l = startl + e.X < startl + startw - MIN_SIZE ? startl + e.X : startl + startw - MIN_SIZE;
- w = startl + startw - m_control.Left;
- h = starth + e.Y > MIN_SIZE ? starth + e.Y : MIN_SIZE;
- break;
- case 7: // Dragging left-middle sizing box
- l = startl + e.X < startl + startw - MIN_SIZE ? startl + e.X : startl + startw - MIN_SIZE;
- w = startl + startw - m_control.Left;
- break;
- }
- l = (l < 0) ? 0 : l;
- t = (t < 0) ? 0 : t;
- m_control.SetBounds(l, t, w, h);
- }
- }
- //
- // Display sizing handles around picked control once sizing has completed
- //
- private void lbl_MouseUp(object sender, MouseEventArgs e)
- {
- dragging = false;
- MoveHandles();
- ShowHandles();
- }
- /////////////////////////////////////////////////////////////////
- // MOUSE EVENTS THAT MOVE THE PICKED CONTROL AROUND THE FORM
- /////////////////////////////////////////////////////////////////
- //
- // Get mouse pointer starting position on mouse down and hide sizing handles
- //
- private void ctl_MouseDown(object sender, MouseEventArgs e)
- {
- dragging = true;
- startx = e.X;
- starty = e.Y;
- HideHandles();
- }
- //
- // Reposition the dragged control
- //
- private void ctl_MouseMove(object sender, MouseEventArgs e)
- {
- if (dragging)
- {
- int l = m_control.Left + e.X - startx;
- int t = m_control.Top + e.Y - starty;
- int w = m_control.Width;
- int h = m_control.Height;
- l = (l < 0) ? 0 : ((l + w > m_control.Parent.ClientRectangle.Width) ?
- m_control.Parent.ClientRectangle.Width - w : l);
- t = (t < 0) ? 0 : ((t + h > m_control.Parent.ClientRectangle.Height) ?
- m_control.Parent.ClientRectangle.Height - h : t);
- m_control.Left = l;
- m_control.Top = t;
- }
- }
- //
- // Display sizing handles around picked control once dragging has completed
- //
- private void ctl_MouseUp(object sender, MouseEventArgs e)
- {
- dragging = false;
- MoveHandles();
- ShowHandles();
- }
- }
- }
创建一个PickBox对象 , 调用此对象的WireControl(你希望改变的控件);方法就行了。
C#自定义大小与改变大下的方法的更多相关文章
- 【转】C# 控件的自定义拖动、改变大小方法
在用VS的窗体设计器时,我们可以发现控件都是可以拖动的,并且还可以调整大小.怎么在自己的程序中可以使用上述功能呢? 下面的方法值得借鉴! using System; using System.Wind ...
- UILabletext去掉乱码 控制颜色 行高 自定义大小 。显示不同的字体颜色、字体大小、行间距、首行缩进、下划线等属性(NSMutableAttributedString)
text去掉乱码 设置不同颜色 行高 自定义大小 #import <Foundation/Foundation.h> @interface TextsForRow : NSObject @ ...
- C# 控件的自定义拖动、改变大小方法
在用VS的窗体设计器时,我们可以发现控件都是可以拖动的,并且还可以调整大小.怎么在自己的程序中可以使用上述功能呢? 下面的方法值得借鉴! using System; using System.Wind ...
- vue使用qrcode生成二维码,可以自定义大小
1,qrcanvas-vue插件,https://gera2ld.github.io/qrcanvas-vue/#logo.只支持像素大小的二维码 2,qrcode支持移动端自定义大小二维码 &quo ...
- JAVA代码:生成一个集合,自定义大小,100以内的随机整数
JAVA代码:生成一个集合,自定义大小,100以内的随机整数 方法一:(Random类) package com.dawa.test; import java.util.ArrayList; impo ...
- Linux培训教程 linux系统下分割大文件的方法
在linux中分割大文件,比如一个5gb日志文件,需要把它分成多个小文件,分割后以利于普通的文本编辑器读取. 有时,需要传输20gb的大文件,Linux培训 教程件到另一台服务器,也需要把它分割成多个 ...
- < python PIL - 批量图像处理 - 生成自定义大小图像 >
< python PIL - 批量图像处理 - 生成自定义大小图像 > 直接用python自带的PIL图像库,对一个文件夹下所有jpg/png的图像进行自定义像素变换 from PIL i ...
- WPF中如何调整TabControl的大小,使其跟随Window的大小而改变?
多年不写技术博客,手生的很,也不知道大家都关注什么,最近在研究Wpf及3d模型的展示,碰到很多问题,这个是最后一个问题,写出来小结一下...... WPF中如何调整TabControl的大小,使其跟随 ...
- DOM内容操作和自定义、样式改变
自定义 function 方法名或函数名(参数1,参数2,...) { 方法体: return返回值:(可不写) } function abc() { alert("123"); ...
随机推荐
- Reflection应用场景-利用反射机制将表单数据自动填充到JavaBean中
- 实现一个小目标,动动小指,分享可得iphone7/ipad/U盘|奥威软件
为什么很多人喜欢冬天呢?是因为冬天有着“床边挂起长长棉袜,而你做着甜甜美梦”的平安夜?还是因为冬天有着“具有无法言述的浪漫情怀”的圣诞节? 是不是还沉浸在平安夜,圣诞节的双节狂欢中, 好像不管长到多大 ...
- 编译错误:/usr/bin/ld: cannot find -lz
编译时出现错误/usr/bin/ld: cannot find -lz,安装zlib和zlib-devel yum install zlib yum install zlib-devel
- iis发布网站怎么支持.json文件
- pod install 无限卡顿
pod install 被墙了,请大家换成pod install --verbose --no-repo-update
- 夺命雷公狗-----React---18--value和defaultValue的区别
<!DOCTYPE> <html> <head> <meta charset="utf-8"> <title></ ...
- web分享QQ好友、QQ空间、新浪微博的api接口
QZone: "http://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?url={{URL}}&title={{TITL ...
- Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理
Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...
- IE9浏览器中的My97日历控件刷新后无法打开问题解决办法
解决办法如下: 1:找到WdatePicker.js 2:将$crossFrame:true 改为$crossFrame:false. 3:重启服务,刷新页面发现OK.
- MySql SELECT INTO 记录为空的问题
SELECT Id INTO @Id FROM GiftCode WHERE Status = 1 AND GiftId = #GiftId# ORDER BY Id ASC LIMIT 1; ...