www.wanyouc.com www.cnhgds.com www.yunweis.com
让我们来制作一个带菜单托盘程序,主窗体一直隐藏,通过托盘菜单可以调出子窗体.
1.> 新建一个新的Windows应用程序. 项目名为: WrmNotify.
2.> 将From1改名为:FrnMian
设置FrnMian的Text 属性为 :托盘菜单
添加一个 NotifyIcon 组件和一个 ContextMenuStrip组件到FrnMian中.默认设置
3> 设置NotifyIcon属性
( 因为默认所以控件名称为notifyIcon1同理ContextMenuStrip控件名称为 contextMenuStrip1)
设置notifyIcon1的Visible属性为True 表示该控件为可见.
设置notifyIcon1的的Icon属性,这里随便指定一个图标文件即可,主要是设置在系统栏中显示的图标,即托盘显示的图标.
设置notifyIcon1控件的ContextMenuStrip属性为 contextMenuStrip1,将用户单击托盘图标显示的菜单指向 contextMenuStrip1
设置notifyIcon1控件的的Text属性为: 杨云飞制作 ,表示鼠标悬停在托盘图标时显示的文本.
4> 设置 ContextMenuStrip的属性
设置contextMenuStrip1的Text 属性为托盘菜单
设置contextMenuStrip1的Items 属性即 设置菜单名称
这里 我们设置3个选项, 发布 接收 退出
可以这样设置: 点选 contextMenuStrip1 设置ToolStripMenuItem文本为 发布 接收 退出
如图<1>所示:
或者在FrnMian.Designer.cs文件中输入
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem 发布ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem 接收ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem 退出ToolStripMenuItem;
5> 设置 退出 响应事件
这里退出为退出整个程序
双击 图<1>中的 退出 进出 代码编辑界面, 编辑 退出 响应事件
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
退出ToolStripMenuItem.Enabled = false; //单击退出后 退出选项为不可用
if (MessageBox.Show("真的退出吗?", "退出", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{ //点击是后的代码
// this.Close(); //关闭当前窗口
Application.Exit(); //整个应用程序退出
}
else
{ //点击否后的代码
退出ToolStripMenuItem.Enabled = true;
}
}
6> 将主窗体隐藏
在Load事件事件中设置 notifyIcon1.Visible = true;
//Load事件
private void FrmMain_Load(object sender, EventArgs e)
{
notifyIcon1.Visible = true;
}
设置FrnMian 的 ShowIcon 和ShowInTaskbar 属性为 False
设置 FrnMian 的 WindowState 属性为Minimized 即开始时候最小化 这样主窗体就隐藏了
7> 设置 发布 响应事件
添加一个新的Windows应用窗体 命名为:FrmPostTask.cs
设置FrmPostTask窗体的Text属性为 发布信息 窗口标题显示文字 ,也可以不设置.
设置FrmPostTask的StartPosition 属性为 CenterScreen 即窗体第一次居中显示
注意FrmPostTask的其它属性根据自己的喜好设置
切换到主窗体 FrmMain 双击 图<1>中的 发布进出 代码编辑界面, 编辑 发布 响应事件
private void 发布ToolStripMenuItem_Click(object sender, EventArgs e)
{
//只打开一个发布窗口
发布ToolStripMenuItem.Enabled = false; //发布控件不可用
FrmPostTask frmPostTask = new FrmPostTask();
try
{
frmPostTask.ShowDialog(); //发布窗体显示
}
finally
{
frmPostTask.Dispose();//发布窗体关闭
发布ToolStripMenuItem.Enabled = true;//发布控件可用
}
}
这样就实现了 发布窗体的打开
8> 设置 接收 响应事件
参考7>编辑即可
新建 FrmViewTask.cs
Test 属性为 接收消息
主窗体接收响应事件为
private void 接收ToolStripMenuItem_Click(object sender, EventArgs e)
{
接收ToolStripMenuItem.Enabled = false;
FrmViewTask frmViewTask = new FrmViewTask();
try
{
frmViewTask.ShowDialog();
}
finally
{
frmViewTask.Dispose();
接收ToolStripMenuItem.Enabled = true;
}
}
9> 扩展 窗口间的传值
需要登录才能发布 登录成功以后不再弹出登录窗口
即第一次点发布的时候弹出登录框,登录成功不再弹出
首先新建一个Windows应用窗体命名为FrmLogin.cs
拖入6个控件到窗体中 Label TextBox Button 各2个 默认设置并布局好
将Label 1 Label 2的Text属性分别设置为" 用户名", "密 码"
将Button1 Button2的属性分别设置为 "登录", "取消"字体大小颜色等根据自己的喜好设置
图 2
设置FrmLogin的StartPostion属性为CenterScreen 窗口居中 显 示
Text属性为登录 ShowInTaskbar 属性为False 即不在任务栏 中显示
FormBorderStyle 属性为None即窗体不显示标题栏窗体大小和背景颜色等自由设置
这里我设置的是背景为黄色并将窗体的大小固定,简单的方法是将窗体和6个控件的布局调好后将 MaximumSize MinimumSize 的属性和Size的属性设置为一样的 这样窗体就构造好了. 如图2所示
在 主窗体 FrmMain中加入如下代码, 设置属性可以向子窗体传值
private bool _adminLogin; //是否登录
public bool AdminLogin //属性
{
get
{
return _adminLogin;
}
set
{
_adminLogin = value;
}
}
将 FrnMian_Load()修改为
private void FrnMian_Load(object sender, EventArgs e)
{
notifyIcon1.Visible = true;
AdminLogin = false; //为AdminLogin赋初值,表示首次运行没有登录
}
将 发布ToolStripMenuItem_Click(object sender, EventArgs e)修改为
private void 发布ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!AdminLogin)
{
发布ToolStripMenuItem.Enabled = false;
FrmLogin frmLogin = new FrmLogin();
try
{
frmLogin.Owner = this;///重要的一步,主要是使Form2的Owner指针指向Form1
frmLogin.ShowDialog();
}
finally
{
frmLogin.Dispose();
发布ToolStripMenuItem.Enabled = true;
}
}
if (AdminLogin)
{
发布ToolStripMenuItem.Enabled = false;
FrmPostTask frmPostTask = new FrmPostTask();
try
{
frmPostTask.ShowDialog();
}
finally
{
frmPostTask.Dispose();
发布ToolStripMenuItem.Enabled = true;
}
}
}
转到 FrmLogin 窗体双击 图2所示的 取消按钮 进入取消按钮(button2)的事件响应 代码如下:
private void button2_Click(object sender, EventArgs e)
{
Close();//关闭当前窗体;
}
这个时候我们运行程序 可以发现 点击 发布时进入的是登录窗体,而且 发布按钮为不可用
点击登录窗体的取消按钮我们会发现登录窗体消失 发布按钮可用
在点击还是进入登录界面 这是因为我们对登录没有做处理
转到FrmLogin 窗口 双击 图2所示的 确定 按钮 进去确定(button1)的事件响应 代码如下:
private void button1_Click(object sender, EventArgs e)
{
string s1 = textBox1.Text.ToString();
string s2 = textBox2.Text.ToString();
if (s1 == "")
{
MessageBox.Show("用户名为空");
textBox2.Text = "";
textBox1.Focus(); //用户名为空返回游标指向用户名输入处
return;
}
if (s2 == "")
{
MessageBox.Show("密码为空为");
textBox2.Focus(); //密码为空返回游标指向密码输入处
return;
}
if (s1 != "" && s2 != "")
{
string usename = "yangyunfei";
string password="yangyunfei";
if (s1 == usename && s2 == password)//比较登录用户名和密码
{
MessageBox.Show("登录成功!");
}
else
{
MessageBox.Show("用户名或密码错误!");
textBox1.Text = "";
textBox2.Text = "";
return;
}
textBox1.Text = "";
textBox2.Text = "";
FrmMian lForm1 = (FrmMian)this.Owner;//把Form2的父窗口指针赋给lForm1
lForm1.AdminLogin = true;//使用父窗口指针赋值
Close();
}
}
这个时候运行程序会发现当我们输入正确的用户名和密码的时候,登录框消失 打开发布窗口, 我们关闭发布窗口.点击 托盘中 发布 打开的还是发布窗体 不再显示登录窗体 ,说明 登录窗体修改了主窗体的值.
补充说明 : 登录窗体的密码显示的是明文 ,设置 textBox2的 UseSystmPasswordChar属性为True 就可以了 再次运行就成功了.