История изменений
Исправление X512, (текущая версия) :
Там нет большой разницы в плане графического API. Кнопки в стиле Windows 95 рисуются примерно так:
CONST
color1 = 0FFFFFFH; (* btnHighlight *)
color2 = 0E3E3E3H; (* 3dLights *)
color3 = 0F0F0F0H; (* btnFace *)
color4 = 0A0A0A0H; (* btnShadow *)
color5 = 0696969H; (* 3dDkShadow *)
color6 = 0646464H; (* black *)
PROCEDURE DrawBorder (f: Ports.Frame; VAR l, t, r, b: INTEGER; c: INTEGER);
CONST u = unit;
BEGIN
f.DrawRect(l, t, r, b, u, c);
INC(l, u); INC(t, u); DEC(r, u); DEC(b, u)
END DrawBorder;
PROCEDURE Draw3dBorder (f: Ports.Frame; VAR l, t, r, b: INTEGER; c1, c2: INTEGER);
CONST u = unit;
BEGIN
f.DrawRect(l, t, r - u, t + u, Ports.fill, c1);
f.DrawRect(l, t + u, l + u, b - u, Ports.fill, c1);
f.DrawRect(r - u, t, r, b - u, Ports.fill, c2);
f.DrawRect(l, b - u, r, b, Ports.fill, c2);
INC(l, u); INC(t, u); DEC(r, u); DEC(b, u)
END Draw3dBorder;
PROCEDURE Draw (v: View; f: Views.Frame; state: SET);
CONST u = unit;
VAR w, h: INTEGER; l, t, r, b: INTEGER;
font: Fonts.Font;
asc, dsc, strW: INTEGER;
BEGIN
v.context.GetSize(w, h);
l := 0; t := 0; r := w; b := h;
IF buttonDefault IN state THEN
DrawBorder(f, l, t, r, b, color6)
END;
IF (buttonOver IN state) & (buttonDown IN state) THEN
IF buttonDefault IN state THEN
DrawBorder(f, l, t, r, b, color4)
ELSE
Draw3dBorder(f, l, t, r, b, color5, color1);
Draw3dBorder(f, l, t, r, b, color4, color2)
END
ELSE
Draw3dBorder(f, l, t, r, b, color1, color5);
Draw3dBorder(f, l, t, r, b, color2, color4)
END;
f.DrawRect(l, t, r, b, Ports.fill, color3);
font := GetFont(v);
font.GetBounds(asc, dsc, strW);
strW := font.StringWidth(v.caption);
IF buttonOff IN state THEN
f.DrawString(w DIV 2 - strW DIV 2 + u, h DIV 2 - (asc + dsc) DIV 2 + asc + u, 0FFFFFFH, v.caption, font);
f.DrawString(w DIV 2 - strW DIV 2, h DIV 2 - (asc + dsc) DIV 2 + asc, 0A0A0A0H, v.caption, font)
ELSIF (buttonOver IN state) & (buttonDown IN state) THEN
f.DrawString(w DIV 2 - strW DIV 2 + u, h DIV 2 - (asc + dsc) DIV 2 + asc + u, 0000000H, v.caption, font)
ELSE
f.DrawString(w DIV 2 - strW DIV 2, h DIV 2 - (asc + dsc) DIV 2 + asc, 0000000H, v.caption, font)
END
END Draw;
Исходная версия X512, :
Там нет большой разницы в плане графического API. Кнопки в стиле Windows 95 рисуются примерно так:
PROCEDURE DrawBorder (f: Ports.Frame; VAR l, t, r, b: INTEGER; c: INTEGER);
CONST u = unit;
BEGIN
f.DrawRect(l, t, r, b, u, c);
INC(l, u); INC(t, u); DEC(r, u); DEC(b, u)
END DrawBorder;
PROCEDURE Draw3dBorder (f: Ports.Frame; VAR l, t, r, b: INTEGER; c1, c2: INTEGER);
CONST u = unit;
BEGIN
f.DrawRect(l, t, r - u, t + u, Ports.fill, c1);
f.DrawRect(l, t + u, l + u, b - u, Ports.fill, c1);
f.DrawRect(r - u, t, r, b - u, Ports.fill, c2);
f.DrawRect(l, b - u, r, b, Ports.fill, c2);
INC(l, u); INC(t, u); DEC(r, u); DEC(b, u)
END Draw3dBorder;
PROCEDURE Draw (v: View; f: Views.Frame; state: SET);
CONST u = unit;
VAR w, h: INTEGER; l, t, r, b: INTEGER;
font: Fonts.Font;
asc, dsc, strW: INTEGER;
BEGIN
v.context.GetSize(w, h);
l := 0; t := 0; r := w; b := h;
IF buttonDefault IN state THEN
DrawBorder(f, l, t, r, b, color6)
END;
IF (buttonOver IN state) & (buttonDown IN state) THEN
IF buttonDefault IN state THEN
DrawBorder(f, l, t, r, b, color4)
ELSE
Draw3dBorder(f, l, t, r, b, color5, color1);
Draw3dBorder(f, l, t, r, b, color4, color2)
END
ELSE
Draw3dBorder(f, l, t, r, b, color1, color5);
Draw3dBorder(f, l, t, r, b, color2, color4)
END;
f.DrawRect(l, t, r, b, Ports.fill, color3);
font := GetFont(v);
font.GetBounds(asc, dsc, strW);
strW := font.StringWidth(v.caption);
IF buttonOff IN state THEN
f.DrawString(w DIV 2 - strW DIV 2 + u, h DIV 2 - (asc + dsc) DIV 2 + asc + u, 0FFFFFFH, v.caption, font);
f.DrawString(w DIV 2 - strW DIV 2, h DIV 2 - (asc + dsc) DIV 2 + asc, 0A0A0A0H, v.caption, font)
ELSIF (buttonOver IN state) & (buttonDown IN state) THEN
f.DrawString(w DIV 2 - strW DIV 2 + u, h DIV 2 - (asc + dsc) DIV 2 + asc + u, 0000000H, v.caption, font)
ELSE
f.DrawString(w DIV 2 - strW DIV 2, h DIV 2 - (asc + dsc) DIV 2 + asc, 0000000H, v.caption, font)
END
END Draw;