C# WinForm基础二 控件、对话框类、容器、进程、线程

来源:互联网 发布:java实现视频播放 编辑:程序博客网 时间:2024/05/21 22:59

一、WebBrowser  浏览器控件 (嵌入浏览器)

1、拖入窗体中,点击右上角三角符号,取消在父容器的停靠,就可以编辑大小了

2、重要的属性:Url

在”访问“控件点击事件里添加语句:

webBrowser1.Url = new Uri("http://"+ textBox1.Text);
就可以访问textBox中输入的网页


二、ComboBox  下拉框

添加项语句:ComboBox1.Item.Add(“”);
它还有一个选择事件:SelectedIndexChanged


三、ListBox  列表框

添加项语句与ComboBox一样

重要事件为:鼠标双击事件(DoubleClicked)


四、小游戏:石头剪刀布

将三种出拳结果模拟成数字,便于计算判断输赢;  石头:1   剪刀 :2    布:3

新建三个类:玩家、电脑、裁判

玩家类有一个方法:接收点击的控件内容,返回一个模拟数字

电脑类有一个电脑出拳属性、还有一个产生随机数的方法,方法中还包括判断随机数,给属性赋值,并返回随机数字

裁判类因不需要实例化,写成静态类,直接调用。定义一个枚举{玩家赢,电脑赢,平手}储存结果,写一个方法,

传入前面两个两步返回的模拟数字,判断输赢,将各自结果返回,返回值是枚举类型

将得到的结果用ToString()方法得到字符串结果


五、打开对话框和保存对话框

打开对话框类:

//打开文件对话框            OpenFileDialog openFile = new OpenFileDialog();            openFile.Title = "请选择要打开的文件";  //对话框标题            openFile.Multiselect = true; //设置对话框可以多选            openFile.InitialDirectory = @"C:\Users\tufeiax\Desktop";//获取对话框的初始目录            openFile.Filter = "文本文件|*.txt|图片文件|*.jdg|所有文件|*.*";            openFile.ShowDialog();            try            {                //获取对话框选择的文件和路径                string path = openFile.FileName;                //创建文件操作对象                using (FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read))                {                    byte[] buffer = new byte[1024 * 1024 * 5];                    //实际读取的字节数                    int r = fsRead.Read(buffer, 0, buffer.Length);                    textBox1.Text = Encoding.Default.GetString(buffer);                }            }            catch (Exception)            {                                return;            }

保存对话框类:

 SaveFileDialog save = new SaveFileDialog();            save.Title = "请选择要保存的路径";            save.InitialDirectory = @"C:\Users\tufeiax\Desktop";            save.Filter = "文本文件|*.txt|图片文件|*.jdg|所有文件|*.*";            save.ShowDialog();            string path = save.FileName;            try         {                using(FileStream fsWrite = new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write))                {                    byte[] buffer = Encoding.Default.GetBytes(textBox1.Text);                    fsWrite.Write(buffer,0,buffer.Length);                    }        }        catch (Exception)        {        return;        }            MessageBox.Show("保存成功!");

六、字体对话框和颜色对话框:

 //创建字体对话框对象            FontDialog font = new FontDialog();            font.ShowDialog();            textBox1.Font = font.Font;
//创建颜色对话框对象            ColorDialog cl = new ColorDialog();            cl.ShowDialog();            textBox1.ForeColor = cl.Color;

七、Panel容器

统一控制一堆控件是否可见。重要属性:Visible。设置不可见,那么Panel容器内的所有控件都会被隐藏


八、进程类 Process

//获得程序中所有正在运行的进程            Process[] pros = Process.GetProcesses();            foreach (var item in pros)            {                //item.Kill();   //关掉所欲进程                Console.WriteLine(item);            }            //通过进程打开一些应用程序            Process.Start("calc");            Process.Start("mspaint");            Process.Start("notepad");            Process.Start("iexplore", "http://www.baidu.com");
//通过进程打开指定的文件            //1.创建进程对象            Process p = new Process();            //配置要打的文件            p.StartInfo = new ProcessStartInfo(@"C:\Users\tufeiax\Desktop\学习C#数据库编程的问题.txt");            p.Start(); //打开

九、线程类 

1、为什么要用多线程:单线程会造成程序假死

1)、可以让计算机“同时”做多件事情,节约时间

2)、后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况

3)、获得当前线程和当前进程


2、创建线程:比如有一个很复杂的方法test()

//创建一个线程去执行方法            Thread th = new Thread(Test);
th.Start(); //标记这个线程准备就绪,随时可以被执行,CPU会自行空闲时执行


3、前台线程和后台线程
前台线程:只有所有的前台线程关闭才能完成程序关闭

后台线程:只要所有的前台线程结束,后台线程自动结束
将以上自己创建的线程设置为后台线程:

th.IsBackground = true;  //是否设置为后台线程

4、跨线程访问:

新建的线程要访问主线程中创建的控件。会报异常 ,报错原因:.Net下不允许跨线程访问

但可以取消跨线程异常捕获:

在加载窗体事件里写入如下代码:

//取消跨线程访问检验            Control.CheckForIllegalCrossThreadCalls = false;


5、跨线程访问时,释放资源的异常

在关闭窗体时,有时自己建的线程还未结束,依然在调用主线程的控件,会导致主线程控件资源无法释放的异常

这时需要在窗体关闭事件里手动关闭线程:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)        {            //关闭窗体时,判断新线程是否为null,如果不为null,手动关闭            if (th != null)                th.Abort();        }
6、线程的静态方法:Sleep  ---控制线程休眠等待

Thread.Sleep(3000);            Console.WriteLine("Hello World");            Console.ReadKey();

7、如果新建的线程要执行的方法是有参数的,那这个参数必须是object类型的,并且参数传入是在Start方法传入

 private void Test(object s)        {        }        private void button1_Click(object sender, EventArgs e)        {            Thread th = new Thread(Test);            th.IsBackground = true;            th.Start("123");   //传入参数在此处        }
8、线程练习:摇奖机

1)先写一个方法,实现三个label循环随机赋值:

private void PlayGame()        {            Random r = new Random();            while(b)            {                label1.Text = r.Next(0, 10).ToString();                label2.Text = r.Next(0, 10).ToString();                label3.Text = r.Next(0, 10).ToString();            }        }
2)设定控件是否是开始摇奖的bool变量初值:

bool b = false;
然后在按钮点击事件中判断是开始还是停止,开始则用新建线程调用摇奖方法,停止,则不调用,数字停止:

if(b==false)  //进来时是false,第一次点击按钮时执行            {                btnStart.Text = "停止";                b = true;                Thread th = new Thread(PlayGame);                th.IsBackground = true;                th.Start();            }             else   // b=true  第二次点击按钮时执行            {                btnStart.Text = "开始";                b = false;            }
3)窗体加载时给一个跨线程访问控件检查设置为否:

Control.CheckForIllegalCrossThreadCalls = false;



















0 0
原创粉丝点击