C# Winform 内部控件移动设计问题

clj2201 2008-11-10 02:47:06
我在Panel中加了好多控件,当程序运行起来后,如何设置能让我移动或者改变Panel内部控件的位置、大小,就像在设计的时候那样可以随意的用鼠标移动、改变大小,而不是通过输入数据改变~~~~

就像设计时DesignMode=false时那样,那位高手指教一下!!多谢~
...全文
268 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongshanyu 2008-11-10
  • 打赏
  • 举报
回复
mark
clj2201 2008-11-10
  • 打赏
  • 举报
回复
to 7F:
这仅仅是实现拖动,这个应该没有问题,想实现可以动态改变大小~~~

to 8F:
确实想要此种效果,但是看Demo发现其框架基本就是一个类似Vs的,用在我这好像大材小用~~不过确实很有用,得仔细研究一下~~

我再考虑是否可以组合控制一下,在选择每个控件后,增加8个小Picturebox分布在Control周围,控制一下mouse显示,实现更改大小,不知道这样如何??

不知道那位达人还有更好的办法??
我觉得这个问题肯定有很多人遇到过,比如设计打印模板时就需要动态更改设计变量的为止等等~~~
wanghui0380 2008-11-10
  • 打赏
  • 举报
回复
找了一下,微软的几个demo地址
http://www.myfirm.cn/news/DotNetUserInterface/20080221013104408.html
starrain95 2008-11-10
  • 打赏
  • 举报
回复
楼上贴的没来得及细看,直接添加控件好像不行,回头再仔细研究研究

下面是用事件实现的代码,你再加上鼠标图标变化和更好的鼠标定位处理应该也可以,希望对你有用:

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 testRunningDrag
{
public partial class Form1 : Form
{
bool AreaChange = false;
Control moveCtrl;

public Form1()
{
InitializeComponent();
}

public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();

private void pic1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(pic1.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (this.AreaChange == true)
{
moveCtrl.Width = e.X-pic1.Left;
moveCtrl.Height = e.Y-pic1.Top;
}
}

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
//label1.Text = string.Format("{0},{1} {2},{3}", e.X.ToString(), e.Y.ToString(), pic1.Left + pic1.Width, pic1.Top + pic1.Height);
if (e.X - pic1.Left - pic1.Width < 10 && e.Y - pic1.Top - pic1.Height < 10)
{
AreaChange = true;
moveCtrl = pic1;
}
}

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
AreaChange = false;
}
}
}
wanghui0380 2008-11-10
  • 打赏
  • 举报
回复
这个东西使用DesignHost对象比较方便,实际上vs本身的设计器就是用的这个东西

你可以看看这个系列的文章
http://panjiwen.cnblogs.com/archive/2005/10/archive/2005/10/10/251689.html

ps:实际微软也提供了DesignHost方面的demo,有两个版本net1.1和net2.0的(记不得名字了,自己找一下把)

clj2201 2008-11-10
  • 打赏
  • 举报
回复
要想移动很简单,关键是如何用鼠标执行拖拽改变其大小呢?

就像在设计状态模式下的效果??
starrain95 2008-11-10
  • 打赏
  • 举报
回复
可以用WIN32API实现

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 testRunningDrag
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

public const int WM_SYSCOMMAND = 0x0112;
public const int SC_MOVE = 0xF010;
public const int HTCAPTION = 0x0002;
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
[DllImport("user32.dll")]
private static extern int ReleaseCapture();

private void pic1_MouseDown(object sender, MouseEventArgs e)
{
ReleaseCapture();
SendMessage(pic1.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
}
}
}
卧_槽 2008-11-10
  • 打赏
  • 举报
回复
mousedown mousemove mouseup
这三个事件里面写代码就行了。很简单的。
FlyingLimy 2008-11-10
  • 打赏
  • 举报
回复
可以自己从Panel中继承下,判断当鼠标移动到此Panel的边沿时,根据其位置将鼠标的光标改为箭头状。在OnMouseMove的过程中,修改Panel的大小就可以老
clj2201 2008-11-10
  • 打赏
  • 举报
回复
Help~~~~

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧