C# 中的钢琴键控件






4.30/5 (16投票s)
2004 年 2 月 23 日
3分钟阅读

172536

9024
一个用于 .NET Framework 的钢琴键控件
引言
几个月前,我使用 MFC 创建了一个钢琴控件。过去一年开始使用 C# 之后,我最近决定为 .Net framework 重新创建该控件。然而,在再次审视将钢琴键盘表示为 GUI 控件的挑战之后,我决定采取不同的方法。
钢琴键
为 MFC 创建钢琴控件的挑战之一是决定如何表示钢琴键。控件的第一个版本将每个键分成一个或多个矩形。在第二个版本中,我切换到使用区域。无论哪种方法,每个钢琴键都只是一组坐标,封装在钢琴键类中并由 CPianoCtrl
类保存。确定正在弹奏哪个键的任务落到了这个类身上,并且必须手动完成。这涉及到一定数量的繁琐工作,包括捕获鼠标事件和使用点击检测。我想用 C# 版本/.Net 版本避免这种情况。
为了避免不得不手动检测正在弹奏哪个键,我将钢琴键本身做成了一个控件。然后,每个钢琴键都负责响应鼠标事件;每个键都知道何时被按下和释放。钢琴键控件只需要监听鼠标事件并在它们发生时做出适当的响应即可。这使得管理钢琴键和鼠标事件的任务变得容易得多。
Shapes
有四种基本的钢琴键形状
- L 形 (音符 C 和 F)
- 反 L 形 (音符 E 和 B)
- 倒 T 形 (音符 D、G 和 A)
- 矩形 (所有降半音键)
对于 MFC 钢琴控件,我创建了一个代表这些不同形状的钢琴键类层次结构。回想起来,这可能有点过头了。对于 C# 版本,我创建了一个单一的钢琴键控件类,并将键形状作为该类的一个属性。
Orientation
除了形状之外,钢琴键(至少是 GUI 版本)也具有方向。钢琴键可以垂直或水平放置。当水平放置时,键的背面可以面向左侧或右侧。方向是我作为钢琴键控件类的一个属性的另一个方面。
钢琴键事件
StateChanged
事件是在钢琴键被触发或释放时生成的唯一事件。接收到此事件后,您可以使用 IsKeyOn()
方法查询键的状态。如果键已打开,此方法返回 true,如果键已关闭,则返回 false。
演示应用程序
演示显示了具有各种形状和方向的 PianoKey
控件。有一组 PianoKey
控件组合在一起形成钢琴键盘。我发现一种有用的方法是使用 Control
类的 Tag
属性来存储与单个控件相关的数据。我对这组钢琴键使用了这种方法,为每个键提供了一个 id 号,该 id 号可以在 StateChanged
事件触发时检索。
结论
将来,我可能会创建一个管理钢琴键集合的钢琴控件类。但就目前而言,我认为 PianoKey
控件类本身就很有用。希望您喜欢这个类,我欢迎任何建议或评论。
历史
- 2004 年 2 月 9 日提交的文章