0%

【C#】“小时钟”知识点总结

一个小时钟看似功能简单,但却使用了多窗口、侧边栏停靠、timer触发等等重要的图形化应用知识。下面将对每一个知识进行单独总结,方便日后学习。

窗口类

①创建和控制多窗口

创建多窗口:在项目名上右键,添加,windows窗口。 控制多窗体: 首先,用新创建的窗体类(窗体名即类名)实例化一个窗体对象 在某个控件被触发时,使用方法Show.对象名()弹出目标窗口(ShowDialog.对象名()可以在弹出新窗体后禁用原窗体(无法操作化)) 如,想让窗体Form1在一开始便弹出窗体clock1,可用以下语句

1
2
3
4
5
6
7
8
9
public partial class Form1 : Form
{
clock clock1 = new clock();
public Form1()
{
InitializeComponent();
clock1.Show ();//窗口Form1一载入即载入窗口clock1
}
}

②更改窗口参量

Ⅰ.更改窗口参量时,对于多窗口使用窗口方法名.参量,没有就先实例化,对于本窗口自身直接用This.参量。 Ⅱ.有的参量是变量,比如布尔型的True、False可以直接赋值,但是如果提示不是变量就需要用new实例化进行“赋值”。 Ⅲ.如果参量不是静态的,比如时间,要将此传输进This.Text,但是This.Text只支持静态参量,就可以利用Timer控件,在控件中创建一个静态变量,并且此静态变量每秒刷新一次,将此静态变量赋给This.Text即可。

“抹除”窗口背景:

1
2
this.BackColor = System.Drawing.Color.Black;//随便传送一个颜色
this.TransparencyKey = System.Drawing.Color.Black;//将传送的颜色设置为透明,该方法设置的透明可以透过窗体使鼠标点击下方控件

使用该方法“抹除”背景后,鼠标可直接操作原背景框下面的程序,除非有自身控件挡住,但该方法无法更改透明度,完全透明的背景会使字体边框有残痕,很不美观。

取消挂载任务栏:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
this.ShowInTaskbar = false;//不在任务栏显示```
<h4>窗口置顶:</h4>

```csharp
this.TopMost = true;//窗口置顶```
<h4>更改窗体透明度:</h4>

```csharp
this.Opacity = 0.5D;//传入double型变量```

注意该方法更改窗体透明度后窗体内的空间透明度也会随之改变。
<h4>更改窗口位置:</h4>

```csharp
this.Location = new Point(X,Y);//不是变量、无法更改的窗口参量可以用new设置```

(X,Y)是一个点,单独更改某一个参量也可以用this.Location.Height和this.Location.Weight。
<h4>更改字体/大小:</h4>

```csharp
this.Font = new System.Drawing.Font("宋体", 15);```

 
<h4>更改窗口状态:</h4>

```csharp
this.Visible = false; //隐藏
this.WindowState = FormWindowState.Minimized; //最小化
this.WindowState = FormWindowState.Maximized; //最大化
this.WindowState = FormWindowState.Normal; //正常
</code></pre>

 

 

<h1>控件类</h1>

<h2>①实体控件</h2>

 

<h4>label标签:</h4>

更改字体颜色:

<pre><code class="language-csharp line-numbers">this.label1.ForeColor = Color.FromArgb(211, 210, 199); //柔和灰```

<strong>trackbar轨迹条:</strong>

获取,更改当前值:trackbar1.Value
<h4><strong>combobox组合框:</strong></h4>
<strong>添加组合</strong>:将鼠标移到组合框上单击,选择黑色箭头,选择编辑项<img class="alignnone size-full wp-image-433" src="http://47.94.231.166/wp-content/uploads/2018/08/devenv_2018-08-18_10-23-07.png" alt="" width="990" height="561" />

<strong>选择组合</strong>:添加选项后,编译器将自动生成目录(index),编程时,既可以根据选项值选择,也可以根据目录选择。

根据选项值选择:

```csharp
switch (comboBox1.SelectedItem.ToString())//按选项值选择
{
case "深黑": clock1.label1.ForeColor = Color.FromArgb(1, 1, 1); break;
case "纯白": clock1.label1.ForeColor = Color.FromArgb(255, 255, 255); break;
case "柔和灰": clock1.label1.ForeColor = Color.FromArgb(211, 210, 199); break;
case "荷兰白": clock1.label1.ForeColor = Color.FromArgb(226, 225, 185); break;
case "日本靛蓝": clock1.label1.ForeColor = Color.FromArgb(42, 61, 69); break;
case "深帝国蓝": clock1.label1.ForeColor = Color.FromArgb(5, 60, 94); break;
case "简约蓝": clock1.label1.ForeColor = Color.FromArgb(31, 122, 140); break;
case "赭石色": clock1.label1.ForeColor = Color.FromArgb(211, 139, 93); break;
}```

按目录选择:

```csharp
switch (comboBox1.SelectedIndex)//按目录选择
{
case 0: clock1.label1.ForeColor = Color.FromArgb(1, 1, 1); break;
case 1: clock1.label1.ForeColor = Color.FromArgb(255, 255, 255);break;
case 2: clock1.label1.ForeColor = Color.FromArgb(211, 210, 199); break;
case 3: clock1.label1.ForeColor = Color.FromArgb(226, 225, 185); break;
case 4: clock1.label1.ForeColor = Color.FromArgb(42, 61, 69); break;
case 5: clock1.label1.ForeColor = Color.FromArgb(5, 60, 94); break;
case 6: clock1.label1.ForeColor = Color.FromArgb(31, 122, 140); break;
case 7: clock1.label1.ForeColor = Color.FromArgb(211, 139, 93); break;
}```
<h2>②虚拟控件</h2>
<h4>timer控件:</h4>
timer控件可以按时间触发事件,以毫秒为单位(1s=1000ms)

<strong>建立:</strong>使用时,将工具箱里的timer控件拖入窗体即可,在下方就可以找到该控件,右击属性可以设置间隔时间。

<strong>触发:</strong>在动作_Tick中可直接设置间隔时间到时出发的动作

```csharp
public void timer1_Tick(object sender, EventArgs e)//设置更新时间,自动更新时间,传送静态值到label1.Text,绕过了不能直接传送动态值的问题
{
label1.Text = DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second;//更新目前时间到label1.Text
}```

<strong>notifyIcon状态栏图标控件:</strong>

可以在状态栏创建应用图标,在单击时可出发动作。

<strong>建立:</strong>与timer一样直接拖入即可,但是notifyIcon一定要在属性中设置图标,否则不会再状态栏显示。

<strong>触发:</strong>可设置多种触发方式,如单击双击等,一般触发后代码为还原窗体大小+激活窗体

```csharp

private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)//点击状态栏的触发效果
{
if (WindowState == FormWindowState.Minimized)//最小化时
{
//还原窗体显示
WindowState = FormWindowState.Normal;
//激活窗体并给予它焦点
this.Activate();
}
}

技巧

①保存设置

对解决方案右键,添加,新建项,选择设置文件,对文件命名。 调用设置:直接将“设置名.Default.变量名”赋给目标变量即可 存储设置:直接讲变量赋给“设置名.Default.变量名”,然后键入设置名.Default.Save();

②鼠标穿透

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System.Runtime.InteropServices;

private const uint WS_EX_LAYERED = 0x80000;
private const int WS_EX_TRANSPARENT = 0x20;
private const int GWL_STYLE = (-16);
private const int GWL_EXSTYLE = (-20);
private const int LWA_ALPHA = 0;

[DllImport("user32", EntryPoint = "SetWindowLong")]
private static extern uint SetWindowLong(
IntPtr hwnd,
int nIndex,
uint dwNewLong
);

[DllImport("user32", EntryPoint = "GetWindowLong")]
private static extern uint GetWindowLong(
IntPtr hwnd,
int nIndex
);

[DllImport("user32", EntryPoint = "SetLayeredWindowAttributes")]
private static extern int SetLayeredWindowAttributes(
IntPtr hwnd,
int crKey,
int bAlpha,
int dwFlags
);

/// <summary>
/// 设置窗体具有鼠标穿透效果
/// </summary>
public void SetPenetrate()
{
GetWindowLong(this.Handle, GWL_EXSTYLE);
SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_TRANSPARENT WS_EX_LAYERED);
SetLayeredWindowAttributes(this.Handle, 0, 100, LWA_ALPHA);
}
//以上是鼠标穿透的代码,原代码来自网址:https://bbs.csdn.net/topics/390325341