C#基礎入門第十四天(MD5加密,WinForm)

1、MD5加密
MD5加密是不能夠逆的,只能將字符串轉爲MD5值,不能將MD5值轉回字符串。小程序

static void Main(string[] args)
    {
        //202cb962ac59075b964b07152d234b70
        //202cb962ac5975b964b7152d234b70   ToString x參數
        //202cb962ac59075b964b07152d234b70  ToString x2參數

        // 3244185981728979115075721453575112   ToString  沒加參數
        //ToString參數須要到百度拿來用
        string s = GetMD5("123");
        Console.WriteLine(s);
        Console.ReadKey();
    }

    public static string GetMD5(string str)
    {
        //建立MD5對象
        MD5 md5 = MD5.Create();
        //開始加密
        //須要將字符串轉爲字節數組
        byte[] buffer = Encoding.Default.GetBytes(str);
        //返回一個加密好的字節數組
       byte[] MD5Buffer = md5.ComputeHash(buffer);

        //將字節數組轉換成字符串
        //字節數組---字符串
        //1.將字節數組中每一個元素按照自定的編碼格式解析成字符串
        //2.直接將數組ToString();
        //3.將字節數組中的每一個元素ToString()
        //  return Encoding.Default.GetString(MD5Buffer);
        string strNew = " ";
        for (int i = 0; i < MD5Buffer.Length; i++)
        {
            //ToString("x") 加x參數將十進制轉爲十六進制,屬於ToString的方法
            strNew += MD5Buffer[i].ToString("x2");
        }
        return strNew;
    }
}

2、Winform應用程序簡介
是一種智能客戶端技術,咱們可使用winform應用程序幫助咱們得到信息或者傳輸信息等。數組

屬性
Name:在後臺要得到前臺的控件對象,須要使用Name屬性
Anchor:控件位置固定
BackColor:控件背景(顏色,背景圖等)
ContextMenuStrip:右鍵菜單 配合工具欄的 菜單和工具欄 內的ContextMenuStrip使用
Cursor:光標樣子
Enabled:設置控件是否可用
Visible:設置控件是否可見
FlatStyle:設置控件外觀
Font:字體dom

事件:發生一件事情。
註冊事件:雙擊控件註冊的都是控件默認被選中的那個事件
觸發事件:點擊後觸發的事情ide

在Main函數當中建立的窗體對象,稱之爲這個窗體應用程序的主窗體。也就意味着,當主窗體被關閉時,整個應用程序都被關閉函數

經過靜態類來共有
窗體1的按鈕彈出窗體2,窗體2的按鈕彈出窗體3,窗體3的按鈕關閉全部窗體(實際窗體3就是調用的窗體1)工具

Form1 的代碼以下佈局

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }

    /// <summary>
    /// 當加載窗體的時候,將窗體對象放到Test類中的靜態字段中
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Form1_Load(object sender, EventArgs e)
    {
      Test._fr1Test = this;
    }
}
}

窗體2的代碼以下字體

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form3 frm3 = new Form3();
        frm3.Show();
    }
}

經過一個靜態類來達到共有窗體1this

namespace WindowsFormsApplication1
{
public static class Test
{
    public static Form1 _fr1Test;
}
}

窗體3的代碼以下編碼

public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
    {
        //須要得到當前主窗體的對象
        Test._fr1Test.Close();
    }

    private void Form3_Load(object sender, EventArgs e)
    {

    }
}

鼠標點不到按鈕,MouseEnter事件

代碼以下

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

/// <summary>
    /// 當鼠標進入按鈕的可見部分的時候,給按鈕一個新的座標
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void noLove_MouseEnter(object sender, EventArgs e)
    {
        //給按鈕一個新的座標
        //按鈕活動的最大寬度就是 窗體的寬度減去按鈕的寬度(按鈕能活動的範圍)
        int x = this.ClientSize.Width - bthLove.Width;
        int y = this.ClientSize.Height - bthLove.Height;

        Random r = new Random();
        //要給按鈕一個隨機的座標
        noLove.Location = new Point(r.Next(0,x+1),r.Next(0,y+1));
    }

    private void bthLove_Click(object sender, EventArgs e)
    {
        MessageBox.Show("我也愛你喲,思密達");
        this.Close();
    }

    private void noLove_Click(object sender, EventArgs e)
    {
        MessageBox.Show("仍是被你這個屌絲點到了");
        this.Close();
    }
}

3、TextBox控件和Label控件(Label控件就是用來顯示文本的)
屬性
WoreWrap:換行
ScrollBars:是否顯示滾動條
PasswordChar:密碼框那個*號的東西
事件:TextChanged:當文本框中的內容改變時觸發這個事件
代碼示例以下

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

/// <summary>
    /// 當文本框中的內容發生改變的時候,將值賦值給Label
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void textWords_TextChanged(object sender, EventArgs e)
    {
        lbl.Text = textWords.Text;
    }
}

跑馬燈練習(Timer的用法)
指定事件發生的頻率,在指定的時間間隔內作一件指定的事情
代碼以下

private void timer1_Tick(object sender, EventArgs e)
    {
        //截取字符串abcde
        //label1.Text拿到字符串,label1.Text.Substring(1)截取bcde
        //label1.Text.Substring(0, 1) 截取a,放到bcde後面
        label1.Text = label1.Text.Substring(1)+ label1.Text.Substring(0, 1);
    }

簡單記事本(textBox)
所需屬性
WordWrap:指示多行編輯控件是否自動換行
Visible:可見屬性包含兩個值
True使用此選項-文本框在父控件窗體上可見
False 使用此方法-文本框能夠隱藏在父控件窗體上
TextBox.Text.Trim():接收用戶輸入,不能接收用戶輸入的空格(開頭和結尾的空格)
TextBox.Focus :爲文本框設置焦點

因爲這個記事本有登錄功能,都在一個FORM上,因此在登錄時候須要隱藏掉一些按鈕及須要隱藏的內容,爲整個Form1設置Load屬性

private void Form1_Load(object sender, EventArgs e)
    {
        //第一步:因爲這個記事本有登錄功能,都在一個FORM上,因此在登錄時候須要隱藏掉一些按鈕及須要隱藏的內容
        //txtWords.WordWrap = false;
        btnSave.Visible = false;
        btnWordWrap.Visible = false;
        txtWords.Visible = false;
    }

隱藏掉按鈕以後,開始作登錄判斷的功能,爲登錄按鈕註冊設置事件

/// <summary>
    /// 登錄按鈕判斷是否登錄成功
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnLogin_Click(object sender, EventArgs e)
    {
        //接收用戶輸入的用戶名和密碼,不能接收用戶輸入的空格(開頭和結尾的空格)
        string name = txtName.Text.Trim();
        string pwd = txtPwd.Text.Trim();
        //判斷用戶名和密碼是否正確,正確或者錯誤該乾的事
        if (name == "admin" && pwd == "admin")
        {
            MessageBox.Show("歡迎進入記事本");
            //若是成功將第二個界面隱藏了的該出現的放出來,第一界面該隱藏的隱藏掉
            txtWords.Visible = true;
            btnWordWrap.Visible = true;
            btnSave.Visible = true;

            label1.Visible = false;
            label2.Visible = false;
            txtName.Visible = false;
            txtPwd.Visible = false;
            btnLogin.Visible = false;
            btnRest.Visible = false;
        }
        else
        {
            //不成功則提示錯誤
            MessageBox.Show("用戶名或密碼錯誤,請從新輸入!");
            //而後清空文本框內錯誤的內容
            txtName.Clear();
            txtPwd.Clear();
            //用戶名文本框得到焦點
            txtName.Focus();
        }
    }

開始作重置按鈕,重置按鈕需觸發清空兩個文本框及焦點在name文本框的焦點

/// <summary>
    /// 爲重置按鈕註冊事件
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnRest_Click(object sender, EventArgs e)
    {
        //重置按鈕需觸發清空兩個文本框及焦點在name文本框的焦點
        txtName.Clear();
        txtPwd.Clear();
        txtName.Focus();
    }

如今第一個界面及登錄、重置的功能完成,開始作第二界面換行切換,保存。

換行按鈕註冊事件

/// <summary>
    /// 自動換行
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnWordWrap_Click(object sender, EventArgs e)
    {
        //判斷當前是否自動換行
        //txtWors.WordWrap = true;
        //取消自動換行
        if (btnWordWrap.Text == "自動換行")
        {
            //取消自動換行
            txtWords.WordWrap = true;
            btnWordWrap.Text = "取消自動換行";
        }
        else if (btnWordWrap.Text == "取消自動換行")
        {
            txtWords.WordWrap = false;
            btnWordWrap.Text = "自動換行";
        }
    }

保存文本到指定的路勁下,爲保存按鈕註冊事件

/// <summary>
    /// 將文本保存到指定位置
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnSave_Click(object sender, EventArgs e)
    {
        using (FileStream fsWrite = new FileStream("new.txt", FileMode.OpenOrCreate, FileAccess.Write))
        {
            string str = txtWords.Text.Trim();
            byte[] buffer = System.Text.Encoding.Default.GetBytes(str);
            fsWrite.Write(buffer, 0, buffer.Length);
        }
        MessageBox.Show("保存成功");
    }

4、單選和多選
公共空間裏面的:checkBox(多選) radioButton(單選)
checkBox:多選框Checked屬性默認是否選中
radioButton:單選有一個問題,一個窗體中不管有多少單選只能選一個,這樣若是一個窗體中既有性別選擇,又有婚姻關係選擇就不能實現。這時候最簡單的辦法就是給單選框分組。
分組:容器--GroupBox

單選和多選的登陸練習

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnLogon_Click(object sender, EventArgs e)
    {
        if (radStudent.Checked || radTeachar.Checked)
        {
            string name = textName.Text.Trim();
            string pwd = textPwd.Text.Trim();
            //判斷是學生登陸仍是老師
            if (radStudent.Checked)
            {
                if (name == "student" && pwd == "student")
                {
                    MessageBox.Show("登陸成功");
                }
                else
                {
                    MessageBox.Show("登陸失敗");
                    textName.Clear();
                    textPwd.Clear();
                    textName.Focus();
                }
            }
            else
            {
                if (name == "teachar" && pwd == "teachar")
                {
                    MessageBox.Show("登陸成功");
                }
                else
                {
                    MessageBox.Show("登陸失敗");
                    textName.Clear();
                    textPwd.Clear();
                    textName.Focus();
                }
            }
        }
        else
        {
            MessageBox.Show("請先選學生或者老師");
        }
    }
}

5、MDI窗體的設計
frm4.MdiParent :標記子窗體屬於父窗體
LayoutMdi():橫縱向排列
一、首選肯定一個父窗體(新建父窗體)
二、新建須要的子窗體,能夠在父窗體中排列(新建對應數量的子窗體)
三、標記父窗體,窗體屬性:IsMdiContainer設置爲true
四、在父窗口上放菜單欄:菜單和工具,MenuStrip
五、建立子窗體,而且設置他們的父窗體 frm4.MdiParent
六、針對子窗體作橫向排列 LayoutMdi(MdiLayout.TileHorizontal);
七、針對子窗體作縱向排列 LayoutMdi(MdiLayout.TileVertical);

代碼以下

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void 顯示子窗體ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.MdiParent = this;
        frm2.Show();
        Form3 frm3 = new Form3();
        frm3.MdiParent = this;
        frm3.Show();
        Form4 frm4 = new Form4();
        frm4.MdiParent = this;
        frm4.Show();
    }

    private void 橫向排列ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.TileHorizontal);
    }

    private void 縱向排列ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        LayoutMdi(MdiLayout.TileVertical);
    }
}

6、圖片(pictureBox)
屬性
SizeMode:處理圖像的位置
得到指定文件夾的全部文件的全路徑
string[] path = Directory.GetFiles(@"C:\Users\Administrator\Desktop\Poth");

上一張和下一張圖片切換的練習

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
    {
        //設置圖片顯示佈局
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        //初始顯示的圖片
        pictureBox1.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\Poth\30536870.JPG");
    }
    int i = 0;
    //得到指定文件夾的全部文件的全路徑
    string[] path = Directory.GetFiles(@"C:\Users\Administrator\Desktop\Poth");
    /// <summary>
    /// 點擊更換下一張圖片
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        i++;
        if (i == path.Length)
        {
            i = 0;
        }
        pictureBox1.Image = Image.FromFile(path[i]);
    }

    /// <summary>
    /// 上一張的圖片
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        i--;
        if (i < 0)
        {
            i = path.Length - 1;
        }
        pictureBox1.Image = Image.FromFile(path[i]);
    }
}

pictureBox和Timer的小程序
實現多圖自動切換,並播放音樂

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //播放音樂
        SoundPlayer sp = new SoundPlayer();
        sp.SoundLocation = @"C:\Users\Administrator\Desktop\Poth\fire4-1.wav";
        sp.Play();
        //設置圖片顯示的佈局
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox3.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox4.SizeMode = PictureBoxSizeMode.StretchImage;
        //窗體加載的時候給每個PictyreBox都加載一張圖片
        pictureBox1.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\Poth\30536870.JPG");
        pictureBox2.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\Poth\30536870.JPG");
        pictureBox3.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\Poth\30536870.JPG");
        pictureBox4.Image = Image.FromFile(@"C:\Users\Administrator\Desktop\Poth\30536870.JPG");
    }

    //拿到圖片文件夾路徑放到數組裏面
    string[] path = System.IO.Directory.GetFiles(@"C:\Users\Administrator\Desktop\Poth");
    //圖片起始的播放位置
    int i = 0;
    Random r = new Random();
    private void timer1_Tick(object sender, EventArgs e)
    {
        //讓圖片下一張播放
        i++;
        //判斷圖片文件夾裏面的數組索引,超過了最大索引就將i變爲第一張圖片
        if (i == path.Length)
        {
            i = 0;
        }
        //給pictureBox賦值
        pictureBox1.Image = Image.FromFile(path[r.Next(0,path.Length)]);
        pictureBox2.Image = Image.FromFile(path[r.Next(0, path.Length)]);
        pictureBox3.Image = Image.FromFile(path[r.Next(0, path.Length)]);
        pictureBox4.Image = Image.FromFile(path[r.Next(0, path.Length)]);
    }
}
相關文章
相關標籤/搜索