C#中怎么处理标准控件和自绘制图元

sunliwen780502 哈尔滨理工大学 项目经理  2017-02-24 09:47:06
在C#中,动态创建的标准Button按钮和鼠标绘制的图元,想在程序运行后能一起操作,比如:有个Button1和用鼠标绘制的了矩形框,我想把这两个控件都选择,在组合或者进行别的操作,由于这两种控件不同一类型的,无法完成上述操作,有没有更好的办法解决呢?请各位老师帮忙看看。
...全文
302 点赞 收藏 15
写回复
15 条回复
sunliwen780502 2017年02月25日
to qq_36769535:跟你说的这个差不多,是这个意思。感谢楼上几位朋友的指点。
回复 点赞
larry_wen 2017年02月25日
组态软件中的图元本身就是一个控件,你完全可以将矩形框和button封装成一个usercontrol,操作起来方便得多
回复 点赞
qq_36769535 2017年02月24日
可能我理解的不对啊,是这样的么?


public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
for (int i=0;i<5;i++)
{
PictureBox pB_sel = new PictureBox();
pB_sel.Size = new Size(14,14);
pB_sel.Location = new Point(10,50+18*i);
pB_sel.Cursor = Cursors.Hand;
pB_sel.Image = Image.FromFile(@"sel.png");
pB_sel.Tag = 0; //未选中标记
pB_sel.Click += new EventHandler(Psel_Click); //图片点击事件
this.Controls.Add(pB_sel);
}
}

private void Psel_Click(object sender, EventArgs e)
{
PictureBox Pic = (PictureBox)sender;
if (Pic.Tag.ToString()=="0")
{
Pic.Image = Image.FromFile(@"seled.png");
Pic.Tag = 1;
}
else
{
Pic.Image = Image.FromFile(@"sel.png");
Pic.Tag = 0;
}
}

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 5; i++)
{
PictureBox ps = (PictureBox)button1.Parent.Controls[1 + i];
ps.Image = Image.FromFile(@"seled.png");
ps.Tag = 1;
}
}
}
回复 点赞
xuggzu 2017年02月24日
说白了,就是用自绘制的图形比如虚线长方形“表示”选中状态,鼠标框中几个就画几个。至于组合或者其它操作就要看具体要求了。 推荐用wpf做,使用Adorner很方便。
回复 点赞
sunliwen780502 2017年02月24日
to sp1234:封装成标准控件这个,我用usercontrol来封装是否可以行呢?
回复 点赞
sunliwen780502 2017年02月24日
to sp1234:您说的有道理,我也想过将绘制图元的操作,都封装成windows标准控件,这样也方便以后操作了,本身的windows自带控件在和绘制图元一起操作,就不是什么问题了。
回复 点赞
以专业开发人员为伍 2017年02月24日
当用户在界面点击某个点,然后用鼠标“拉框”拉出一个矩形,松开鼠标按键,你的应用就应该立刻动态创建一个“矩形”控件。 当用户选择一个控件,你的应用就应该在“当前已选中”集合中记录已经选中的控件。 单用户点击菜单上的“组合”,那么你的应用就应该创建一个“组合”控件,这个控件没有什么界面,它其实是包含了另外两个控件,控制两个控件(例如捕获和操作共同的拾取事件、联合拖动行为,等等)。 总之你可以看到,要有一套通用的控件的观念。要学会控件思路。而不是停留在底层思路。
回复 点赞
sunliwen780502 2017年02月24日
我要实现的是个简单的组态软件,这两种控件要能组合在一起,还有全选后,也可以删除。现在,没法全选,焦点默认在Button控件上。有人建议用usercontrol或者,每个控件就是一个窗口,没搞懂。
回复 点赞
以专业开发人员为伍 2017年02月24日
“用鼠标绘制的矩形框”,你必须封装为一个标准控件,这样你才能进一步地使用 Control 所继承的各种通用事件、通用属性、通用刷新机制,等等机制。 有些人只是满足于“用GDI+画了一些点线面”,永远也上升不到控件层面。他们认为一旦上升到自定义控件开发设计层面,就“俗气”了,性能就低了。认为越是底级的东西越高效、越高级。那么就只能一辈子研究底层的东西。花5年事件在那里钻研、设计人家用3个月就能做完的东西,还不一定有什么成果。 你如果不去选择专门针对图形系统的开发平台,而要用 winform,那么你要自己开发一套相当于高级图形框架,例如起码有 Polygen、Path 控件,并且高效地使用。
回复 点赞
以专业开发人员为伍 2017年02月24日
跟是不是“同一类型”没有关系。 你需要自己自己开发设计。比如说“当前被鼠标选中”的界面是什么?被选中的控件的 List 结构如何定义?组合的结果应该用什么对象来应用,以及序列化保存起来、将来从文本中恢复?你所谓的“进行别的操作”到底是什么操作? 这些需要你自己设计。目前还完全看不清楚你到底对于最基本的功能,能想明白2、3点什么。
回复 点赞
sunliwen780502 2017年02月24日
我的图元类已经写好了,Ele类是所有图元的父类,里面有很多属性,Ele从Object继承的。这些类在Shapes.cs文件中。 我又写了

UserControl自定控件,里面是具体的绘制图元的方法。
Shapes.cs文件:
[Serializable]
public abstract class Ele: Object
{
static public Single dpix;
static public Single dpiy;
//....
}

public class Rect : Ele {

}
[Serializable]
public class Shapes {
public void addEllipse(int x, int y, int x1, int y1, Color penC, Color fillC, float penW, bool filled)
{

}
}
vectShapes.cs文件,里面有绘制网格线,鼠标等操作
public partial class vectShapes : UserControl
{
//...
}
我想形成一个控件,可不知道怎么处理更好啊。
现在的操作是vectShapes控件放置好后,点击一个小图标或按钮,开始在vectShapes绘制矩形,这个还是不好封装啊。
如果不用vectShapes,直接用一个usercontrol在窗口上画,鼠标动作都得处理,还不灵活,怎么处理更好呢?
回复 点赞
XBodhi. 2017年02月24日
都是继承自 Control
回复 点赞
xuzuning 2017年02月24日
UserControl 就是真正的控件
回复 点赞
sunliwen780502 2017年02月24日
用UserControl做,算是控件吧,还是要做真正的控件呢
回复 点赞
xuzuning 2017年02月24日
wpf 中,鼠标绘制的就是控件。所以不存在你说的问题 wiform 中,鼠标绘制的只是些色彩点而已,必须依附在控件上才可被操作 就好比你在纸上画画一个圆后,并不能从纸上将这个圆拿起来
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告