Дельфи паскаль.
Но, тут уже ооп, графика и прочие прелести.
Кусочек отрисовки аккордов на грифе. писал для себя, дабы понять нотный строй гитары.
рrосеdurе TAccordView.WMPaint(var Message: TWMPaint);
var
X, Y, dx, dy, i, j, p: Integer;
pt1, pt2: TPoint;
r: TRect;
lb: TLogBrush;
lf: TLogFont;
PS: TPaintStruct;
DC: HDC;
PN_POINT, PN: HPEN;
BR_POINT: HBRUSH;
FN: HFONT;
CLR_POINT: Cardinal;
s: string;
begin
DC := BeginPaint(Handle, PS);
FillRect(DC, PS.rcPaint, Brush.Handle);
SelectObject(DC, Font.Handle);
CLR_POINT := RGB(93, 110, 174);
lb.lbColor := CLR_POINT;
lb.lbStyle := BS_SOLID;
BR_POINT := CreateBrushIndirect(lb);
PN_POINT := CreatePen(PS_SOLID, 0, CLR_POINT);
PN := CreatePen(PS_SOLID, 0, RGB(156, 156, 156));
dy := Round(((ClientHeight - FOffsetY * 2)) div (FStringCnt - 1));
dx := Round(((ClientWidth - FOffsetX * 2)) div (FFretCnt - 1));
SelectObject(DC, PN);
// SetROP2(DC, R2_NOTMERGEPEN);
// ε≥≡Φ±εΓΩα δαΣεΓ
for i := 0 to FFretCnt - 1 do
begin
X := FOffsetX + i * dx + 1;
MoveToEx(DC, X, FOffsetY + 1, nil);
LineTo(DC, X, FOffsetY + dy * (FStringCnt - 1) + 2);
end;
// ε≥≡Φ±εΓΩα ±≥≡≤φ
Y := 0;
for i := 0 to FStringCnt - 1 do
begin
Y := FOffsetY + i * dy + 1;
MoveToEx(DC, FOffsetX + 1, Y, nil);
LineTo(DC, FOffsetX + dx * (FFretCnt - 1) + 2, Y);
r := Rect(1, Y - dy, FOffsetX, Y + dy);
s := StdPitch[i + 1];
DrawText(DC, s, Length(s), r, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
// ε≥≡Φ±εΓΩα φατΓαφΦ φε≥√ φα ±≥≡≤φσ/δαΣ≤
// p := NoteList.IndexOf(s);
for j := 0 to FFretCnt - 1 do
begin
// if GetIndex() then
// x := FOffsetX + dx * j;
// r := Rect(x + 1, y - dy, x + dx, y);
// s := LowerCase(NoteList.Strings[p]);
// DrawText(DC, s, Length(s), r, DT_VCENTER or DT_SINGLELINE or DT_LEFT);
// Inc(p);
// if p > NoteList.Count - 1 then
// p := 0;
end;
end;
SelectObject(DC, BR_POINT);
SelectObject(DC, PN_POINT);
if FBarePos > 0 then
begin
X := FOffsetX + dx div 2;
RoundRect(DC, X, FOffsetY - 2, X + 5, Y + 4, 3, 3);
SetBkMode(DC, TRANSPARENT);
SetTextColor(DC, clBlack);
r := Rect(X, Y, X + dx div 2 + 4, ClientHeight);
s := IntToStr(FBarePos);
DrawText(DC, s, Length(s), r, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
end;
// ╟απεδεΓεΩ αΩΩε≡Σα
if FAccord <> '' then
begin
r := Rect(FOffsetX, Y + 1, ClientWidth, ClientHeight);
s := FAccord;
DrawText(DC, s, Length(s), r, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
for i := 0 to Length(FNoteArray) - 1 do
begin
X := (FOffsetX + (FNoteArray[i] - FNoteArray[i] div 100 * 100) * dx -
dx div 2) - dx;
Y := FOffsetY + (FNoteArray[i] div 100) * dy - dy + 1;
if X > 0 then
begin
r := Rect(X - 5, Y - 5, X + 6, Y + 6);
Ellipse(DC, r.Left, r.Top, r.Right, r.Bottom);
s := GetAccordFromIndex(FNoteArray[i]);
s := LowerCase(s);
SetBkMode(DC, TRANSPARENT);
DrawText(DC, s, Length(s), r, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
end;
end;
end;
DeleteObject(BR_POINT);
DeleteObject(PN);
DeleteObject(PN_POINT);
EndPaint(Handle, PS);
end;
function TAccordView.GetAccordFromIndex(Index: Integer): string;
var
X, Y, p, i: Integer;
s: string;
begin
Y := Index div 100;
s := StdPitch[Y];
X := Index - Y * 100;
p := NoteList.IndexOf(s) - 1;
for i := 1 to X do
begin
Inc(p);
if p > NoteList.Count - 1 then
p := 0;
end;
Result := NoteList[p];
// end;
end;
Это сообщение отредактировал ancot - 21.12.2015 - 23:13