木木3016

 

控件开发之button棋盘阵列

在工控项目中经常需要开发各种控件满足项目需求,此次对棋盘button开发进行说明。

项目需求为以该控件模拟工厂仓库灯开关,当点击该控件上的任意button按钮时能打开或关闭对应的仓库灯,开发过程如下:

 新建一个Windows窗体控件库项目,默认名称为UserControl1,思路是通过向自定义控件中添加若干个button,并以双层for循环实现阵列,外层循环表示行数、内层循环表示列数,代码如下:

public void FillButton()
        {
            //填充方格,现在放置的是罗列着的
            for (int i = 0; i < RowNum; i++)
            {
                for(int j = 0; j < ColumNum; j++)
                {
                    Button btn = new Button();
                    this.Controls.Add(btn);
                }                
            }
            
        }

然后对控件内的button按钮进行布局,属性设置

  private void LayoutBtns()
        {            
            //去除启动状态,以免开启的时候FillBtn_SizeChanged会报错
            if (this.Controls.Count == 0)
            {
                return;
            }
            //循环多少次?计算出来
            int btnLineNum = (int)Math.Sqrt(this.Controls.Count);
            //计算按钮的宽度
            int btnWidth = this.Width / ColumNum-1;
            //计算按钮的高度
            int btnHeight = this.Height / RowNum-1;

            int btnIndex = 0;
            int btnX = 0, btnY = 0;
            //竖向的循环嵌套横着的循环
            for (int verticalIndex = 0; verticalIndex < RowNum; verticalIndex++)
            {
                btnY = verticalIndex * Height / RowNum;
                //水平向的循环
                for (int horizontalIndex = 0; horizontalIndex < ColumNum; horizontalIndex++)
                {
                    btnX = horizontalIndex * Width/ColumNum;
                    //获取要放置的方格
                    Button btn = this.Controls[btnIndex] as Button;
                    //设置当前方格的大小
                    btn.Size = new Size(btnWidth, btnHeight);
                    //设置当前方格的位置
                    btn.Location = new Point(btnX+1, btnY+1);
                    //下一个方格
                    btnIndex++;
                    //把按钮位置(行,列号)绑定到Tag属性中
                    btn.Tag = verticalIndex.ToString() + "," + horizontalIndex.ToString();
                    //绑定click事件                    
                    btn.Click += Btn_Click;                    
                    btn.Invalidate();
                }
            }
        }

至此,完成该自定义控件开发,但是该控件是没有边界的状态,拖到窗体上时是看不到的,只有当启动的时候才能看到。因此,此处先绘制一个外边框,使用控件的paint事件,尺寸计算根据控件长度和宽度以及阵列个数计算。

 private void UserControl1_Paint_1(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
            g.DrawRectangle(Pens.DarkGray, 0, 0, Width -1, Height-1);
//绘制框线纵轴 for (int i = 0; i < ColumNum; i++) { int point_x = Width * i / ColumNum; g.DrawLine(Pens.DimGray, point_x, 0, point_x, Height); } // 绘制框线横轴 for (int j = 0; j < RowNum; j++) { int point_y = Height * j / RowNum; g.DrawLine(Pens.DimGray, 0, point_y, Width, point_y); } }

绘制完成后的控件如下图

窗体启动后控件如下图

至此,完成该按钮阵列控件的开发。

posted on 2020-04-05 18:21  木木3016  阅读(278)  评论(0编辑  收藏  举报

导航