C# 如何让父布局拦截子控件事件在父控件内拖动不出边界?

WinForm 子窗体在父窗体范围内移动,不能出父窗体
详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1。
2,添加新窗体Form2。
3,主窗体Form1中toolStripButton1的Click事件
private void toolStripButton1_Click(object sender, EventArgs e)
Form2 f2 = new Form2();
f2.MdiParent =
f2.Show();
} 最后看效果吧!
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!C# winform ,如何使MDI子窗体被拖动超出父窗体边缘时,父窗体不出现滚动条_百度知道
C# winform ,如何使MDI子窗体被拖动超出父窗体边缘时,父窗体不出现滚动条
我有更好的答案
补充: 没 人 回 答? 补充:好了,我自己来回答吧................最佳答案是我 不知道别人怎么做,我从父窗体的属性开始研究,结果发现只要把窗体的 AutoScrollMinSize 属性修改一下就可以了。MSDN上这样说:PrintPreviewDialog.AutoScrollMinSize 属性 获取或设置自动滚动条的最小大小。表示滚动条的最小高度和宽度的 Size,单位为像素。用于管理分配给自动滚动条的屏幕大小。 我把它的值改为超过父窗体的尺寸,就怎么也不会有滚动条了。但在属性窗口修改时,IsMdiContainer就会变成False(我用的是VS2005),可以先设置AutoScrollMinSize,再设置IsMdiContainer。 想不到.................自己回答。一楼,你什么意思?二楼,你知道我什么意思。三楼,你知道二楼什么意思。四楼,为了意思意思,我给你打了这么多字。补充: 不管什么个意思,都要感谢大家的回答。
采纳率:61%
为您推荐:
其他类似问题
滚动条的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c#可以创建任意控件的拖动
经常进行图形界面设计的编程者肯定知道,控件在设计的时候才能随意拖动,运行的时候就不能拖动了.
你肯定会问:运行时能随意拖动控件吗?答案是肯定的,我们的项目涉及到了这一点,我已经实现了,实际上很简单的哟.我就拿出来给你们show一下,哈哈,各位高手不要笑我哟.
我们先从简单的入手,一步一步的来吧:
首先,新建一个Form1,拖进去一个label1,text为:鼠标拖动控件练习.接下来就是为它注册事件了,这里我们注册的是label1_MouseUp,label1_MouseDown两个事件.在实现注册事件的代码前要先定义一个Point对象(全局),
private Point mouse_
用来记录鼠标位置,以便平移鼠标位置.
下面是label1_MouseDown的代码:
private void label1_MouseDown(object sender, MouseEventArgs e)
mouse_offset = new Point(-e.X, -e.Y);
是不是非常easy哟.
下面是label1_MouseUp的代码:
private void label1_MouseUp(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left)
Point mousePos = Control.MouseP
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
这个比较复杂,有必要介绍下,
Point mousePos = Control.MouseP定义一个 Point,它包含鼠标光标相对于屏幕左上角的坐标。此时记录的是当前鼠标的位置,也就是最后放控件的位置.
mousePos.Offset(mouse_offset.X, mouse_offset.Y);
是一个方法,
Point.Offset(Int32,Int32)
将此 Point 平移指定的量。
((Control)sender).Location = ((Control)sender).Parent.PointToClient(mousePos);
这个里面的sender大家应该很清楚吧,就是触发事件的label1喽,((Control)sender).Location 这句话就是指定label1的位置,((Control)sender).Parent当然就代表当前的Form1了,如果Form1嵌套在另外一个Form1里面,那么后面可以在有一个.Parent,即:((Control)sender).Parent.Parent,.......依次类推喽.......
Control.PointToClient 方法,将指定屏幕点的位置计算成工作区坐标。参数是:
要转换的屏幕坐标 Point。
事实工作已经完成了,很简单吧,觉得汗吧......
下次介绍运行时怎样动态添加控件.
下面把代码附上:
form1.desgener////////代码
namespace 窗体拖动1
partial class Form1
/// &summary&
/// 必需的设计器变量。
/// &/summary&
private System.ComponentModel.IContainer components =
/// &summary&
/// 清理所有正在使用的资源。
/// &/summary&
/// &param name="disposing"&如果应释放托管资源,为 true;否则为 false。&/param&
protected override void Dispose(bool disposing)
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
#region Windows 窗体设计器生成的代码
/// &summary&
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// &/summary&
private void InitializeComponent()
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
this.label1.AutoSize =
this.label1.Location = new System.Drawing.Point(92, 86);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(101, 12);
this.label1.TabIndex = 0;
this.label1.Text = "鼠标拖动控件练习";
this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown);
this.label1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp);
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.F
this.ClientSize = new System.Drawing.Size(292, 266);
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!c# 如何避免子控件位置改变造成的父控件重绘_百度知道
c# 如何避免子控件位置改变造成的父控件重绘
我有个pictureBox,有个label,label是属于pictureBox的子控件的,每次改变label的location时总是会触发pictureBox的重绘,怎么做可以使改变label的location时不影响pictureBox呢?
我有更好的答案
这个没有办法,必须要重绘 pictureBox 控件,否则怎么给用户响应 label 相对于父 pictureBox 控件的坐标变化呢?如果你是在 pictureBox 的重绘处理方法里加了一些处理代码,你可以通过在处理代码里加入一个 if 检测是否应该重绘: 要改变 location: public partical class FormClass{
private Boolean _shouldRepaintPictureB
public FormClass()
InitializeComponents();
this._shouldRepaintPictureBox =
改变 lobel 位置的方法(...)
this._shouldRepaintPictureBox =
this.label.Location = new Point(新位置X, 新位置Y);
this._shouldRepaintPictureBox =
private void pictureBox_Paint(Object sender, PaintEventArgs e)
if(this._shouldRepaintPictureBox)
// pictureBox 重绘代码
你的思路是没问题的,但是我没在paint里下重绘代码,我是用的异或线画十字光标。
采纳率:64%
不重绘怎么在窗口重新显示label的新位置呢?也就是说不重绘的话,你改变位置坐标完全没意义所以我感觉这是不可能的
你是不是重绘的时候pictureBox里的图片显示出问题了?那你pictureBox.Refresh()一下
嗯,我是用异或线画的十字光标,因为每次pictureBox重绘时总有一对十字线没有清除,我就在paint事件里加了个变量,重绘时设置该变量,每次鼠标移动时判读该变量的值把没有清楚的十字线再画一遍清除,本来是已经没问题的,但是鼠标移动时只要改变了label的值就不行了,就会有很多线没有清除。如果每次改变label位置就pictureBox.Refresh一下,那会很闪的。
你将绘制的方法在重绘里调用就可以了。
我不是在paint里绘制光标的呀。
就因为不是,所以才会画乱的
如果在paint里画,每次还要先把背景图贴一遍,我是几经测试后才选择直接在mouseMove下画的,效率高。
你是要实现什么东西,什么效果,为什么要每次重新贴图,说出来分享一下。
就是类似大智慧软件的十字游标,因为直接画图时跟随光标显示的数值老是闪动,所以想通过label标签,改变label位置,在label上显示数值,跟随光标移动。我想知道怎么可以让label的位置变化只影响pictureBox的某一部分,拜托了。
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 html 拖动控件 的文章

 

随机推荐