标题:开发一个界面,能够按某种要求随机出现不冲突位置图案
只看楼主
小年
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-11-21
结帖率:80%
已结贴  问题点数:10 回复次数:4 
开发一个界面,能够按某种要求随机出现不冲突位置图案
大家好,刚开始学习C#。老师让做一个程序,主要要求是,当串口收到信号时,程序界面随机出现一个圆形图标,表示该信号的出现,当该信号一直在时,此图标也一直在界面上,直到信号消失,如果有另一个信号出现,则界面上在不重复的地方再出现一个圆形图标,同时点击这个图标,希望能知道这个信号的某些信息。我暂时想的是做一个自定义控件(圆形图标),但是我只能在Form里先规定好控件的位置,不能随机出现,不知道思路对不对,我也不知道随机出现这种情况怎么办?请大家帮忙啦,谢谢~~类似于以下界面
搜索更多相关主题的帖子: 信号 开发 
2012-11-27 22:29
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:10 


说明:此示例不考虑性能,应付作业也足够了,真正实用的话还要考虑性能问题,需要很多技巧的;

自定义控件ACircle
程序代码:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace RandomCircle
{
    public partial class ACircle : Control
    {
        #region 只读全局字段

        private readonly Brush _brush;

        #endregion

        #region 构造函数

        public ACircle(int id)
        {
            InitializeComponent();
            ID = id;
            _brush = new SolidBrush(Color.Goldenrod);
            Draw();
        }

        #endregion

        #region 公共属性

        public int ID { get; set; }

        #endregion

        #region 重写方法

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
            Draw();
        }

        #endregion

        private void Draw()
        {
            var g = CreateGraphics();
            g.Clear(BackColor);
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.InterpolationMode = InterpolationMode.NearestNeighbor;
            g.FillEllipse(_brush, ClientRectangle);
        }
    }
}


FormMain.cs
程序代码:
using System;
using System.Drawing;
using System.Windows.Forms;
using Timer = System.Threading.Timer;

namespace RandomCircle
{
    delegate void AddCircleEventHandler(Point point);

    public partial class FormMain : Form
    {
        #region 常量

        private const int CircleSize = 30;

        #endregion

        #region 只读全局字段

        private readonly Timer _timer;

        #endregion

        #region 全局字段

        private int _id;

        #endregion

        #region 构造函数

        public FormMain()
        {
            InitializeComponent();
            _timer = new Timer(TimerProcess, null, 2000, 2000);
        }

        #endregion

        #region 控件事件

        void newACircle_Click(object sender, EventArgs e)
        {
            var aCircle = (ACircle) sender;
            Text = string.Concat("Random Circle by mmxo - ", aCircle.ID);
        }

        #endregion

        #region 事件处理

        private void TimerProcess(object o)
        {
            var random = new Random(DateTime.Now.Millisecond);
            _timer.Change(random.Next(1000, 3000), 0);

            var location = new Point(random.Next(0, ClientSize.Width - CircleSize),
                                     random.Next(0, ClientSize.Height - CircleSize));
            while (true)
            {
                var newACircleClientRectangle = new Rectangle(location.X, location.Y, CircleSize, CircleSize);
                var locationValid = true;
                foreach (Control control in Controls)
                {
                    if (!(control is ACircle)) continue;
                    var aCircle = (ACircle) control;
                    var rect = new Rectangle(aCircle.Location, new Size(CircleSize, CircleSize));
                    if (!rect.IntersectsWith(newACircleClientRectangle)) continue;
                    locationValid = false;
                    break;
                }
                if (!locationValid) continue;
                break;
            }
            AddCircle(location);
        }

        private void AddCircle(Point point)
        {
            if (InvokeRequired)
                Invoke(new AddCircleEventHandler(AddCircle), new object[] { point });
            else
            {
                var newACircle = new ACircle(++_id) { Location = point, Width = CircleSize, Height = CircleSize };
                newACircle.Click += newACircle_Click;
                Controls.Add(newACircle);
            }
        }

        #endregion
    }
}

为提高中华编程水平而奋斗
2012-11-28 19:10
小年
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-11-21
得分:0 
回复 2楼 mmxo
我做这个自定义控件的时候,将他添加到工具箱时用的.Net framework组件,但是报错说
,不知道为什么,能帮我解答下吗?
2012-12-03 09:35
小年
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-11-21
得分:0 
回复 2楼 mmxo
哦,这个控件就是你上面的那个,程序都一样的,我不过改了名字叫goldenrod
2012-12-03 09:37
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:0 
改名字、改命名空间,重新生成,控件应该就出现在工具栏了,可以拖进UI的,你是不是没有重新生成啊?

为提高中华编程水平而奋斗
2012-12-03 10:33



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-388779-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.546401 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved