前几天做一个程序,由于是基本新手,所以许多不会,现终于完事了,先记录下以便以后复习。
主要内容:
1、两个窗体frm_TPCalc(主窗体),frm_Login(登录窗口)
2、登录窗口要和主窗口皮肤一致,且主窗口支持换肤
---->要求登录窗口必须是主窗口的子窗体(目前水平认为必须这样,目前还是不行,因为虽然设置了但是子窗体关闭时主窗体才出来,无子窗体无法继承到)
3、登录窗口验证成功进入主窗体并将用户信息传入主窗体,验证失败仍然停留在登录窗口
---->3.1在子窗体定义属性获取用户信息然后主窗体调用;3.2主窗体要使用次用户信息的控件定义为公有;(这是自己最初的想法后来都不好使)
4、登录窗口直接退出(退出button或X)时,整个程序退出。
---->application.exit();是的用这个就行。(失败了)
用了几天做完后发现存在1个问题:登录窗口退出时,会出现窗口闪动,代码逻辑肯定有问题。
主要错误原因是登录窗口是主窗口ShowDialog出来的,子窗体关闭时回返回主窗体,用appliaction.exit了就会出现闪窗。
然后看网上些什么线程之类的也不会,然后就发帖请教。
继续改....直到成功代码如下:
在Program.cs中定义一个静态变量,用来实现登录窗口值的回传,这样就不必考虑frm_Login关闭时,frm_TPCalc还没有加载,无法将信息传入的尴尬,中转一下。
然后是直接ShowDialog出frm_Login,当frm_Login返回OK时(验证成功),才加载frm_TPCalc.
代码如下:
namespace Test
{
static class Program
{
public static string username;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//修改入口函数的首出窗口
frm_Login f_login = new frm_Login();
if (f_login.ShowDialog() == DialogResult.OK)
{
Application.Run(new frm_TPCalc());
}
}
}
}
然后在frm_Login中定义验证成功是返回DialogResult.OK
namespace ThermalPowerTool
{
public partial class frm_Login : Form
{
public frm_Login()
{
InitializeComponent();
}
private void btn_login_Click(object sender, EventArgs e)
{
if (TUser.Text != "" && TPwd.Text != "")
{
if (TUser.Text == "test" && TPwd.Text == "test")
{
//验证成功后将用户名传给Program定义的变量username
Program.username = TUser.Text.Trim();
//定义验证成功时返回值
this.DialogResult = DialogResult.OK;
MessageBox.Show("登录成功!");
}
else
{ MessageBox.Show("账户或密码错误!"); }
}
else
{ MessageBox.Show("请输入账户和密码!"); }
}
}
}
最后在frm_TPCalc中读取用户信息
private void frm_TPCalc_Load(object sender, EventArgs e)
{
//加载皮肤文件
skinEngine1.SkinFile = System.Windows.Forms.Application.StartupPath +@"\Themes\DeepOrange.ssk";
User.Text ="欢迎你:"+ Program.username;
User.Enabled = false;
}
整完后看看很简单,主要难处是不了解C#窗体加载事件流程和窗体传值的几种方法,还需继续学习。
现在还存的问题是加载皮肤后太卡,先寻找高效率的第三方皮肤,然后学习自己做或学习WPF(看着很好)。
然后就是想弄个验证成功后的启动画面,据说要用多线程,然后学习多线程,现在从网上下了点源码先弄出个样子看看。