LINUX.ORG.RU

История изменений

Исправление 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;