首页 > 编程语言 >【C#新手入门一】winform实现QQ登录窗口

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

时间:2023-04-18 23:48:19浏览次数:62  
标签:QQ sender C# void object private 新手入门 Color EventArgs

闲来无事,打算写一系列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

相关文章

  • Educational Codeforces Round 113 (Rated for Div. 2)
    题目链接B核心思路这个题目我觉得很好。首先分析下吧,如果有人需要执行操作二那么我们肯定就是给他们都打上平局是最优的。那么如果有人需要执行操作一呢,那么我们就可以把这些需要执行操作1的都搞一起。然后是他们成一个环。这样肯定就保证了每个人都会赢上一次。C核心思路......
  • Pandas另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【eric】问了一个Pandas的问题,这里拿出来给大家分享下。另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?另存为excel的时候我想从B列开始存储,不想要A列,应该怎么处理呢?我看start_col=1的时候,A列还是存在,只不过......
  • C++ const关键字
    参考资料:【C++const的各种用法详解】【const用法深入浅出】-COS-博客园(cnblogs.com)const的基本概念:const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。下面我就const的用法......
  • 在线客服系统访客发送录音功能,在elementui中使用js-audio-recorder实现录音功能,然后上
    访客在聊天界面中可以发送语音,其实就是录音以后,调用上传接口,把录音文件发送给客服。 点击麦克图标以后,展示出一个elementui的dialog弹窗,里面展示四个功能按钮。分别是,开始录音,结束录音,取消录音,发送录音。基本流程就是点开始,然后点结束,再点发送。下面是聊天界面中的dialog弹窗......
  • Typora 1.5.12 (windows/MacOs版) 简单高效且实用的Markdown编辑器
    简介Typora的设计理念非常人性化,与传统编辑器相比,更注重用户的视觉效果和阅读体验。它的编辑界面非常简洁,用户可以就近编辑,随时查看效果,避免频繁地转换预览模式,提高了工作效率和灵活性。此外,Typora软件还提供了诸如内置思维导图、目录和常用快捷键等便捷功能,可以让用户在编辑的......
  • Arch Linux关机缓慢
    问题描述:ArchLinux关机、重启时非常缓慢,基本都是十分钟以上。问题原因:参照GitHub中发现是nouveau导致的关机缓慢。解决办法:尝试了网络上普遍的把nouveau加入黑名单,但是并没有解决。最终是在grub中禁用nouveau解决。sudovim/etc/default/grub在GRUB_CMDLINE_LINUX_DEFA......
  • Elasticsearch搜索功能的实现(五)-- 实战
    实战环境elasticsearch8.5.0+kibna8.5.0+springboot3.0.2+springdataelasticsearch5.0.2+jdk17一、集成springdataelasticsearch1添加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st......
  • cpp:Double Dimensional Array using vector 2
     //StudentArry.h:此文件包含"StudentArry"类。学生数组成绩显示方法C++14//2023年4月9日涂聚文GeovinDuedit.//(1)vec1.size()就是”二维数组”的行数//(2)vec1[0].size()就是”二维数组”的列数//vector<vector<double>>geovindu#pragmaonce#ifndefSTUD......
  • k8s中command、args && dockerfile中entrypoint、cmd之间的比较
    k8s中command、args&&dockerfile中entrypoint、cmd之间的比较标签(空格分隔):K8SDockerfile中ENTRYPOINT,CMD的比较ENTRYPOINT的两种格式:ENTRYPOINT["executable","param1","param2"](exec格式,推荐)ENTRYPOINTcommandparam1param2(shell格式)C......
  • Elasticsearch搜索功能的实现(三)-- 相似度
    一、开箱即用的相似度配置Elasticsearch允许您配置文本评分算法或每个字段的相似度。相似度设置提供了一种选择缺省BM25之外的文本相似度算法的简单方法,例如:boolean只有基于文本的字段类型(如文本和关键字)支持此配置。唯一可以开箱即用的相似之处,无需任何进一步配置包括:BM25......