闲来无事,打算写一系列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.代码终于复制完了,废话没有,收工。
标签:QQ,sender,C#,void,object,private,新手入门,Color,EventArgs From: https://www.cnblogs.com/ngcblog/p/17331627.html