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

本文介绍了C# WinForm开发中的关键元素,包括WebBrowser控件的使用,ComboBox和ListBox的事件处理,以及实现石头剪刀布小游戏的逻辑。还讨论了打开和保存对话框,进程类Process的应用,多线程的必要性和实现,以及跨线程访问控件时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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;



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值