文档章节

绘制一个钢琴键盘

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 347
阅读 15
收藏 1
点赞 0
评论 0

刚帮朋友解决了一个小问题, 这是其中的小片段:

本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  end;

  TMyShape = class(TShape)
  private
    FColorTmp: TColor;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer;
      Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer;
      Y: Integer); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  {黑白键组合顺序}
  Keys = '0100101001010100101001010100101001010100101001010100101001010100101001010100101001010100';
  KeyWhiteWidth = 15;   {白键宽}
  KeyBlackWidth = 10;   {黑键宽}
  KeyWhiteHeight = 88;  {白键高}
  KeyBlackHeight = 56;  {黑键高}

var
  KeyArr: array[0..87] of TMyShape; {键数组}

procedure TForm1.FormCreate(Sender: TObject);
var
  i,L: Integer;
begin
  {控件布局}
  Panel1.Align := alTop;
  Panel1.Height := KeyWhiteHeight;
  ClientWidth := (KeyWhiteWidth-1) * 52 - 1; {共 52 个白键, 这是键盘宽度}
  ClientHeight := KeyWhiteHeight;

  {画键盘}
  L := 0;
  for i := 0 to Length(Keys) - 1 do
  begin
    KeyArr[i] := TMyShape.Create(Self);
    KeyArr[i].Pen.Color := clGray;
    KeyArr[i].Parent := Panel1;
    KeyArr[i].Top := 0;

    case Keys[i+1] of
      '0': begin
        KeyArr[i].Width := KeyWhiteWidth;
        KeyArr[i].Height := KeyWhiteHeight;
        KeyArr[i].Brush.Color := clWhite;
        KeyArr[i].Left := L;
        Inc(L, KeyWhiteWidth-1);
        KeyArr[i].SendToBack;
      end;
      '1': begin
        KeyArr[i].Width := KeyBlackWidth;
        KeyArr[i].Height := KeyBlackHeight;
        KeyArr[i].Brush.Color := clBlack;
        KeyArr[i].Left := L - KeyBlackWidth div 2;
      end;
    end;
  end;
end;


{ TMyShape }

procedure TMyShape.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  FColorTmp := Brush.Color;
  Brush.Color := clWebGold;
end;

procedure TMyShape.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
  Y: Integer);
begin
  inherited;
  Brush.Color := FColorTmp;
end;

end.

 
 
 
 
 

 

 

  

窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 163
  ClientWidth = 290
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Panel1: TPanel
    Left = 56
    Top = 48
    Width = 185
    Height = 41
    Caption = 'Panel1'
    TabOrder = 0
  end
end

 
 
 
 
 

 

 

  

© 著作权归作者所有

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
钢琴的原理

过去的一周,我在厦门。 原来的打算,就是去海边放松一下。但是没有料到,这次旅行的一个重大收获,却是我想通了一个问题: ----为什么钢琴会发出声音? 1. 那天在鼓浪屿上面,太阳暴晒,我就...

阮一峰 ⋅ 2010/07/25 ⋅ 0

厉害了我的琴!钢琴教育竟然用上了AI+云计算?

随着AI技术越来越成熟,许多传统行业也逐渐向互联网+的方向发展。如果学钢琴能加入AI新科技,是不是就能将学琴者从枯燥无味的学习过程中解脱出来,钢琴老师也将happy教学呢? 近日,广东琴趣...

zabenbrdit36243qnjx1 ⋅ 2017/12/14 ⋅ 0

陪你的不仅有键盘还有音乐-献给深夜撸代码的你!

每个夜晚陪你度过的不仅是 敲的pa pa 响的键盘 还有那些让我们在深夜敲代码不在孤单的 音乐,今天给大家推荐的一些音乐,也是我经常听de,希望大家喜欢... 1. 君が好きだと叫びたい 《好想大声...

不空大的Timo ⋅ 2017/09/10 ⋅ 0

钢琴曲演奏软件--FreePiano

FreePiano是一款使用电脑键盘演奏钢琴音曲的开源软件。 FreePiano的特点: 完全免费的,您不需要购买就可以使用全部的功能。 直接调用VSTi音源,不需要安装虚拟MIDI设备。 支持多种音频输出方...

匿名 ⋅ 2013/05/27 ⋅ 1

电钢琴与钢琴

电钢琴与钢琴 网上有很多谈论关于电钢琴与钢琴的比较文章,我也来谈谈我的看法。 先谈谈天气问题 首先是钢琴,在南方像深圳这样的城市,非常潮湿,为了琴箱共鸣,钢琴内部没有任何油漆处理,...

neo-chen ⋅ 2015/07/08 ⋅ 1

“双十一”Guitar Pro 带你高姿态过光棍节

中秋国庆八天小长假,已经过去了一小段时间,大家都已经陆续回到了各自的工作岗位中去,但心思却不如以往那般沉静,比如小编我就是其中的一个,总感觉少点了啥,算算日子,十月过去,便是十一...

半夏微凉1989 ⋅ 2017/11/09 ⋅ 0

pcDuino 香蕉钢琴

前面我们已经介绍使用TouchkeyUSB Shield在Arduino上实现香蕉钢琴,Arduino是通过模拟USB HID(Human Interface Device)的方法来实现的,而在强大的pcDuino上面直接通过模拟键盘的输入就可以...

酸酸苹果汁 ⋅ 2013/12/24 ⋅ 3

iO6 Programming pushing the limits 阅读笔记

目录 第一部分 iOS6新内容 第二部分 从每天工具中获取更多(介绍日常使用控件和框架的潜力) 第三部分 完成任务的正确工具(介绍不是那么常用的控件和框架) 第四部分 发挥到极限(深入理解i...

云飞扬v5 ⋅ 2015/11/09 ⋅ 0

ChemDraw中怎么打出符号π

很多人日常使用ChemDraw是一款非常优秀的化学绘图软件,在其绘制化学结构式或者反应式的过程中,常常需要添加各种符号。比如有的用户会需要输入希腊字符π,但是不知道用什么方法添加。本教程...

学术研究软件 ⋅ 2016/06/15 ⋅ 0

Android控件TextView的实现原理分析

在前面一个系列的文章中,我们以窗口为单位,分析了WindowManagerService服务的实现。同时,在再前面一个系列的文章中,我们又分析了窗口的组成。简单来说,窗口就是由一系列的视图按照一定的...

Luoshengyang ⋅ 2013/03/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

懒惰根本就不存在

简评:芝加哥大学心理学教授,懒惰根本就不存在。(本文表面讲行为心理学实则讲教育) 金句:以好奇而不是判断来回应一个人的无效行为,是非常有帮助的。 本文「我」代表原作者 E Price。 自...

极光推送 ⋅ 27分钟前 ⋅ 0

Excel提取单元格中最后一个“.”后面的数据

java.lang.String ----- String =TRIM((MID(SUBSTITUTE(B2,".",REPT(" ",99)),(LEN(B2)-LEN(SUBSTITUTE(B2,".","")))*99,99)))...

klog ⋅ 29分钟前 ⋅ 0

mac远程桌面

下载安装remote-desktop-mac Mac beta 客户端 mac通过远程桌面访问windows服务器。

亚林瓜子 ⋅ 33分钟前 ⋅ 0

firrtl

动手---sbt(2)之后,再回头看 chisel第一个实验,根据 https://github.com/freechipsproject/firrtl 发现firrtl没有执行sbt assembly命令,重新执行这个命令,结果成功。如下图: joe@joe-As...

whoisliang ⋅ 38分钟前 ⋅ 0

NIO

一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。 二、通道的主要实现类 java.nio.channel...

stars永恒 ⋅ 38分钟前 ⋅ 0

Android悬浮窗的实现

0. 前言   现在很多应用都使用到悬浮窗,例如微信在视频的时候,点击Home键,视频小窗口仍然会在屏幕上显示。这个功能在很多情况下都非常有用。那么今天我们就来实现一下Android悬浮窗,以...

猴亮屏 ⋅ 38分钟前 ⋅ 0

日志采集中的关键技术分析

概述 日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此...

tqyin ⋅ 40分钟前 ⋅ 0

使用Navicat将数据导出为text文本 然后再导入

将数据导出为text文本效率很高 1. 准备工作 1.1 准备表结构 1.2 目标库 执行生成表结构sql 2.将表数据导出为text文本 生成的text文本 3. 目标库 导入text 4.效果...

Lucky_Me ⋅ 45分钟前 ⋅ 0

IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

文章介绍了idea下,项目乱码、控制台乱码及运行tomcat控制台乱码的解决方案,文章链接:https://www.cnblogs.com/vhua/p/idea_1.html

Funcy1122 ⋅ 48分钟前 ⋅ 0

IDEA使用sonarLint

一、IDEA如何安装SonarLint插件 1.打开 Idea 2.点击【File】 3.点击【Settings】 4.点击【Plugins】 5.在搜索栏中输入“sonarlint”关键字 6.点击【Install】进行安装 7.重启Idea 二、IDEA如...

开源中国成都区源花 ⋅ 53分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部