C#实现UI控件输出日志的方法详解
作者:Csharp小记 发布时间:2021-10-07 02:45:41
标签:C#,UI控件,输出,日志
文章描述
一般情况下,我们的日志文件是用来记录一些关键操作或者异常,并且是后台存储,并不对外开放的;但是也有些时候,特别是做一些小工具程序,需要将一些操作步骤、记录等直接显示在窗体上。以便于使用者能够知道执行进度等情况。
所以,我们可以简单封装一下,写个专门用来输出日志的控件;并且以不同的颜色表示不同的状态,让日志更直观明了。
如果将以下自定义控件放到控件库中(即在新建项目的时候选择Windows窗体控件库),在其他程序中使用起来就很方便了,只要将这个dll拖到工具箱面板中,就可以在工具箱中看到这个控件。使用的时候直接从工具箱中拖出来就可以了。
开发环境
.NET Framework版本:4.5
开发工具
Visual Studio 2013
实现代码
public partial class ui_log : ListBox
{
public ui_log()
{
InitializeComponent();
this.DrawMode = DrawMode.OwnerDrawFixed;
this.BackColor = Color.Black;
this.Font = new Font("黑体", 12);
}
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
if (e.Index >= 0 && this.Items.Count>0)
{
dynamic item = this.Items[e.Index];
Brush brush = new SolidBrush(item.Color);
e.Graphics.DrawString(item.Text, e.Font, brush, e.Bounds, StringFormat.GenericDefault);
}
}
public void Log(string text, Color color)
{
if (this.InvokeRequired)
{
this.Invoke(new Action(() => { Log(text, color); }));
return;
}
this.Items.Add(new { Color = color, Text = text });
this.SelectedIndex = this.Items.Count - 1;
}
public void LogInfo(string text)
{
Log(text, Color.Green);
}
public void LogError(string text)
{
Log(text, Color.Red);
}
public void LogWarinig(string text)
{
Log(text, Color.Yellow);
}
public void ClearLog()
{
this.Items.Clear();
}
}
private void button1_Click(object sender, EventArgs e)
{
ui_log1.LogInfo("Info");
Thread.Sleep(300);
ui_log1.LogError("Error");
Thread.Sleep(300);
ui_log1.LogWarinig("Warinig");
Thread.Sleep(300);
ui_log1.Log("White", Color.White);
}
private void button2_Click(object sender, EventArgs e)
{
ui_log1.ClearLog();
}
实现效果
代码解析:首先是写了一个自定义控件,继承自ListBox;然后设置下DrawMode属性,这个很重要,否则不会触发DrawItem;最后在DrawItem事件中,对数据进行重绘。
做完上述处理后,就不要直接使用Items.Add了,需要对Items.Add也进行一次封装,将颜色也传进去,即:this.Items.Add(new { Color = color, Text = text });
来源:https://mp.weixin.qq.com/s/jhH3Ov6kZDdfWdAci6vV3w
0
投稿
猜你喜欢
- 虽然GUI技术没有很大的市场,甚至很多初学者放弃学习GUI,但是学习GUI编程的过程对于提高编程兴趣,深入理解Java编程有很大的作用。效果
- 1. 单个属性yaml 内的属性如下:server: port: 80只需在成员变量上注解 @Value(“
- 1、声明一个测试对象import java.time.LocalDate;import java.util.List;import lomb
- 1.多数元素题目描述思路详解这个思路比较简单,先排序,排序过后遍历如果后一个等于前一个输出就好代码与结果class Solution { &
- 本文实例为大家分享了java实现简单快递系统的具体代码,供大家参考,具体内容如下创建四个类Express,Locker, User, Adm
- 文件流输出文件名中文不显示response返回文件流 用response.setHeader(“Content-disp
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,
- 引言周五去面试又被面试的一个问题问哑巴了面试官:StringBuilder和StringBuffer的区别在哪?我:StringBuilde
- 目录1. 什么是XSS攻击?2. 如何防范?2.1 什么时候注入请求参数3. 具体处理细节1. 什么是XSS攻击? &
- 第一步:引入jar包 <dependency> <gro
- Java Collection API提供了一些列的类和接口来帮助我们存储和管理对象集合。其实Java中的集合工作起来像是一个数组,不过集合
- 一、基本介绍(Nexus(maven * ))1,如果没有搭建 * 会有什么问题?如果没有 * ,我们所需的所有构件都需要通过 Mave
- AssertJ是我目前见过的最强大的断言api,没有之一。官网传送门为什么使用assertJ?1、流式断言,代码即用例,直观易懂。举个例子:
- 注意我这里用的是官方最稳定的版本3.7.1,版本之间有个别命令是有差距的!1.zkCli.sh客户端zkCli.sh可以理解成客户端,也可以
- 前言:使用 interrupt 来通知线程停止运行,而不是强制停止!普通情况停止线程public class Right
- java的String对象底层是有字符数组存储的,理论上char[] 最大长度是int的最大值,实际思路:首先,String字面
- 1 起因在实际业务开发中, 我们经常会遇到需要临时创建一个数组的情况, 今天我们就来讲一下Java中ArrayList初始化的方法2 解决方
- 一般情况下每个spring boot工程启动都有固定的端口,但是固定端口不利用服务的动态扩容,如果在一台服务器上需要对同一个服务进行多实例部
- Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这就涉及到部分数据是不能原封返回的,比如服务之间通信的凭证,用户的加