C# WinForm程序 客户自定义界面 ! 求助 谢谢 怎么实现用户自己在运行时自己配置界面啊 比如他可以直接加一个输入框控件啊 标签控件啊 等等 并且可以对其进行拖拉啊 改变大小啊 多个控件之间的对齐啊 等等 就好像是VS IDE的功能 这样做的目的是这个项目用户可以自己添加修改删除字段 所以界面上也需要客户自己能来添加输入框这些信息谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以在界面上先放置幾個可能需要的控件,設為隱藏,然後再放置一個或多個按鈕供用戶之用,比如:button1,作用添加textbox,那你就隱藏放置一個textbox,只能這樣了,呵呵,我只是給你提供一點點思路,也不一定要這么做,先開會了,呆會再給你想。 比较有新意,如果直接自己用文本来控制还好点,比如添加字段后,可以选择使用文本框,设置好长,高,程序自动添加或改变,纯脆用IDE式的来实现不是很好做,不知道可不可以用每三方控件,如flowchart,能不能用。 你可以仿照IDE啊,也就是做出来IDE的选择界面,让用户去选择,如果用户选择的button,你就给他画出来一个button 有些报表提供了这个功能,记得:FastReport有这个功能的 我见过delphi开发的程序实现过.net的还没有见过,应该可以实现,不过难一些 我也考虑过。 不过实现起来难度比较大。 1 首先,你的界面控件必须是动态生成。不能是拖拽的,那样就写死了。无法改。 2 你的GDI+ 得相当的熟。 就相当于你写个工具箱,然后写对应的拖拽操作的代码。然后,要把对应的控件按照设计时外观(类似VS IDE你拖拽时的样子) 画到窗体上。 同时,如果是客户自己还能增加字段之类的话,那估计复杂度还要增加。因为在绘制的同时,还涉及你的程序代码部分。 其实,逻辑挺简单的。不过实现起来复杂度比较高。 没必要GDI+...1 动态生成控件2 移动控件...改变控件大小3 保存所有控件的设置. 你可以自己写一个VISUAL IDE了…… 网上有现成的,我这里也有现成的列子,要的话留Mail using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing; namespace MoveControl { class BarcodeControl { #region private private const int MIN_SIZE = 10; //对控件缩放的最小值 private const int BOX_SIZE = 7; //调整大小触模柄方框大小 public bool _IsCtrlKey = false; private TextBox _textbox; private Control _MControl = null; private bool _IsMouseDown = false; private Point _oPointClicked; private Color BOX_COLOR = Color.White; private Label[] _lbl = new Label[8]; private int _startl, _startt, _startw, _starth; private bool _dragging; private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS, Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS, Cursors.SizeNESW, Cursors.SizeWE}; #endregion #region 构造函数 /// <summary> /// 构造控件拖动对象 /// </summary> /// <param name="moveControl">需要拖动的控件 </param> public BarcodeControl(Control moveControl) { // // TODO: 在此处添加构造函数逻辑 // _MControl = moveControl; _MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown); _MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp); _MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove); _MControl.Click += new System.EventHandler(this.Control_Click); //构造8个调整大小触模柄 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.handle_MouseDown); _lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove); _lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp); } CreateTextBox(); Create(); //Control_Click((object)sender, (System.EventArgs)e); } #endregion #region 需拖动控件键盘事件 private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40) { if (e.KeyValue == 37) _MControl.Left -= 1; if (e.KeyValue == 38) _MControl.Top -=1; if (e.KeyValue == 39) _MControl.Left += 1; if (e.KeyValue == 40) _MControl.Top +=1; MoveHandles(); ControlLocality(); _MControl.Visible = true; } if (e.KeyValue == 46) { for (int i = 0; i <8; i++) { _MControl.Parent.Controls.Remove(_lbl[i]); } _MControl.Parent.Controls.Remove(_MControl); _textbox.Parent.Controls.Remove(_textbox); } if (e.KeyValue == 17) { _IsCtrlKey = true; //MessageBox.Show("a"); } } #endregion #region 需拖动控件鼠标事件 private void Control_Click(object sender, System.EventArgs e) { _textbox.Focus(); _MControl = (sender as Control); MoveHandles(); if (_IsCtrlKey == false) { for (int i = 0; i < _MControl.Parent.Controls.Count; i++) { if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label) { _MControl.Parent.Controls[i].Visible = false; } } } } private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { _IsMouseDown = true; _oPointClicked = new Point(e.X, e.Y); for (int i = 0; i < 8; i++) { _MControl.Parent.Controls.Add(_lbl[i]); _lbl[i].BringToFront(); } HideHandles(); } private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { _IsMouseDown = false; MoveHandles(); ShowHandles(); _MControl.Visible = true; } private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (_IsMouseDown) { int l = _MControl.Left + (e.X - _oPointClicked.X); int t = _MControl.Top + (e.Y - _oPointClicked.Y); int w = _MControl.Width; int h = _MControl.Height; l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ? _MControl.Parent.ClientRectangle.Width - w : l); t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ? _MControl.Parent.ClientRectangle.Height - h : t); _MControl.Left = l; _MControl.Top = t; ControlLocality(); } //_MControl.Cursor=Cursors.SizeAll; } #endregion #region 调整大小触模柄鼠标事件 private void handle_MouseDown(object sender, MouseEventArgs e) { _dragging = true; _startl = _MControl.Left; _startt = _MControl.Top; _startw = _MControl.Width; _starth = _MControl.Height; HideHandles(); } // 通过触模柄调整控件大小 // 0 1 2 // 7 3 // 6 5 4 private void handle_MouseMove(object sender, MouseEventArgs e) { int l = _MControl.Left; int w = _MControl.Width; int t = _MControl.Top; int h = _MControl.Height; if (_dragging) { switch (((Label)sender).TabIndex) { //l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小 //t算法: //w算法: //h算法: 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 - _MControl.Left; h = _startt + _starth - _MControl.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 - _MControl.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 - _MControl.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 - _MControl.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 - _MControl.Left; break; } l =(l <0)?0:l; t =(t <0)?0:t; _MControl.SetBounds(l,t,w,h); } } private void handle_MouseUp(object sender, MouseEventArgs e) { _dragging = false; MoveHandles(); ShowHandles(); } #endregion #region private方法 private void Create() { //_IsMouseDown = true; //_oPointClicked = new Point(e.X,e.Y); for (int i = 0; i < 8; i++) { _MControl.Parent.Controls.Add(_lbl[i]); _lbl[i].BringToFront(); } HideHandles(); } private void CreateTextBox() { _textbox = new TextBox(); _textbox.CreateControl(); _textbox.Parent = _MControl.Parent; _textbox.Width = 0; _textbox.Height = 0; _textbox.TabStop = true; _textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown); } private void ControlLocality() { if (_MControl.Location.X < 0) { _MControl.Visible = false; _MControl.Left = 0; } if (_MControl.Location.Y < 0) { _MControl.Visible = false; _MControl.Top = 0; } if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width) { _MControl.Visible = false; _MControl.Left = _MControl.Parent.Width - _MControl.Width; } if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height) { _MControl.Visible = false; _MControl.Top = _MControl.Parent.Height - _MControl.Height; } } private void HideHandles() { for (int i = 0; i < 8; i++) { _lbl[i].Visible = false; } } private void MoveHandles() { int sX = _MControl.Left - BOX_SIZE; int sY = _MControl.Top - BOX_SIZE; int sW = _MControl.Width + BOX_SIZE; int sH = _MControl.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); } } private void ShowHandles() { if (_MControl != null) { for (int i = 0; i < 8; i++) { _lbl[i].Visible = true; } } } #endregion } } //直接调用MoveControl.BarcodeControl barcode = new BarcodeControl(控件); 委托事件 捕获子窗体文本框内鼠标坐标,在父窗体的标题栏显示,如何实现? C#怎样让TextBox的光标隐藏,还有其它问题 运行项目出错,麻烦有经验的看看 字符串问题 协变和逆变 究竟该怎么用 对个数组配对结果怎么获得?给个思路 C#求指点如何将"0x9E5B8C9A"这个字符串转换成16进制数字! 这个问题搞不明白? 如何让窗体退出的时候记录下自己的位置和大小? 求关于车牌自动识别相关技术。 怎么反射利用属性?
.net的还没有见过,应该可以实现,不过难一些
2 你的GDI+ 得相当的熟。 就相当于你写个工具箱,然后写对应的拖拽操作的代码。然后,要把对应的控件按照设计时外观(类似VS IDE你拖拽时的样子) 画到窗体上。
同时,如果是客户自己还能增加字段之类的话,那估计复杂度还要增加。因为在绘制的同时,还涉及你的程序代码部分。 其实,逻辑挺简单的。不过实现起来复杂度比较高。
2 移动控件...改变控件大小
3 保存所有控件的设置.
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace MoveControl
{
class BarcodeControl
{
#region private private const int MIN_SIZE = 10; //对控件缩放的最小值
private const int BOX_SIZE = 7; //调整大小触模柄方框大小 public bool _IsCtrlKey = false;
private TextBox _textbox;
private Control _MControl = null;
private bool _IsMouseDown = false;
private Point _oPointClicked;
private Color BOX_COLOR = Color.White;
private Label[] _lbl = new Label[8];
private int _startl, _startt, _startw, _starth;
private bool _dragging;
private Cursor[] _arrArrow = new Cursor[] {Cursors.SizeNWSE, Cursors.SizeNS,
Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeNS,
Cursors.SizeNESW, Cursors.SizeWE}; #endregion #region 构造函数 /// <summary>
/// 构造控件拖动对象
/// </summary>
/// <param name="moveControl">需要拖动的控件 </param>
public BarcodeControl(Control moveControl)
{
//
// TODO: 在此处添加构造函数逻辑
//
_MControl = moveControl;
_MControl.MouseDown += new MouseEventHandler(this.Control_MouseDown);
_MControl.MouseUp += new MouseEventHandler(this.Control_MouseUp);
_MControl.MouseMove += new MouseEventHandler(this.Control_MouseMove);
_MControl.Click += new System.EventHandler(this.Control_Click); //构造8个调整大小触模柄
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.handle_MouseDown);
_lbl[i].MouseMove += new MouseEventHandler(this.handle_MouseMove);
_lbl[i].MouseUp += new MouseEventHandler(this.handle_MouseUp);
} CreateTextBox();
Create(); //Control_Click((object)sender, (System.EventArgs)e);
} #endregion #region 需拖动控件键盘事件 private void textBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyValue == 37 || e.KeyValue == 38 || e.KeyValue == 39 || e.KeyValue == 40)
{
if (e.KeyValue == 37)
_MControl.Left -= 1;
if (e.KeyValue == 38)
_MControl.Top -=1;
if (e.KeyValue == 39)
_MControl.Left += 1;
if (e.KeyValue == 40)
_MControl.Top +=1;
MoveHandles();
ControlLocality();
_MControl.Visible = true;
} if (e.KeyValue == 46)
{
for (int i = 0; i <8; i++)
{
_MControl.Parent.Controls.Remove(_lbl[i]);
}
_MControl.Parent.Controls.Remove(_MControl);
_textbox.Parent.Controls.Remove(_textbox);
} if (e.KeyValue == 17)
{
_IsCtrlKey = true;
//MessageBox.Show("a");
}
} #endregion
#region 需拖动控件鼠标事件 private void Control_Click(object sender, System.EventArgs e)
{
_textbox.Focus();
_MControl = (sender as Control);
MoveHandles(); if (_IsCtrlKey == false)
{
for (int i = 0; i < _MControl.Parent.Controls.Count; i++)
{
if (_MControl.Parent.Controls[i].Text.Trim().Length == 0 && _MControl.Parent.Controls[i] is Label)
{
_MControl.Parent.Controls[i].Visible = false;
}
}
}
}
private void Control_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
_IsMouseDown = true;
_oPointClicked = new Point(e.X, e.Y);
for (int i = 0; i < 8; i++)
{
_MControl.Parent.Controls.Add(_lbl[i]);
_lbl[i].BringToFront();
}
HideHandles();
} private void Control_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
_IsMouseDown = false;
MoveHandles();
ShowHandles();
_MControl.Visible = true;
} private void Control_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (_IsMouseDown)
{
int l = _MControl.Left + (e.X - _oPointClicked.X);
int t = _MControl.Top + (e.Y - _oPointClicked.Y);
int w = _MControl.Width;
int h = _MControl.Height;
l = (l < 0) ? 0 : ((l + w > _MControl.Parent.ClientRectangle.Width) ?
_MControl.Parent.ClientRectangle.Width - w : l);
t = (t < 0) ? 0 : ((t + h > _MControl.Parent.ClientRectangle.Height) ?
_MControl.Parent.ClientRectangle.Height - h : t);
_MControl.Left = l;
_MControl.Top = t;
ControlLocality();
}
//_MControl.Cursor=Cursors.SizeAll;
} #endregion
#region 调整大小触模柄鼠标事件 private void handle_MouseDown(object sender, MouseEventArgs e)
{
_dragging = true;
_startl = _MControl.Left;
_startt = _MControl.Top;
_startw = _MControl.Width;
_starth = _MControl.Height;
HideHandles();
}
// 通过触模柄调整控件大小
// 0 1 2
// 7 3
// 6 5 4
private void handle_MouseMove(object sender, MouseEventArgs e)
{
int l = _MControl.Left;
int w = _MControl.Width;
int t = _MControl.Top;
int h = _MControl.Height;
if (_dragging)
{
switch (((Label)sender).TabIndex)
{
//l算法:控件左边X坐标 + 鼠标在触模柄X坐标 < 控件左边X坐标 + 父控件宽度 - 控件大小 ?控件左边X坐标 + 鼠标在触模柄X坐标 :控件左边X坐标 + 父控件宽度 - 控件大小
//t算法:
//w算法:
//h算法:
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 - _MControl.Left;
h = _startt + _starth - _MControl.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 - _MControl.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 - _MControl.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 - _MControl.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 - _MControl.Left;
break;
}
l =(l <0)?0:l;
t =(t <0)?0:t;
_MControl.SetBounds(l,t,w,h);
}
} private void handle_MouseUp(object sender, MouseEventArgs e)
{
_dragging = false;
MoveHandles();
ShowHandles();
} #endregion
#region private方法 private void Create()
{
//_IsMouseDown = true;
//_oPointClicked = new Point(e.X,e.Y);
for (int i = 0; i < 8; i++)
{
_MControl.Parent.Controls.Add(_lbl[i]);
_lbl[i].BringToFront();
}
HideHandles();
} private void CreateTextBox()
{
_textbox = new TextBox();
_textbox.CreateControl();
_textbox.Parent = _MControl.Parent;
_textbox.Width = 0;
_textbox.Height = 0;
_textbox.TabStop = true;
_textbox.KeyDown += new System.Windows.Forms.KeyEventHandler(textBox_KeyDown);
} private void ControlLocality()
{
if (_MControl.Location.X < 0)
{
_MControl.Visible = false;
_MControl.Left = 0;
}
if (_MControl.Location.Y < 0)
{
_MControl.Visible = false;
_MControl.Top = 0;
}
if (_MControl.Location.X + _MControl.Width > _MControl.Parent.Width)
{
_MControl.Visible = false;
_MControl.Left = _MControl.Parent.Width - _MControl.Width;
}
if (_MControl.Location.Y + _MControl.Height > _MControl.Parent.Height)
{
_MControl.Visible = false;
_MControl.Top = _MControl.Parent.Height - _MControl.Height;
}
} private void HideHandles()
{
for (int i = 0; i < 8; i++)
{
_lbl[i].Visible = false;
}
} private void MoveHandles()
{
int sX = _MControl.Left - BOX_SIZE;
int sY = _MControl.Top - BOX_SIZE;
int sW = _MControl.Width + BOX_SIZE;
int sH = _MControl.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);
}
} private void ShowHandles()
{
if (_MControl != null)
{
for (int i = 0; i < 8; i++)
{
_lbl[i].Visible = true;
}
}
} #endregion }
} //直接调用
MoveControl.BarcodeControl barcode = new BarcodeControl(控件);