LANGUAGE | スカ友 | 俺、関東の国王だけど (イケメンだ(28)、彼女がほしい) 人類の品種 言葉の起源 虫は宇宙人です 日本語は海豚の言葉に由来します ペンギン(ウルトラマン) 関東無政府主義国へようこそ! simulationライブラリで純粋な関数式プログラミングを
UIライブラリ(2D)を作りました
0   関東の国王      2019年5月3日 金 18:16
こちらよりダウンロードします:
http://up.x0000.net/files/7B/8D/80548d7b-58dc-4b4f-b7fb-0bb17b234b82.zip
画像はこちらです:


PS 中ではSimulationライブラリを使用しています、下記参照:
http://x0000.net/topic.aspx?id=3631-0

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using Microsoft.DirectX.DirectDraw;
using Simulation;

namespace UI
{
   abstract class Element
   {
       public int X, Y, DX, DY;
       public CachedVar<int> FullX, FullY;
       public CachedVar<int> MouseX, MouseY;
       public CachedVar<bool> MouseInside, MouseInsideTmp;
       public bool Visible, Enabled;
       public CachedVar<bool> TrueVisible, TrueEnabled;

       public Element Parent; // controls
       public List<Element> Children = new List<Element>(); // forms

       public CachedVar<bool> OnMouseButtonDown, OnMouseButtonUp, OnMouseButtonDownTmp;

       public Element(int x, int y, int dx, int dy)
       {
           X = x;
           Y = y;
           DX = dx;
           DY = dy;

           FullX = new CachedVar<int>(() => Parent == null ? X : Parent.X + X);
           FullY = new CachedVar<int>(() => Parent == null ? Y : Parent.Y + Y);

           MouseX = new CachedVar<int>(() => Core.TheCore.MouseX - (Parent == null ? 0 : Parent.X) - X);
           MouseY = new CachedVar<int>(() => Core.TheCore.MouseY - (Parent == null ? 0 : Parent.Y) - Y);

           MouseInside = new CachedVar<bool>(() =>
               {
                   if (MouseX.v() < 0 || MouseX.v() >= DX || MouseY.v() < 0 || MouseY.v() >= DY
                       || (!TrueVisible.v()))
                       return false;
                   // truely visible:
                   if (Parent == null) // a form
                   {
                       for (int i = Core.TheCore.Root.Count - 1; i >= 0; i--)
                       {
                           Element e = Core.TheCore.Root[i];
                           if (e == this)
                               break;
                           else
                               if (e.MouseX.v() >= 0 && e.MouseX.v() < e.DX && e.MouseY.v() >= 0 && e.MouseY.v() < e.DY
                                   && e.TrueVisible.v())
                                   return false;
                       }
                       for (int i = Children.Count - 1; i >= 0; i--)
                       {
                           Element e = Children[i];
                           if (e.MouseX.v() >= 0 && e.MouseX.v() < e.DX && e.MouseY.v() >= 0 && e.MouseY.v() < e.DY
                               && e.TrueVisible.v())
                               return false;
                       }
                       return MouseX.v() >= 0 && MouseX.v() < DX && MouseY.v() >= 0 && MouseY.v() < DY;
                   }
                   else // a control
                   {
                       for (int i = Core.TheCore.Root.Count - 1; i >= 0; i--)
                       {
                           Element e = Core.TheCore.Root[i];
                           if (e == Parent)
                               break;
                           else
                               if (e.MouseX.v() >= 0 && e.MouseX.v() < e.DX && e.MouseY.v() >= 0 && e.MouseY.v() < e.DY
                                   && e.TrueVisible.v())
                                   return false;
                       }
                       return MouseX.v() >= 0 && MouseX.v() < DX && MouseY.v() >= 0 && MouseY.v() < DY;                        
                   }
               });

           MouseInsideTmp = new CachedVar<bool>(() =>
               {
                   if (MouseX.v() < 0 || MouseX.v() >= DX || MouseY.v() < 0 || MouseY.v() >= DY
                          || (!TrueVisible.v()))
                       return false;
                   // truely visible:
                   if (Parent == null) // a form
                   {
                       for (int i = Core.TheCore.Root.Count - 1; i >= 0; i--)
                       {
                           Element e = Core.TheCore.Root[i];
                           if (e == this)
                               return MouseX.v() >= 0 && MouseX.v() < DX && MouseY.v() >= 0 && MouseY.v() < DY;
                           else
                               if (e.MouseX.v() >= 0 && e.MouseX.v() < e.DX && e.MouseY.v() >= 0 && e.MouseY.v() < e.DY
                                   && e.TrueVisible.v())
                                   return false;
                       }
                       return false;
                   }
                   else // a control
                       return MouseInside.v();
               });

           Visible = true;
           Enabled = true;

           TrueVisible = new CachedVar<bool>(() => (Parent == null ? true : Parent.Visible) && Visible);
           TrueEnabled = new CachedVar<bool>(() => (Parent == null ? true : Parent.Enabled) && Enabled);
           
           OnMouseButtonDown = new CachedVar<bool>(() => (TrueEnabled.v() && MouseInside.v()) ? Core.TheCore.MouseButtonDown : false);
           OnMouseButtonUp = new CachedVar<bool>(() => (TrueEnabled.v() && MouseInside.v()) ? Core.TheCore.MouseButtonUp : false);
           OnMouseButtonDownTmp = new CachedVar<bool>(() => (TrueEnabled.v() && MouseInsideTmp.v()) ? Core.TheCore.MouseButtonDown : false);
       }

       public abstract Element Update(); // returns a form to be bringed to the top
       public abstract void Render(Surface backSurface);
   }

   class Core
   {
       public static Core TheCore;

       public int DX, DY;

       public int MouseDX, MouseDY, MouseDZ, MouseX, MouseY;
       public bool MouseLeftButton, MouseRightButton, MouseMiddleButton;
       public bool MouseButtonDown, MouseButtonUp;

       public List<Element> Root = new List<Element>();

       public Core(int dx, int dy)
       {
           DX = dx;
           DY = dy;
       }

       public void Update()
       {
           List<Element> tmps = new List<Element>();
           foreach (Element e in Root)
           {
               Element tmp = e.Update();
               if (tmp != null)
                   tmps.Add(tmp);

               foreach (Element f in e.Children)
                   f.Update();
           }
           foreach (Element tmp in tmps)
           {
               Root.Remove(tmp);
               Root.Add(tmp);
           }
       }

       public void Render(Surface backSurface)
       {
           foreach (Element e in Root)
           {
               if (e.TrueVisible.v())
                   e.Render(backSurface);

               foreach (Element f in e.Children)
                   if (f.TrueVisible.v())
                       f.Render(backSurface);
           }
       }
   }

   class Form : Element
   {
       public Color BorderColor, FillColor;

       State<bool> IsDragging;

       public Form(int x, int y, int dx, int dy)
           : base(x, y, dx, dy)
       {
           Core.TheCore.Root.Add(this);

           BorderColor = Color.FromArgb(unchecked((int)0xFF0000ff));
           FillColor = Color.FromArgb(unchecked((int)0xFF000000));

           IsDragging = new State<bool>(false,
               state =>
               {
                   if (OnMouseButtonDown.v() && Core.TheCore.MouseLeftButton)
                       return true;
                   if (OnMouseButtonUp.v())
                       return false;
                   return state;
               });
       }

       public override Element Update() // returns a form to be bringed to the top
       {
           if (OnMouseButtonDownTmp.v())
               return this;

           if (IsDragging.v())
           {
               X += Core.TheCore.MouseDX;
               Y += Core.TheCore.MouseDY;
           }
           
           if (X < 0)
               X = 0;
           if (Y < 0)
               Y = 0;
           if (X + DX >= Core.TheCore.DX)
               X = Core.TheCore.DX - DX;
           if (Y + DY >= Core.TheCore.DY)
               Y = Core.TheCore.DY - DY;
           if (DX > Core.TheCore.DX)
               DX = Core.TheCore.DX;
           if (DY > Core.TheCore.DY)
               DY = Core.TheCore.DY;
           
           return null;
       }

       public override void Render(Surface backSurface)
       {
           backSurface.ForeColor = BorderColor;
           backSurface.FillColor = FillColor;
           backSurface.DrawRoundedBox(X, Y, X + DX, Y + DY, 5, 5);
       }
   }

   public enum ButtonState
   {
       Normal,
       Hovered,
       Pressed,
   }

   class Button : Element
   {
       public string Text;
       public Font Font;
       public int TextX, TextY, TextDX, TextDY;
       public Color BorderColor, FillColor, TextColor;
       public Color HoveredBorderColor, HoveredFillColor, HoveredTextColor;
       public Color PressedBorderColor, PressedFillColor, PressedTextColor;
       public Color DisabledBorderColor, DisabledFillColor, DisabledTextColor;
       public State<ButtonState> State;

       public CachedVar<bool> OnMouseClick;

       public Button(Form form, int x, int y, int dx, int dy)
           : base(x, y, dx, dy)
       {
           form.Children.Add(this);
           Parent = form;
           
           Text = "Button";
           Font = new Font("Arial", 9.0f);
           TextX = 5;
           TextY = 5;
           TextDX = dx - 10;
           TextDY = dy - 10;

           BorderColor = Color.FromArgb(unchecked((int)0xFF0000ff));
           FillColor = Color.FromArgb(unchecked((int)0xFF000000));
           TextColor = Color.FromArgb(unchecked((int)0xFFffff00));

           HoveredBorderColor = Color.FromArgb(unchecked((int)0xFFff0000));
           HoveredFillColor = Color.FromArgb(unchecked((int)0xFFffff00));
           HoveredTextColor = Color.FromArgb(unchecked((int)0xFFff0000));

           PressedBorderColor = Color.FromArgb(unchecked((int)0xFF00ff00));
           PressedFillColor = Color.FromArgb(unchecked((int)0xFFff0000));
           PressedTextColor = Color.FromArgb(unchecked((int)0xFF0000ff));

           DisabledBorderColor = Color.FromArgb(unchecked((int)0xFF888888));
           DisabledFillColor = Color.FromArgb(unchecked((int)0xFF000000));
           DisabledTextColor = Color.FromArgb(unchecked((int)0xFFffffff));

           State = new State<ButtonState>(ButtonState.Normal,
               state =>
               {
                   if (!TrueEnabled.v())
                       return ButtonState.Normal;
                   if (state == ButtonState.Normal)
                   {
                       if (MouseInside.v())
                       {
                           if (Core.TheCore.MouseLeftButton)
                               return ButtonState.Pressed;
                           else
                               return ButtonState.Hovered;
                       }
                       else
                           return ButtonState.Normal;
                   }
                   else if (state == ButtonState.Hovered)
                   {
                       if (MouseInside.v())
                       {
                           if (Core.TheCore.MouseLeftButton)
                               return ButtonState.Pressed;
                           else
                               return ButtonState.Hovered;
                       }
                       else
                           return ButtonState.Normal;
                   }
                   else if (state == ButtonState.Pressed)
                   {
                       if (Core.TheCore.MouseLeftButton)
                           return ButtonState.Pressed;
                       else
                       {
                           if (MouseInside.v())
                               return ButtonState.Hovered;
                           else
                               return ButtonState.Normal;
                       }
                   }
                   else
                       return ButtonState.Normal;
               });

           OnMouseClick = new CachedVar<bool>(() => State.v() == ButtonState.Pressed && MouseInside.v() && (!Core.TheCore.MouseLeftButton));
       }

       public override Element Update() // returns a form to be bringed to the top
       {
           return null;
       }

       public override void Render(Surface backSurface)        
       {
           if (TrueEnabled.v())
           {
               if (State.v() == ButtonState.Normal)
               {
                   backSurface.ForeColor = BorderColor;
                   backSurface.FillColor = FillColor;
               }
               else if (State.v() == ButtonState.Hovered)
               {
                   backSurface.ForeColor = HoveredBorderColor;
                   backSurface.FillColor = HoveredFillColor;
               }
               else if (State.v() == ButtonState.Pressed)
               {
                   backSurface.ForeColor = PressedBorderColor;
                   backSurface.FillColor = PressedFillColor;
               }
           }
           else // truely disabled
           {
               backSurface.ForeColor = DisabledBorderColor;
               backSurface.FillColor = DisabledFillColor;
           }
           backSurface.DrawRoundedBox(FullX.v(), FullY.v(), FullX.v() + DX, FullY.v() + DY, 5, 5);

           Color textColor = new Color();
           if (TrueEnabled.v())
           {
               if (State.v() == ButtonState.Normal)
                   textColor = TextColor;
               else if (State.v() == ButtonState.Hovered)
                   textColor = HoveredTextColor;
               else if (State.v() == ButtonState.Pressed)
                   textColor = PressedTextColor;
           }
           else // truely disabled
               textColor = DisabledTextColor;
           IntPtr hdc = backSurface.GetDc();
           Graphics g = Graphics.FromHdc(hdc);
           g.DrawString(
               Text,
               Font,
               new SolidBrush(textColor),
               new RectangleF((float)FullX.v() + TextX, (float)FullY.v() + TextX, (float)TextDX, (float)TextDY));
           backSurface.ReleaseDc(hdc);
       }
   }

   class TextBox : Element
   {
       public string Text;
       public Font Font;
       public Color BorderColor, FillColor, TextColor;
       public bool Transparent;

       public TextBox(Form form, int x, int y, int dx, int dy)
           : base(x, y, dx, dy)
       {
           form.Children.Add(this);
           Parent = form;

           Text = "TextBox";
           Font = new Font("Arial", 9.0f);
           BorderColor = Color.FromArgb(unchecked((int)0xFF0000ff));
           FillColor = Color.FromArgb(unchecked((int)0xFF000000));
           TextColor = Color.FromArgb(unchecked((int)0xFFffff00));
           Transparent = false;
       }

       public override Element Update() // returns a form to be bringed to the top
       {
           return null;
       }

       public override void Render(Surface backSurface)
       {
           if (!Transparent)
           {
               backSurface.ForeColor = BorderColor;
               backSurface.FillColor = FillColor;
               backSurface.DrawRoundedBox(FullX.v(), FullY.v(), FullX.v() + DX, FullY.v() + DY, 5, 5);
           }

           IntPtr hdc = backSurface.GetDc();
           Graphics g = Graphics.FromHdc(hdc);
           g.DrawString(
               Text,
               Font,
               new SolidBrush(TextColor),
               new RectangleF((float)FullX.v() + 5, (float)FullY.v() + 5, (float)DX - 10, (float)DY - 10));
           backSurface.ReleaseDc(hdc);
       }
   }

   class PictureBox : Element
   {
       Surface Surface;
       public bool UseColorKey; // the color key is 0x0

       public PictureBox(Form form, int x, int y, int dx, int dy)
           : base(x, y, dx, dy)
       {
           form.Children.Add(this);
           Parent = form;

           Surface = null;
           UseColorKey = false;
       }

       public override Element Update() // returns a form to be bringed to the top
       {
           return null;
       }

       public override void Render(Surface backSurface)
       {
           backSurface.Draw(
               new Rectangle(FullX.v(), FullY.v(), DX, DY),
               Surface,
               (UseColorKey ? DrawFlags.KeySource : 0) | DrawFlags.Wait);
       }

       public void LoadPicture(string fileName, Device device)
       {
           SurfaceDescription desc = new SurfaceDescription();
           desc.SurfaceCaps.OffScreenPlain = true;
           desc.SurfaceCaps.VideoMemory = true;
           Surface = new Surface(new Bitmap(Image.FromFile(fileName)), desc, device);
           ColorKey colorKey;
           colorKey.ColorSpaceHighValue = colorKey.ColorSpaceLowValue = 0;
           Surface.SetColorKey(ColorKeyFlags.SourceDraw, colorKey);
       }
   }

   class ListBox : Element
   {
       public Font Font;
       public Color BorderColor, FillColor, TextColor;
       public Color SelectedBorderColor, SelectedFillColor, SelectedTextColor;
       public bool Transparent;
       public List<List<string>> Items = new List<List<string>>();
       public int? SelectedIndex;
       public int LineDY;
       public List<int> ColumnsX = new List<int>();

       public ListBox(Form form, int x, int y, int dx, int dy)
           : base(x, y, dx, dy)
       {
           form.Children.Add(this);
           Parent = form;

           Font = new Font("Arial", 9.0f);
           BorderColor = Color.FromArgb(unchecked((int)0xFF0000ff));
           FillColor = Color.FromArgb(unchecked((int)0xFF000000));
           TextColor = Color.FromArgb(unchecked((int)0xFFffff00));
           SelectedBorderColor = Color.FromArgb(unchecked((int)0xFFff0000));
           SelectedFillColor = Color.FromArgb(unchecked((int)0xFFffff00));
           SelectedTextColor = Color.FromArgb(unchecked((int)0xFF000000));
           Transparent = false;
           SelectedIndex = null;
           LineDY = 15;
       }

       public override Element Update() // returns a form to be bringed to the top
       {
           if (Core.TheCore.MouseLeftButton && OnMouseButtonDown.v())
           {
               int tmp = MouseY.v() / LineDY;
               if (tmp < Items.Count)
                   SelectedIndex = tmp;
               else
                   SelectedIndex = null;
           }

           return null;
       }

       public override void Render(Surface backSurface)
       {
           if (!Transparent)
           {
               backSurface.ForeColor = BorderColor;
               backSurface.FillColor = FillColor;
               backSurface.DrawBox(FullX.v(), FullY.v(), FullX.v() + DX, FullY.v() + DY);
           }

           for (int i = 0; i < Items.Count; i++) // line
           {
               if (SelectedIndex != null && SelectedIndex == i)
               {
                   backSurface.ForeColor = SelectedBorderColor;
                   backSurface.FillColor = SelectedFillColor;
                   backSurface.DrawBox(
                       FullX.v(),
                       FullY.v() + SelectedIndex.Value * LineDY,
                       FullX.v() + DX,
                       FullY.v() + SelectedIndex.Value * LineDY + LineDY);
               }
               for (int j = 0; j < Items[i].Count; j++) // column
               {
                   IntPtr hdc = backSurface.GetDc();
                   Graphics g = Graphics.FromHdc(hdc);
                   g.DrawString(
                       Items[i][j],
                       Font,
                       new SolidBrush((SelectedIndex == null || SelectedIndex != i) ? TextColor : SelectedTextColor),
                       new RectangleF(
                           (float)(FullX.v() + ColumnsX[j]),
                           (float)(FullY.v() + LineDY * i),
                           (float)(((j < ColumnsX.Count - 1) ? ColumnsX[j + 1] : DX) - ColumnsX[j]),
                           (float)LineDY));
                   backSurface.ReleaseDc(hdc);
               }
           }
       }
   }
}
名前      編集用パスワード(省略可)    パスワードの記憶
数式 αβγ IPA http:// 画像 B I U
(添付ファイルは http://up.x0000.net/ にアップロードしてください)