标题:开发一个界面,能够按某种要求随机出现图案
只看楼主
小年
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-11-21
结帖率:80%
已结贴  问题点数:20 回复次数:4 
开发一个界面,能够按某种要求随机出现图案
大家好,我是研一的,刚接触C#,老师要求做一个界面,当外界串口满足某种需求时界面上出现一个图标,再次满足要求时界面上又出现一个图标,我想知道这种随机图标的出现怎么实现?有看到说是GDI?
谢谢大家
搜索更多相关主题的帖子: 开发 
2012-11-21 21:32
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3450
专家分:19340
注 册:2012-3-31
得分:0 
看看

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2012-11-21 22:18
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:20 
搞个自定义控件RandomImager,定义一个公共属性RectanglePercent表示填充矩形块的密度,Rebuild公共方法负责按照逻辑生成图案(替换成你自己的图片生成逻辑),我这里在主窗体每隔一秒重新生成一次,你到时从串口收到数据满足条件再调用Rebuild方法即可,如下:
 
[attach]66459[/attach]
 
RandomImager.cs
程序代码:
using System;
using using System.Drawing;
using System.Windows.Forms;

namespace RandomImage
{
    public partial class RandomImager : Control
    {
        #region 构造函数

        public RandomImager()
        {
            InitializeComponent();
            RectanglePercent = .2;
        }

        #endregion

        #region 公共属性

        [Category("Custom")]
        public double RectanglePercent { get; set; }

        #endregion

        #region 公共方法

        public void Rebuild()
        {
            var g = CreateGraphics();
            var flags = new bool[Width][];
            for (var i = 0; i < Width; i++) flags[i] = new bool[Height];
            var pointCount = 0;
            var totalPixel = (double)Width * Height;
            var random = new Random(DateTime.Now.Millisecond);
            g.Clear(BackColor);

            while (true)
            {
                var point = new Point(random.Next(0, Width), random.Next(0, Height));
                if (flags[point.X][point.Y]) continue;
                var brush =
                    new SolidBrush(Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255),
                                                  random.Next(0, 255)));
                g.FillRectangle(brush, point.X, point.Y, random.Next(1, 30), random.Next(1, 30));
                flags[point.X][point.Y] = true;
                pointCount++;
                if (pointCount / totalPixel < RectanglePercent) continue;
                break;
            }
        }

        #endregion

        #region 重写方法

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

        #endregion
    }
}

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

namespace RandomImage
{
    public partial class FormMain : Form
    {
        #region 全局字段

        private Timer _timer;

        #endregion

        #region 构造函数

        public FormMain()
        {
            InitializeComponent();
            Ri.Rebuild();
            _timer = new Timer(TimerProcess, null, 1000, 1000);
        }

        #endregion

        #region 事件处理

        private void TimerProcess(object o)
        {
            Ri.Rebuild();
        }

        #endregion
    }
}

 
FormMain.Designer.cs
程序代码:
namespace RandomImage
{
    partial class FormMain
    {
        private  components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null)) components.Dispose();
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.Ri = new RandomImage.RandomImager();
            this.SuspendLayout();

            this.Ri.Dock = System.Windows.Forms.DockStyle.Fill;
            this.Ri.Location = new System.Drawing.Point(0, 0);
            this.Ri.Name = "Ri";
            this.Ri.RectanglePercent = 0.01D;
            this.Ri.Size = new System.Drawing.Size(335, 191);
            this.Ri.TabIndex = 0;
            this.Ri.Text = "randomImager1";

            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(335, 191);
            this.Controls.Add(this.Ri);
            this.Name = "FormMain";
            this.ShowIcon = false;
            this.Text = "Random Image by ";
            this.ResumeLayout(false);

        }
        private RandomImager Ri;
    }
}


[ 本帖最后由 mmxo 于 2012-11-21 23:34 编辑 ]

为提高中华编程水平而奋斗
2012-11-21 22:55
小年
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2012-11-21
得分:0 
回复 3楼 mmxo
谢谢您的解答,让我有了一个思路,我还想问一下,要是我想在界面上随机出现的图标是个圆形,并且可以随意的拖动这个图标,放大缩小这个图标,该怎么办?看到自定义控件中出来的都是矩形的
2012-11-26 10:24
mmxo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:13
帖 子:189
专家分:1090
注 册:2012-11-7
得分:0 
第一条路:还是自定义控件,画圆,然后实现可缩放功能,但是控件的Region还是矩形的;
第二条路:程序用WPF做,对于你这个要求会很方便。

为提高中华编程水平而奋斗
2012-11-26 18:33



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




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

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