【C#新手入门一】winform实现QQ登录窗口

发布时间 2023-04-18 23:36:16作者: 文~若

闲来无事,打算写一系列winform入门相关的小软件,算是对自己技术的一个复习和备忘,也希望能帮助刚入门的萌新(可能也帮不到,因为没有注释)

第一期先用winform最大限度的还原QQ的登录界面,下图左侧是仿真的,右侧是QQ的界面,很明显能看出来高仿的和正版的区别,哈哈!

 

这是效果展示

接下来直接上代码

1.创建一个winform窗体,将窗体设置为无边框

 2.右上角控制按钮的设置,使用Button即可,设置宽高和FlatStyle,三个按钮的背景图片去阿里巴巴图库上下载自己喜欢的png格式图片 

 按钮样式设置如下

 3.左上角的QQ小企鹅也是阿里巴巴图库下载,QQ两个字使用label即可,字体设置为华文细黑

4.接下来是上半部分蓝色的背景,可以使用背景图片,此处我是在窗体的Paint事件中用的gdi+自己重绘了一个简单的渐变色(注释是不可能有的)

 1         private void LoginForm_Paint(object sender, PaintEventArgs e)
 2         {
 3             Graphics graphics = e.Graphics;
 4             Rectangle rectangle = new Rectangle(0, 0, 218, 125);
 5             Color fromColor = Color.FromArgb(66, 84, 255);
 6             Color toColor = Color.FromArgb(124, 228, 255);
 7             Brush brush = new LinearGradientBrush(rectangle, fromColor, toColor, LinearGradientMode.ForwardDiagonal);
 8             graphics.FillRectangle(brush, rectangle);
 9 
10 
11             Rectangle rectangle1 = new Rectangle(218, 0, 218, 125);
12             Brush brush1 = new LinearGradientBrush(rectangle1, fromColor, toColor, LinearGradientMode.BackwardDiagonal);
13             graphics.FillRectangle(brush1, rectangle1);
14 
15         }

5.头像部分是使用了一个PictureBox,圆角有两种实现方式,一种是找png格式的圆角图片,此处我是用的是修改PictureBox的Region的方式

1      private void LoginForm_Load(object sender, EventArgs e)
2         {
3             GraphicsPath graphicsPath = new GraphicsPath();
4             graphicsPath.AddEllipse(this.picHead.ClientRectangle);
5             this.picHead.Region = new Region(graphicsPath);
6         }

 6.中间的账号密码部分分为3部分,1.左右的小图标,同样是下载图片使用PictureBox;2.文本输入部分使用TextBox,设置无边框,调整字体和字号;3.下划线,通过GDI+重绘

 重绘代码如下(不好意思,这个竟然有注释,我一定改掉这个坏毛病  )

1  private bool qqTxtFocus = false;
2  private bool pwdTxtFocus = false;
3  private bool qqTxtHover = false;
4  private bool pwdTxtHover = false;

 

 1   private void pnlInput_Paint(object sender, PaintEventArgs e)
 2         {
 3             //绘制QQ号下方横线
 4             Graphics g = e.Graphics;
 5             Color qqUnderline;
 6             if (qqTxtFocus)
 7             {
 8                 qqUnderline = Color.DodgerBlue;
 9             }
10             else
11             {
12                 if (qqTxtHover)
13                     qqUnderline = Color.Gray;
14                 else
15                     qqUnderline = Color.LightGray;
16             }
17             Pen qqPen = new Pen(qqUnderline, 1);
18 
19             g.DrawLine(qqPen, 5, 35, pnlInput.Width - 5, 35);
20             //绘制密码下方横线
21             Color pwdUnderline;
22             if (pwdTxtFocus)
23             {
24                 pwdUnderline = Color.DodgerBlue;
25             }
26             else
27             {
28                 if (pwdTxtHover)
29                     pwdUnderline = Color.Gray;
30                 else
31                     pwdUnderline = Color.LightGray;
32             }
33 
34             Pen pwdPen = new Pen(pwdUnderline, 1);
35             g.DrawLine(pwdPen, 5, 79, pnlInput.Width - 5, 79);
36         }

7.以下代码是实现文本框选中和鼠标悬浮的变化控制

 1  private void txtQQ_Enter(object sender, EventArgs e)
 2         {
 3             picQQ.BackgroundImage = Resources.sqqfocus;
 4             qqTxtFocus = true;
 5             this.pnlInput.Refresh();
 6         }
 7         private void txtQQ_Leave(object sender, EventArgs e)
 8         {
 9             picQQ.BackgroundImage = Resources.sqq;
10             qqTxtFocus = false;
11             this.pnlInput.Refresh();
12         }
13         private void txtQQ_MouseEnter(object sender, EventArgs e)
14         {
15             qqTxtHover = true;
16             this.pnlInput.Refresh();
17         }
18         private void txtQQ_MouseLeave(object sender, EventArgs e)
19         {
20             qqTxtHover = false;
21             this.pnlInput.Refresh();
22         }
23         private void txtPwd_Enter(object sender, EventArgs e)
24         {
25             picLock.BackgroundImage = Resources.pwdfocus;
26             pwdTxtFocus = true;
27             this.pnlInput.Refresh();
28         }
29         private void txtPwd_Leave(object sender, EventArgs e)
30         {
31             picLock.BackgroundImage = Resources.pwd;
32             pwdTxtFocus = false;
33             this.pnlInput.Refresh();
34         }
35 
36         private void txtPwd_MouseEnter(object sender, EventArgs e)
37         {
38             pwdTxtHover = true;
39             this.pnlInput.Refresh();
40         }
41 
42         private void txtPwd_MouseLeave(object sender, EventArgs e)
43         {
44             pwdTxtHover = false;
45             this.pnlInput.Refresh();
46         }

8.登录按钮鼠标悬浮和移出的变化控制

1      private void btnLogin_MouseEnter(object sender, EventArgs e)
2         {
3             btnLogin.BackgroundImage = Resources.btn1;
4         }
5 
6         private void btnLogin_MouseLeave(object sender, EventArgs e)
7         {
8             btnLogin.BackgroundImage = Resources.btn2;
9         }

9.最后,就是设置和最小化按钮鼠标悬浮的半透明背景的实现,此效果也可用替换对应背景图片的方式实现

 1   private bool settingHover = false;
 2         private bool minHover = false;
 3         private void btnMin_Paint(object sender, PaintEventArgs e)
 4         {
 5             Graphics g = e.Graphics;
 6             Rectangle rectangle = btnMin.ClientRectangle;
 7             if (minHover)
 8             {
 9                 SolidBrush solidBrush = new SolidBrush(Color.FromArgb(50, 255, 255, 255));
10                 g.FillRectangle(solidBrush, rectangle);
11             }
12             else
13             {
14                 SolidBrush solidBrush = new SolidBrush(Color.FromArgb(0, 255, 255, 255));
15                 g.FillRectangle(solidBrush, rectangle);
16             }
17         }
18         private void btnMin_MouseEnter(object sender, EventArgs e)
19         {
20             minHover = true;
21             btnMin.Refresh();
22         }
23         private void btnMin_MouseLeave(object sender, EventArgs e)
24         {
25             minHover = false;
26             btnMin.Refresh();
27         }
28         private void btnSetting_Paint(object sender, PaintEventArgs e)
29         {
30             Graphics g = e.Graphics;
31             Rectangle rectangle = btnSetting.ClientRectangle;
32             if (settingHover)
33             {
34                 SolidBrush solidBrush = new SolidBrush(Color.FromArgb(50, 255, 255, 255));
35                 g.FillRectangle(solidBrush, rectangle);
36             }
37             else
38             {
39                 SolidBrush solidBrush = new SolidBrush(Color.FromArgb(0, 255, 255, 255));
40                 g.FillRectangle(solidBrush, rectangle);
41             }
42         }
43 
44         private void btnSetting_MouseEnter(object sender, EventArgs e)
45         {
46             settingHover = true;
47             btnSetting.Refresh();
48         }
49         private void btnSetting_MouseLeave(object sender, EventArgs e)
50         {
51             settingHover = false;
52             btnSetting.Refresh();
53         }

 10.最最后,鼠标拖拽移动窗体位置代码

 1    private Point point;
 2         private void LoginForm_MouseDown(object sender, MouseEventArgs e)
 3         {
 4             if (e.Button == MouseButtons.Left)
 5             {
 6                 point = new Point(e.X, e.Y);
 7             }
 8         }
 9 
10         private void LoginForm_MouseMove(object sender, MouseEventArgs e)
11         {
12             if (e.Button == MouseButtons.Left)
13             {
14                 int diffX = e.X - point.X;
15                 int diffY = e.Y - point.Y;
16                 this.Location = new Point(this.Location.X + diffX, this.Location.Y + diffY);
17             }
18         }

end.代码终于复制完了,废话没有,收工。