소스 검색

SimpleGui: Custom widget; onPaint event

Arthur Yefimov 1 년 전
부모
커밋
2e758916ba
2개의 변경된 파일37개의 추가작업 그리고 3개의 파일을 삭제
  1. 13 0
      Programs/Examples/MapEditor.Mod
  2. 24 3
      Programs/Examples/SimpleGui.Mod

+ 13 - 0
Programs/Examples/MapEditor.Mod

@@ -17,6 +17,7 @@ VAR
   btnFile: S.Button;
   btnEdit: S.Button;
   edtMsg: S.Edit;
+  custom: S.Widget;
 
   XX, YY: INTEGER;
   moving: BOOLEAN;
@@ -73,6 +74,14 @@ BEGIN
   S.ScrollBarSetValue(scbVert, value)
 END ScbHoriz2OnScroll;
 
+PROCEDURE CustomOnPaint(c: S.Widget; x, y, w, h: INTEGER);
+VAR color: G.Color;
+BEGIN
+  G.MakeCol(color, 255, 255, 0);
+  G.Line(x, y, x + w - 1, y + h - 1, color);
+  G.Line(x + w - 1, y, x, y + h - 1, color);
+END CustomOnPaint;
+
 PROCEDURE InitInterface(): BOOLEAN;
 VAR W, H: INTEGER;
   color: G.Color;
@@ -107,6 +116,7 @@ BEGIN
   S.SetOnMouseMove(btnMove, BtnMoveOnMouseMove);
 
   sbxMap := S.NewScrollBox(pnlMap, 4, 104, 300, 200);
+  S.ScrollBoxSetNoBg(sbxMap, TRUE);
   S.ScrollBoxSetInnerSize(sbxMap, 4096, 4096);
   G.MakeCol(color, 0, 90, 255);
   S.SetBgColor(sbxMap, color);
@@ -114,6 +124,9 @@ BEGIN
   btnEdit := S.NewButton(sbxMap, 260, 40, 80, 24, 'Правка');
   edtMsg := S.NewEdit(sbxMap, 60, 170, 120, 35);
 
+  custom := S.NewWidget(sbxMap, 50, 70, 100, 70);
+  S.SetOnPaint(custom, CustomOnPaint);
+
   moving := FALSE
 RETURN TRUE END InitInterface;
 

+ 24 - 3
Programs/Examples/SimpleGui.Mod

@@ -38,6 +38,7 @@ TYPE
     prev*, next*: Widget;
     handle*: Handler;
 
+    onPaint*: PROCEDURE (c: Widget; x, y, w, h: INTEGER);
     onMouseDown*: PROCEDURE (c: Widget; x, y, btn: INTEGER);
     onMouseUp*: PROCEDURE (c: Widget; x, y, btn: INTEGER);
     onMouseMove*: PROCEDURE (c: Widget; x, y, btn: INTEGER);
@@ -89,6 +90,7 @@ TYPE
 
   ScrollBox* = POINTER TO ScrollBoxDesc;
   ScrollBoxDesc* = RECORD(WidgetDesc)
+    noBg*: BOOLEAN;
     outer*, inner*: Panel;
     scbHoriz*, scbVert*: ScrollBar
   END;
@@ -294,9 +296,13 @@ VAR x, y: INTEGER;
 BEGIN
   IF msg IS DrawMsg THEN
     x := msg(DrawMsg).x; y := msg(DrawMsg).y;
-    G.FillRect(x, y, x + c.w - 1, y + c.h - 1, c.bgColor);
-    G.Rect(x, y, x + c.w - 1, y + c.h - 1, c.fgColor);
-    G.Rect(x + 2, y + 2, x + c.w - 3, y + c.h - 3, c.fgColor)
+    IF c.onPaint # NIL THEN
+      c.onPaint(c, x, y, msg(DrawMsg).w, msg(DrawMsg).h)
+    ELSE
+      G.FillRect(x, y, x + c.w - 1, y + c.h - 1, c.bgColor);
+      G.Rect(x, y, x + c.w - 1, y + c.h - 1, c.fgColor);
+      G.Rect(x + 2, y + 2, x + c.w - 3, y + c.h - 3, c.fgColor)
+    END
   ELSIF msg IS MouseDownMsg THEN
     IF msg(MouseDownMsg).btn = 1 THEN c.pressed := TRUE END
   ELSIF msg IS MouseUpMsg THEN c.pressed := FALSE
@@ -351,6 +357,10 @@ PROCEDURE SetFgColor*(c: Widget; color: G.Color);
 BEGIN c.fgColor := color
 END SetFgColor;
 
+PROCEDURE SetOnPaint*(c: Widget; proc: PROCEDURE (c: Widget; x, y, w, h: INTEGER));
+BEGIN c.onPaint := proc
+END SetOnPaint;
+
 PROCEDURE SetOnMouseMove*(c: Widget; proc: PROCEDURE (c: Widget; x, y, btn: INTEGER));
 BEGIN c.onMouseMove := proc
 END SetOnMouseMove;
@@ -376,6 +386,13 @@ BEGIN c.x := 0; c.y := 0; c.w := w; c.h := h;
   c.handle := WidgetHandler
 END InitWidget;
 
+(** Creates and returns a new custom widget *)
+PROCEDURE NewWidget*(where: Widget; x, y, w, h: INTEGER): Widget;
+VAR c: Widget;
+BEGIN NEW(c); InitWidget(c, w, h);
+  Put(c, where, x, y)
+RETURN c END NewWidget;
+
 (** Panel **)
 
 PROCEDURE PanelSetNoBg*(c: Panel; noBg: BOOLEAN);
@@ -851,6 +868,10 @@ END ScrollBarSetOnScroll;
 
 (** ScrollBox **)
 
+PROCEDURE ScrollBoxSetNoBg*(c: ScrollBox; noBg: BOOLEAN);
+BEGIN PanelSetNoBg(c.inner, noBg)
+END ScrollBoxSetNoBg;
+
 PROCEDURE ScrollBoxHandler*(c: Widget; VAR msg: Message);
 VAR x, y: INTEGER;
 BEGIN