在工控项目中经常需要开发各种控件满足项目需求,此次对棋盘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); } }
绘制完成后的控件如下图
窗体启动后控件如下图
至此,完成该按钮阵列控件的开发。
原文:https://www.cnblogs.com/MuCoCo/p/12635018.html