1、窗体和控件设计

  • GUI界面程序的创建和CUI界面类似,直接VS创建 C# windows 窗体应用即可。
  • Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_windows

  • 创建后默认会有一个Program.cs和一个Form1窗体。
    Program里决定了启动运行的窗体,Form1是系统自带的。
  • Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_System_02

  • 在菜单栏的项目里可以添加窗体
  • Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_Text_03

  • 可以通过左边的工具箱为窗体添加控件,常用的有按钮,文本框,文字显示等。
    右键属性可以更改控件的长宽高等设置。
    双击控件会进入控件默认触发事件的程序编辑模式(当然也可以自己写别的)。

Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_c#_04

  • 可以通过这两行代码实现在一个窗体中打开另一个窗体。
    Form2 f2 = new Form2();
    f2.ShowDialog();

2、凯撒,单码,乘法逆元的GUI实现

Program

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 古典加密系列
{
    static class Program
    {
        /// <summary>
        ///  The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

Form1

Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_windows_05

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 古典加密系列
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.ShowDialog();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            f3.ShowDialog();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form4 f4 = new Form4();
            f4.ShowDialog();
        }
      
    }
}

Form2 - 凯撒

Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_c#_06

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 古典加密系列
{
    public partial class Form2 : Form
    {
        public static string daxie(string str)
        {                           //大写化字母以及检查函数
            string strs = "";
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] >= 'a' && str[i] <= 'z')
                {
                    char x;
                    x = (char)(str[i] - 32);
                    strs = strs + x;
                }
                else if (str[i] >= 'A' && str[i] <= 'Z')
                {
                    strs = strs + str[i];
                }
                else
                {
                    return "!";
                    break;
                }
            }
            return strs;
        }
        public static string jiami(string plaintexts, int keys)
        {
            string strs = "";
            for (int p = 0; p < plaintexts.Length; p++)
            {          //输出密文
                //Console.WriteLine((plaintexts[p] - 'A' + keys) % 26 + 'A'+'\n');
                char ch = (char)((plaintexts[p] - 'A' + keys) % 26 + 'A');
                strs = strs + ch;

            }
            return strs;
        }
        public static string jiemi(string plaintexts, int keys)
        {
            string strs = "";
            for (int p = 0; p < plaintexts.Length; p++)
            {
                char ch = (char)((plaintexts[p] - 'A' - keys + 26) % 26 + 'A');
                strs = strs + ch;
            }
            return strs;
        }


        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string strkey = textBox3.Text;
            int key = Convert.ToInt32(strkey);
            if (key < 0 || key > 25)
            {
                MessageBox.Show("密钥输入错误,请重新输入密钥");
                return;
            }
            string plaintext = textBox1.Text;
            if (daxie(plaintext) == "!")
            {
                MessageBox.Show("明文输入错误,请重新输入明文");
                return;
            }
            string ciphertext = jiami(plaintext, key);
            textBox2.Text = ciphertext;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string strkey = textBox3.Text;
            int key = Convert.ToInt32(strkey);
            if (key < 0 || key > 25)
            {
                MessageBox.Show("密钥输入错误,请重新输入密钥");
                return;
            }
            string plaintext = textBox2.Text;
            if (daxie(plaintext) == "!")
            {
                MessageBox.Show("密文输入错误,请重新输入密文");
                return;
            }
            string ciphertext = jiemi(plaintext, key);
            textBox1.Text = ciphertext;
        }

    }
}

Form3 - 单码

Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_c#_07

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 古典加密系列
{
    public partial class Form3 : Form
    {
        public static string quchong(string str)
        {                          //密钥去重函数
            string strs = "";
            int[] vis = new int[26];
            for (int i = 0; i < str.Length; i++)
            {
                if (vis[str[i] - 'A'] == 0)
                {
                    strs = strs + str[i];
                }
                vis[str[i] - 'A']++;
            }
            return strs;
        }

        public static string daxie(string str)
        {                           //大写化字母以及检查函数
            string strs = "";
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] >= 'a' && str[i] <= 'z')
                {
                    char x;
                    x = (char)(str[i] - 32);
                    strs = strs + x;
                }
                else if (str[i] >= 'A' && str[i] <= 'Z')
                {
                    strs = strs + str[i];
                }
                else
                {
                    return "!";
                    break;
                }
            }
            return strs;
        }

        public static string jiami(string plaintexts, string keys)
        {         //加密函数
            string miyao;
            miyao = quchong(keys);
            int[] vis = new int[26];
            for (int i = 0; i < miyao.Length; i++)
            {
                vis[miyao[i] - 'A']++;
            }
            string canzhaos = miyao;
            string tmp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            for (int i = 0; i < 26; i++)
            {
                if (vis[i] == 0)
                {
                    canzhaos = canzhaos + tmp[i];
                }
            }
            //Console.WriteLine(canzhaos);
            string ans = "";
            for (int p = 0; p < plaintexts.Length; p++)
            {
                ans = ans + canzhaos[(int)(plaintexts[p] - 'A')];
            }
            //Console.WriteLine("得到密文:");
            //Console.WriteLine(ans + "\n");
            return ans;
        }

        public static string jiemi(string ciphertext, string keys)
        {         //加密函数
            string miyao;
            miyao = quchong(keys);
            int[] vis = new int[26];
            for (int i = 0; i < miyao.Length; i++)
            {
                vis[miyao[i] - 'A']++;
            }
            string canzhaos = miyao;
            string tmp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            for (int i = 0; i < 26; i++)
            {
                if (vis[i] == 0)
                {
                    canzhaos = canzhaos + tmp[i];
                }
            }
            char[] duizhao = new char[26];
            for (int i = 0; i < canzhaos.Length; i++)
            {
                duizhao[canzhaos[i] - 'A'] = tmp[i];
            }
            string duizhaos = "";
            for (int i = 0; i < 26; i++)
            {
                duizhaos = duizhaos + duizhao[i];
            }

            //Console.WriteLine(canzhaos);
            string ans = "";
            for (int p = 0; p < ciphertext.Length; p++)
            {
                ans = ans + duizhaos[(int)(ciphertext[p] - 'A')];
            }
            //Console.WriteLine("得到明文:");
            //Console.WriteLine(ans + "\n");
            return ans;
        }

        public Form3()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string key = textBox3.Text;
            if (daxie(key) == "!")
            {
                MessageBox.Show("密钥输入错误,请重新输入密钥");
                return;
            }
            string plaintext = textBox1.Text;
            if (daxie(plaintext) == "!")
            {
                MessageBox.Show("明文输入错误,请重新输入明文");
                return;
            }
            key = daxie(key);
            plaintext = daxie(plaintext);
            string ciphertext = jiami(plaintext, key);
            textBox2.Text = ciphertext;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string key = textBox3.Text;
            if (daxie(key) == "!")
            {
                MessageBox.Show("密钥输入错误,请重新输入密钥");
                return;
            }
            string plaintext = textBox2.Text;
            if (daxie(plaintext) == "!")
            {
                MessageBox.Show("密文输入错误,请重新输入密文");
                return;
            }
            key = daxie(key);
            plaintext = daxie(plaintext);
            string ciphertext = jiemi(plaintext, key);
            textBox1.Text = ciphertext;
        }
    }
}

Form4 - 乘法逆元对

Visual Studio 2019 C#下WinForm窗体设计 & 凯撒,单码,乘法逆元对的GUI_Text_08

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 古典加密系列
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string strkey = textBox1.Text;
            int ok = 1;
            for(int i = 0; i < strkey.Length; i++)
            {
                if(strkey[i]<'0'||strkey[i] > '9')
                {
                    ok = 0; break;
                }
            }
            if (ok == 0)
            {
                MessageBox.Show("输入不是整数,请重新输入");
                return;
            }
            else
            {
                int key = Convert.ToInt32(strkey);
                int flag = 0;
                for(int i = 0; i < key; i++)
                {
                    for(int j = 0; j < i+1; j++)
                    {
                        if(i*j%key==1 && i != j)
                        {
                            flag = 1;
                            string str = Convert.ToString(i) + '*' + Convert.ToString(j) + "mod" + Convert.ToString(key) + "=1\r\n";
                            textBox2.Text = textBox2.Text + str;
                        }
                    }
                }
            }
            

        }
    }
}

C#参考资料:
http://c.biancheng.net/view/2945.html