一年一度的中秋节马上就到啦,小伙伴们收到月饼了吗。
记得我的学生时代,邮件祝福还风靡过一段时间,打开QQ邮箱,各种转发邮件和祝福邮件,现在想想都觉得有点久远了。
相信小伙伴们也都用过群发邮件的功能,例如QQ邮箱,163邮箱等都有提供这种功能,直接发送或者密送都可以。但都会存在一个问题,就是一键发送时,邮件内容都是一样的,无法针对收件人而有个性化的称呼。针对这个需求,我们可以做一个群发邮件的桌面端软件。
我们首先整理下我们需要实现的最简单的功能:
- 可以输入并记住账号和密码
- 可以导入收件人信息
- 可以自由选择收件人
- 邮件内容可以针对收件人进行个性化修改,可以输入邮件标题,可以附带图片
- 有发送邮件的功能
需求整理完成,说干就干。
布局
首先新建一个窗体,定义为MainForm。将MainForm的初始状态修改为一打开就最大化。
= FormWindowS;
我们可以用GroupBox将Mainform划分为三部分,“登录信息”,“收件人信息”,还有“邮件内容”,如图:
Tips:因为我们默认窗口最大化,所以我们需要先设置三个GroupBox的Anchor属性,依次分别为“Top,Bottom,Left”,“Top,Bottom,Left”和“Top,Bottom,Left,Right”。这样GroupBox就会随窗口大小变化而不至于打乱布局。
控件
划分布局之后,在每一个GroupBox中增加我们需要的控件。
“登录信息”:
两个Label(标注“账号”与“密码”);
两个TextBox(用来输入账号与密码);
两个CheckBox(一个用来记住账户密码,一个用来隐藏密码)。
用TextBox输入密码时,我们可以设置TextBox的UseSystemPasswordChar属性为True,则我们输入的文字都会以密文显示。与CheckBox联动,默认勾选CheckBox时,密码以符号显示,不勾选CheckBox时,密码以明文显示。
代码如下:
private void cbShowPwd_CheckedChanged(object sender, EventArgs e) { if == true) { = false; } else { = true; } }
实际效果如图:
记住账户与密码涉及本地存储,我们后面具体写代码时再来实现这个功能,先按住不提。
“收件人信息”:
一个CheckBox(全选功能);
一个CheckListBox(用来显示导入的收件人信息);
两个Button(一个用来导入文件,一个用来确认选择收件人);
一个Label(用来显示已选择的收件人数量)。
关于CheckListBox的相关设置与全选功能具体可以查看我的上一篇文章(「Winform开发小技巧05」批量操作单号-CheckListBox)
全选功能代码:
private void cbSelectAll_CheckedChanged(object sender, EventArgs e) { //全选功能 if ) { for (int i = 0; i < ; i++) { if (!(i)) (i,true); } } else { for (int i = 0; i < ; i++) { if ((i)) (i, false); } } }
这里的操作逻辑是:点击Button导入收件人=>CheckListBox显示收件人=>全选=>Label显示已选人数=>点击Button确认选择,收件人数据传输到下一个部分“邮件内容”。
导入功能我们可以写一个方法,这里先暂时不写。
我们可以先解决Label的显示问题。Label显示选择人数时,需要根据CheckListBox中Item的实时勾选状态进行变化,这个比较有趣,我们可以在CheckListBox的Itemcheck事件中实现。
代码如下:
private void clbReceivers_ItemCheck(object sender, ItemCheckEventArgs e) { //这个事件是指示某项的选中状态将要被更改、在更改前会执行这个事件 //所以c获取的是更改之前的值 if == C) { = "已选:"+ + 1).ToString(); } else { = "已选:" + - 1).ToString(); } }
实际效果如图:(因为还没有数据,为了展示效果,我先手动输入一些数据)
“邮件内容”:
两个Label;
两个TextBox(一个用来显示收件人,一个用来输入标题,显示收件人我们可以将其MultiLine属性设置为True,这样可以多行显示);
一个RichTextBox(用来输入正文内容,后期我们用Html来发送文件,RichTextBox方便我们输入段落及图片);
一个Button(用来确认发送邮件)。
效果如图:
至此,我们的布局就全部完成了!
但是大家又没有发现一个问题,由于Winfrom界面缩放问题,我们生成的界面有点模糊,很难看,针对这个问题,微软有专门的解决方案。
首先右键项目=>添加新建项=>添加应用程序清单文件。
打开a文件,取消application节点注释
打开A文件,添加节点EnableWindowsFormsHighDpiAutoResizing,值为true
此时我们重新按F5进行编译,可以发现界面分辨率正常了,瞬间好看不少有没有。
下篇文章,我们就开始正式编码了,或许可以赶上中秋给大家拜个晚年了,哈哈哈
如果各位觉得我写的对你有那么一点点帮助,欢迎一键三连~感激不尽~