⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmcalibrate.cs

📁 用C#写的USB数据采集程序
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DAS;

namespace MCA
{
    public partial class FrmCalibrate : Form
    {
        #region "私有变量"
        internal FrmMain frmmain;
        private DataTable paratable;
        private DAnalyzer analyzer;
        #endregion

        #region "构造函数"
        public FrmCalibrate()
        {
            InitializeComponent();
            paratable = new DataTable("calibrate");
            paratable.Columns.Add("Channel", typeof(double));
            paratable.Columns.Add("Energy(keV)", typeof(double));
            DataRow row = paratable.NewRow();
            row[0] = 0;
            row[1] = 0;
            paratable.Rows.Add(row);
            paratable.AcceptChanges();
            gridPara.DataSource = paratable;
            analyzer = new DAnalyzer();
        }
        #endregion

        #region "移动窗体"
        private bool moveenable;
        private int px;
        private int py;

        private void panelCaption_MouseDown(object sender, MouseEventArgs e)
        {
            moveenable = true;
            //保存原始的坐标点,便于移动时计算相对距离
            px = e.X;
            py = e.Y;
        }

        private void panelCaption_MouseMove(object sender, MouseEventArgs e)
        {
            if (moveenable)
            {
                this.Left += e.X - px;
                this.Top += e.Y - py;
                this.Refresh();
                frmmain.Refresh();
            }
        }

        private void panelCaption_MouseUp(object sender, MouseEventArgs e)
        {
            moveenable = false;
        }
        #endregion

        #region "控制输入面板"
        private void nUpDownvalue_LostFocus(object sender, EventArgs e)
        {
            inputPanel.Enabled = false;
        }

        private void nUpDownvalue_GotFocus(object sender, EventArgs e)
        {
            inputPanel.Enabled = true;
        }

        private void nUpDownvalue1_GotFocus(object sender, EventArgs e)
        {
            inputPanel.Enabled = true;
        }

        private void nUpDownvalue1_LostFocus(object sender, EventArgs e)
        {
            inputPanel.Enabled = false;
        }
        #endregion

        #region "保存参数"
        /// <summary>
        /// 保存参数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtSave_MouseUp(object sender, MouseEventArgs e)
        {
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (!saveFileDialog.FileName.ToLower().EndsWith(".cal"))
                {
                    saveFileDialog.FileName += ".cal";
                }
                try
                {
                    paratable.WriteXml(saveFileDialog.FileName, XmlWriteMode.WriteSchema);
                    MessageBox.Show("参数保存成功。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
                catch (Exception)
                {
                    MessageBox.Show("参数保存失败。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return;
                }
            }
        }
        #endregion

        #region "读入参数"
        /// <summary>
        /// 读入参数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtOpen_MouseUp(object sender, MouseEventArgs e)
        {
            try
            {
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    paratable.Rows.Clear();
                    paratable.ReadXml(openFileDialog.FileName);
                    paratable.AcceptChanges();
                    MessageBox.Show("参数读入成功。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            catch (Exception)
            {
                MessageBox.Show("参数读入失败。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                DataRow row = paratable.NewRow();
                row[0] = 0;
                row[1] = 0;
                paratable.Rows.Add(row);
                paratable.AcceptChanges();
                return;
            }
            finally
            {
                DataGridCell cell = gridPara.CurrentCell;
                double d = (double)gridPara[cell.RowNumber, cell.ColumnNumber];
                nUpDownvalue.Value = (int)d;
                double d1 = d - (double)nUpDownvalue.Value;
                if (d1 > 0)
                {
                    nUpDownvalue1.Value = Convert.ToDecimal(d1.ToString().Remove(0, 2));
                }
                else
                {
                    if (d1 == 0)
                    {
                        nUpDownvalue1.Value = 0;
                    }
                    else
                    {
                        nUpDownvalue1.Value = Convert.ToDecimal(d1.ToString().Remove(0, 3));
                    }
                }
            }
        }
        #endregion

        #region "删除参数"
        /// <summary>
        /// 删除参数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtDelect_MouseUp(object sender, MouseEventArgs e)
        {
            if (paratable.Rows.Count < 2)
            {
                return;
            }
            int n = gridPara.CurrentRowIndex;
            if (n < paratable.Rows.Count)
            {
                paratable.Rows[n].Delete();
                paratable.AcceptChanges();
            }
        }
        #endregion

        #region "新增参数"
        /// <summary>
        /// 新增参数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtAdd_MouseUp(object sender, MouseEventArgs e)
        {
            DataRow row = paratable.NewRow();
            row[0] = 0;
            row[1] = 0;
            paratable.Rows.Add(row);
            paratable.AcceptChanges();
        }
        #endregion

        #region "显示刻度曲线"
        /// <summary>
        /// 显示刻度曲线
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtCursor_MouseUp(object sender, MouseEventArgs e)
        {
            if (DrawBox.Visible)
            {
                DrawBox.Visible = false;
                panel4.Visible = false;
                ibtCurve.Image = imageList.Images[0];
            }
            else
            {
                int i;
                int n = paratable.Rows.Count;
                if (n < 2)
                {
                    MessageBox.Show("参数个数太少。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return;
                }
                //检查道址是否有重复
                ArrayList list = new ArrayList();
                list.Add(gridPara[0, 0]);
                for (i = 1; i < n; i++)
                {
                    if (list.Contains(gridPara[i, 0]))
                    {
                        MessageBox.Show("道址有重复。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                        return;
                    }
                    else
                    {
                        list.Add(gridPara[i, 0]);
                    }
                }
                //生成参数
                LeastSquareData[] data = new LeastSquareData[n];
                for (i = 0; i < data.Length; i++)
                {
                    data[i].X = (double)gridPara[i, 0];
                    data[i].Fx = (double)gridPara[i, 1];
                }
                LeastSquareResult result;
                if (rbtLine.Checked == false)
                {
                    result = analyzer.LeastSquare(MultinomialType.Square, data);
                    lbResult.Text = "Energy = " + result.C.ToString("E3") + "*Ch^2 + " + result.B.ToString("E3") + "*Ch + " + result.A.ToString("E3");
                }
                else
                {
                    result = analyzer.LeastSquare(MultinomialType.Linear, data);
                    lbResult.Text = "Energy = " + result.B.ToString("E3") + "*Ch + " + result.A.ToString("E3");
                }
                using (Bitmap b = new Bitmap(1, 1))
                {
                    using (Graphics g = Graphics.FromImage(b))
                    {
                        if (g.MeasureString(lbResult.Text, lbResult.Font).Width > lbResult.Width)
                        {
                            lbResult.Top = 0;
                        }
                        else
                        {
                            lbResult.Top = 6;
                        }
                    }
                }
                //显示曲线
                int[] drawdata = new int[frmmain.drawbox.MaxX + 1];
                int max = 0;
                int min = 0;
                for (i = 0; i < drawdata.Length; i++)
                {
                    drawdata[i] = (int)(result.A + result.B * i + result.C * i * i);
                    if (drawdata[i] >= max)
                    {
                        max = drawdata[i];
                    }
                    if (drawdata[i] <= min)
                    {
                        min = drawdata[i];
                    }
                }
                DrawBox.MaxX = drawdata.Length - 1;
                DrawBox.MaxY = max + 1;
                DrawBox.MinY = min - 1;
                DrawBox.Data = drawdata;
                DrawBox.Visible = true;
                panel4.Visible = true;
                ibtCurve.Image = imageList.Images[1];
            }
        }
        #endregion

        #region "取消"
        /// <summary>
        /// 取消参数输入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtCancel_MouseUp(object sender, MouseEventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
        #endregion

        #region "完成参数输入"
        /// <summary>
        /// 完成参数输入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ibtOK_MouseUp(object sender, MouseEventArgs e)
        {
            int i;
            int n = paratable.Rows.Count;
            if (n < 2)
            {
                MessageBox.Show("参数个数太少。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                return;
            }
            //检查道址是否有重复
            ArrayList list = new ArrayList();
            list.Add(gridPara[0, 0]);
            for (i = 1; i < n; i++)
            {
                if (list.Contains(gridPara[i, 0]))
                {
                    MessageBox.Show("道址有重复。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return;
                }
                else
                {
                    list.Add(gridPara[i, 0]);
                }
            }
            //生成参数
            LeastSquareData[] data = new LeastSquareData[n];
            for (i = 0; i < data.Length; i++)
            {
                data[i].X = (double)gridPara[i, 0];
                data[i].Fx = (double)gridPara[i, 1];
            }
            if (rbtLine.Checked == false)
            {
                frmmain.caribrateresult = analyzer.LeastSquare(MultinomialType.Square, data);
            }
            else
            {
                frmmain.caribrateresult = analyzer.LeastSquare(MultinomialType.Linear, data);
            }
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
        #endregion

        #region "初始化"
        /// <summary>
        /// 窗口载入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmCalibrate_Load(object sender, EventArgs e)
        {
            this.Top = frmmain.Top + (frmmain.Height - this.Height) / 2;
            this.Left = frmmain.Left + (frmmain.Width - this.Width) / 2;
        }
        #endregion

        #region "设置参数"
        private void nUpDownvalue1_ValueChanged(object sender, EventArgs e)
        {
            DataGridCell cell = gridPara.CurrentCell;
            gridPara[cell.RowNumber, cell.ColumnNumber] = Convert.ToDouble(nUpDownvalue.Value.ToString() + "." + nUpDownvalue1.Value.ToString());
        }

        private void nUpDownvalue_ValueChanged(object sender, EventArgs e)
        {
            DataGridCell cell = gridPara.CurrentCell;
            gridPara[cell.RowNumber, cell.ColumnNumber] = Convert.ToDouble(nUpDownvalue.Value.ToString() + "." + nUpDownvalue1.Value.ToString());
        }
        #endregion

        #region "获得参数值"
        /// <summary>
        /// 获得参数值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridPara_CurrentCellChanged(object sender, EventArgs e)
        {
            DataGridCell cell = gridPara.CurrentCell;
            double d = (double)gridPara[cell.RowNumber, cell.ColumnNumber];
            string[] s = d.ToString("F4").Split('.');

            nUpDownvalue.Value = Convert.ToDecimal(s[0]);
            nUpDownvalue1.Value = Convert.ToDecimal(s[1]);
        }
        #endregion
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -