winform 有GDI+画表格[原创]

    今天,看到群里有一位朋友正在做一个连连看的小游戏需要用到,在窗体上画表格。闲来没事也想回忆一下GDI+的知识,就是这做了一下,反正也不难先在把demo拿出来与大家分享(高手无喷,行列数可以调):

    学C#也有一段时间了,最近在写一个项目时需要在用户单击窗体的关闭按钮时弹出 确定对话框的功能。自己在网上找了很多方法都不太理想。如果,使用窗体的FormClosing事件,在用户单击取消后窗体照样会被关闭!所以,这个方法显然不是很好。最后使用windows 消息机制的方法达到了设计要求。下面我将核心代码发上来,高手可以走过:

       protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            this.drawWang(5,5);
        }
        Point[] sP;  //上边界
        Point[] xP;  //下边界
        Point[] zP;  //左边界
        Point[] yP;  //右边界       

       

         /// <summary>
        /// 绘制表格的方法
        /// </summary>
        /// <param name="xc">行的数量</param>
        /// <param name="yc">列的数量</param>
        private void drawWang(int xc, int yc)
        {
            int W = this.Width;
            int H = this.Height;
            Graphics g = this.CreateGraphics();
            Rectangle r = new Rectangle(10, 10, W - 30, H - 60);
            g.DrawRectangle(new Pen(Brushes.Red, 2.0f), r);
            int recCountX = xc;
            int recCountY = yc;
            Point[] sP = new Point[recCountX];  //Up
            Point[] xP = new Point[recCountX];  //down
            Point[] zP = new Point[recCountY];  //left
            Point[] yP = new Point[recCountY];  //regit
            int cW = (int)r.Width / recCountX;  //每个格子的长
            int cH = (int)r.Height / recCountY; //每个格子的宽
            for (int i = 0; i < recCountX - 1; i++)
            {
                int pX = r.X + cW + cW * i;   //计算边上点的坐标的方法

                Point p = new Point(pX, r.Y);
                sP[i] = p;
            }
            for (int i = 0; i < recCountX - 1; i++)
            {
                int pX = r.X + cW + cW * i;

                Point p = new Point(pX, r.Y + r.Height);
                xP[i] = p;
            }
            for (int i = 0; i < recCountY - 1; i++)
            {
                int pY = r.Y + cH + cH * i;

                Point p = new Point(r.X, pY);
                zP[i] = p;
            }
            for (int i = 0; i < recCountY - 1; i++)
            {
                int pY = r.Y + cH + cH * i;

                Point p = new Point(r.X + r.Width, pY);
                yP[i] = p;
            }
            for (int i = 0; i < recCountX - 1; i++)
            {
                g.DrawLine(new Pen(Brushes.Red, 2.0f), sP[i], xP[i]);
            }
            for (int i = 0; i < recCountY - 1; i++)
            {
                g.DrawLine(new Pen(Brushes.Red, 2.0f), zP[i], yP[i]);
            }
            g.Dispose();
        }
        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            this.Refresh();  //改变窗体大小时刷新
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值