C#Windows窗体界面设计_攻击决策项目_03_数据绘图_02_修订坐标轴和ParamsForm文本框数据

来源:互联网 发布:ftp端口 编辑:程序博客网 时间:2024/05/22 10:26

Author: binzhouweichao@163.com

Copyright (c) 2013, Liu Xiaojian@BIT,  All Rights Reserved.

Date: 2013-10-25

声明:本程序供参考;允许二次开发,但不允许在毫无更改的情况下占为己有。


8. 首先修订坐标轴

参考:

http://www.cnblogs.com/stg609/archive/2008/03/16/1108407.html

http://tech.ddvip.com/2008-10/122483754482646.html


坐标轴为虚线,末尾加箭头,标注原点等。

8.1 设置坐标轴为虚线,并在末尾加自定义箭头

打开MyFunctions.cs,在自定义函数CreateBAxis()中,在画笔下方添加:

            //设置画笔            Pen pBAxis = new Pen(Color.Blue, 1 / GlobalVars.scaleTimes);                //8.1 设置坐标轴为虚线            pBAxis.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;                //8.1 末尾加箭头                //自定义箭头大小            System.Drawing.Drawing2D.AdjustableArrowCap myLineCap = new System.Drawing.Drawing2D.AdjustableArrowCap(6, 6, false);            pBAxis.CustomEndCap = myLineCap;

由于边界遮挡问题,在pictureBox1的上下左右各留出5的边界,所以重置放大倍数为pictureBox1的宽高减去10之后再计算。

            //放大倍数            //GlobalVars.scaleTimes = (float)GlobalVars.mainForm.pictureWidth / int.Parse(GlobalVars.mainForm.paramsForm.simulationWidth);                 //8.1 重置放大倍数,上下左右各留5边界            GlobalVars.scaleTimes = (float)(GlobalVars.mainForm.pictureWidth - 5 * 2) / int.Parse(GlobalVars.mainForm.paramsForm.simulationWidth);

8.2 描出原点

参考:http://wenku.baidu.com/view/25f6161d14791711cc7917ea.html

            //绘制原点                //8.2 建立画刷            SolidBrush oBrush = new SolidBrush(Color.Red);                //8.2 设定点的大小,带放大倍数            float pointSize = 5F / GlobalVars.scaleTimes;                //8.2 填充点            gBAxis.FillEllipse(oBrush, oAxis.X - pointSize / 2, oAxis.Y - pointSize / 2, pointSize, pointSize);

8.3 标注原点、X轴、Y轴

由于对坐标系进行了x轴对称反转,所以同一坐标系下文字也会反转(包括缩放)。为了解决这个问题,在绘制文字之前,对坐标系再反转过来,绘制完后在旋转回去。

参考:

http://hi.baidu.com/biongiser/item/831cfd4058941dae61d7b929

http://zhidao.baidu.com/question/48797170.html

先在原点位置绘制O:

            //8.3 标注原点、X轴、Y轴            gBAxis.ScaleTransform(1, -1);//反转坐标系,以绘制文字            string oString = "O";//要绘制的文字,O            //字体设置,字体为Times New Roman,磅值为10(还有缩放倍数),类型为斜体+粗体            Font myFont = new Font("Times New Roman", 10 / GlobalVars.scaleTimes, FontStyle.Italic | FontStyle.Bold);            gBAxis.DrawString(oString, myFont, oBrush, oAxis);//要绘制的文字O,字体类型,画刷颜色,起始位置

再把坐标轴标注补充完整:

抗锯齿参考:http://bbs.csdn.net/topics/270089022

            //8.3 标注原点、X轴、Y轴            gBAxis.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//抗锯齿            gBAxis.ScaleTransform(1, -1);//反转坐标系,以绘制文字            string oString = "O";//要绘制的文字,O            string xString = "x";//x            string yString = "y";//y            //字体设置,字体为Times New Roman,磅值为10(还有缩放倍数),类型为斜体+粗体            Font myFont = new Font("Times New Roman", 16 / GlobalVars.scaleTimes, FontStyle.Italic | FontStyle.Bold);            gBAxis.DrawString(oString, myFont, oBrush, oAxis);//要绘制的文字O,字体类型,画刷颜色,起始位置            SolidBrush xyBrush = new SolidBrush(Color.Black);//x y的画刷为黑色            gBAxis.DrawString(xString, myFont, xyBrush, xAxis[1].X - 20 / GlobalVars.scaleTimes, xAxis[1].Y);//在x右侧顶点绘制文字            gBAxis.DrawString(yString, myFont, xyBrush, yAxis[1].X-20 / GlobalVars.scaleTimes, (-1) * yAxis[1].Y);//在y上方顶点绘制文字            gBAxis.ScaleTransform(1, -1);//再反转回去。。            //释放资源            pBAxis.Dispose();            gBAxis.Dispose();            oBrush.Dispose();            xyBrush.Dispose();            myFont.Dispose();

效果图:



9. 修订文本输入框输入0时的bug

前面已经修订过ParamsForm的文本框,限制只能输入数字(包括退格和回车)。但是,当只有0时,也是合法的输入,却是后面计算中的bug。所以,还要限定在文本框为空的条件下,不能输入0,即首字符不能为0。

9.1 重新做一下MyFunctions.NumberOnly()函数,输入参数添加一个文本框的文本变量。

打开MyFunctions,修改NumberOnly()函数:

        //7.1.1 限定TextBox只能输入数字,还包含退格和回车        //9.1 修订限定文本框函数,添加第一个字符不能为0        /*        public static void NumberOnly(ref KeyPressEventArgs e)        {            if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 13) && (e.KeyChar != 8))//数字0-9的ASCII码的范围,13为回车,8为退格            { e.Handled = true; }            else            { e.Handled = false; }        }         * */        public static void NumberOnly(string str, ref KeyPressEventArgs e)        {            if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 13) && (e.KeyChar != 8))//数字0-9的ASCII码的范围,13为回车,8为退格            { e.Handled = true; }            else            {                if (str == "" && e.KeyChar == 48)                { e.Handled = true; }                else { e.Handled = false; }            }        }

9.2 更新ParmsForm三个文本框的限定输入数字部分

mineCommunicationTextBox_KeyPress()

            //MyFunctions.NumberOnly(ref e);//判断输入是否为数字(包括退格和回车)            //9.2 更新            MyFunctions.NumberOnly(mineCommunicationTextBox.Text, ref e);

mineDetectionTextBox_KeyPress()

            //MyFunctions.NumberOnly(ref e);//判断输入是否为数字(包括退格和回车)            //9.2 更新            MyFunctions.NumberOnly(mineDetectionTextBox.Text, ref e);

mineAttackTextBox_KeyPress()

            //MyFunctions.NumberOnly(ref e);//判断输入是否为数字(包括退格和回车)            //9.2 更新            MyFunctions.NumberOnly(mineAttackTextBox.Text, ref e);

修订后,这三个文本框第一位不能输入0。


项目代码:

http://yunpan.cn/Q9AIuu527SD2N


原创粉丝点击