diff --git a/Gola2/Actor.cs b/Gola2/Actor.cs deleted file mode 100644 index 883fe30..0000000 --- a/Gola2/Actor.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace Gola2 -{ - public abstract class Actor - { - - private PerPixelAlphaForm form = new PerPixelAlphaForm(); - private bool alive = true; - private PointF position; - - #region Instance management - protected Actor() - { - ActorEngine.AddActor(this); - form.Show(); - } - - ~Actor() - { - Kill(); - } - - public virtual void Kill() - { - if (alive) - ActorEngine.RemoveActor(this); - alive = false; - } - #endregion - - #region Lifecycle - - protected abstract void Step(); - - protected virtual void Update() - { - form.SetPosition(new Point((int)position.X, (int)position.Y)); - } - - internal void ExecuteActor() - { - Step(); - Update(); - } - #endregion - - #region Graphigs management - protected void SetBitmap(Bitmap bmp) - { - form.SelectBitmap(bmp); - } - #endregion - - #region Utilities (Static) - - public static int rnd(int min, int max) - { - return Random.Next(min, max); - } - - public static float rndf() - { - return (float)Random.NextDouble(); - } - - public static float rndf(float max) - { - return rndf() * max; - } - - public static float rndf(float min, float max) - { - return min + rndf(max - min); - } - - #endregion - - #region Utilities - - public bool IsNearestTo(Actor a, float distance) - { - return (Math.Pow(X - a.X, 2) + Math.Pow(Y - a.Y, 2)) < (distance * distance); - } - - #endregion - - public PointF Position { get => position; set => position = value; } - public float X { get => position.X; set => position.X = value; } - public float Y { get => position.Y; set => position.Y = value; } - - public Screen Screen => form.Screen; - public static Random Random => ActorEngine.Random; - } -} diff --git a/Gola2/ActorEngine.cs b/Gola2/ActorEngine.cs deleted file mode 100644 index ba064d8..0000000 --- a/Gola2/ActorEngine.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; - -namespace Gola2 -{ - public static class ActorEngine - { - private static Random random = new Random(); - private static List actors = new List(); - private static Thread t; - private static bool running; - - internal static void AddActor(Actor a) - { - lock (actors) - actors.Add(a); - } - - internal static void RemoveActor(Actor a) - { - lock (actors) - actors.Remove(a); - } - - public static void Start() - { - if (t == null) - { - running = true; - t = new Thread(new ThreadStart(EngineLoop)); - t.Start(); - } - } - - public static void Stop() - { - if (t != null) - { - lock (t) - running = false; - t.Join(); - t = null; - } - } - - public static Actor[] GetActors() - { - lock (actors) - return actors.ToArray(); - } - - public static T[] GetActors() where T : Actor - { - List lst = new List(); - lock (actors) - foreach (Actor a in actors) - if (a is T) - lst.Add((T)a); - return lst.ToArray(); - } - - private static void EngineLoop() - { - bool alive = true; - while (alive) - { - EngineStep(); - Thread.Sleep(1); - lock (t) - alive = running; - } - } - - private static void EngineStep() - { - Actor[] actoring = GetActors(); - foreach (Actor a in actoring) - { - a.ExecuteActor(); - } - } - - public static Random Random => random; - } -} diff --git a/Gola2/CSDiv.cs b/Gola2/CSDiv.cs new file mode 100644 index 0000000..96020a2 --- /dev/null +++ b/Gola2/CSDiv.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Threading; + +namespace XWolf +{ + #region CSDiv main class + static class CSDiv + { + private static ICSDivCanvas canvas; + private static List actors = new List(); + private static Timer timer; + private static int fps = 24; + private static bool executing; + private static bool rendering; + private static Bitmap bmp; + + static CSDiv() + { + } + + #region Canvas handling + /// + /// Initializes the CSDiv virtual screen + /// + private static void CanvasInit() + { + CanvasDone(); + canvas = new CSDivLayeredWinForm(); + canvas.CanvasBounds = canvas.DeviceBounds; + bmp = new Bitmap(canvas.CanvasBounds.Width, canvas.CanvasBounds.Height, PixelFormat.Format32bppArgb); + canvas.SetBitmap(bmp); + canvas.Show(); + } + + /// + /// Shutdown canvas + /// + private static void CanvasDone() + { + if (canvas == null) + return; + canvas.Hide(); + canvas.Dispose(); + canvas = null; + } + #endregion + + #region Actor handling + internal static void AddActor(CSDivActor a) + { + lock (actors) + actors.Add(a); + } + + internal static void RemoveActor(CSDivActor a) + { + lock (actors) + actors.Remove(a); + } + + private static void Execute(object state) + { + StepActors(); + RenderActors(); + } + + private static void StepActors() + { + lock (actors) + { + if (executing) + return; + executing = true; + } + try + { + CSDivActor[] acts; + lock (actors) + acts = actors.ToArray(); + foreach (CSDivActor a in acts) + if (a.Active) + a.Step(); + } + finally + { + lock (actors) + executing = false; + } + } + + private static void RenderActors() + { + lock (actors) + { + if (rendering) + return; + rendering = true; + } + try + { + CSDivActor[] acts; + lock (actors) + acts = actors.ToArray(); + using (Graphics g = Graphics.FromImage(bmp)) + { + g.Clear(Color.Transparent); + foreach (CSDivActor a in acts) + if (a.Visible) + { + GraphicsState gs = g.Save(); + a.Render(g); + g.Restore(gs); + } + } + canvas.Frame(); + } + finally + { + lock (actors) + rendering = false; + } + } + #endregion + + public static void Start() + { + CanvasInit(); + timer = new Timer(new TimerCallback(Execute), null, 0, 1000 / fps); + canvas.Show(); + } + + public static void Stop() + { + if (timer != null) + timer.Dispose(); + timer = null; + CanvasDone(); + } + + public static void Close() + { + Stop(); + CSDivActor[] acts; + lock (actors) + acts = actors.ToArray(); + foreach (CSDivActor a in acts) + a.Dispose(); + CanvasDone(); + } + + public static Rectangle Bounds => canvas.CanvasBounds; + + #region Extension + #endregion + } + #endregion + + #region CSDiv configuration + interface ICSDivCanvas : IDisposable + { + Rectangle DeviceBounds { get; } + Rectangle CanvasBounds { get; set; } + void Show(); + void Hide(); + void SetBitmap(Bitmap bmp); + void Frame(); + } + #endregion + + #region CSDivActors + abstract class CSDivActor : IDisposable + { + public static Random Random { get; } = new Random(); + + public CSDivActor() + { + CSDiv.AddActor(this); + } + + public virtual void Dispose() + { + CSDiv.RemoveActor(this); + } + + protected internal abstract void Start(); + protected internal abstract void Step(); + protected internal virtual void Render(Graphics g) + { + RenderTransform(g); + RenderSprite(g); + } + protected virtual void RenderTransform(Graphics g) + { + g.TranslateTransform(Position.X, Position.Y); + g.RotateTransform(Angle); + if (Size == 0) + g.ScaleTransform(0.00000001f, 0.00000001f); + else + g.ScaleTransform(Size, Size); + } + protected virtual void RenderSprite(Graphics g) + { + Image sprite = Sprite; + if (sprite != null) + g.DrawImage(sprite, new PointF(-(sprite.Width / 2), -(sprite.Height / 2))); + } + + #region Utilities (Static) + + public static int rnd(int min, int max) + { + return Random.Next(min, max); + } + + public static float rndf() + { + return (float)Random.NextDouble(); + } + + public static float rndf(float max) + { + return rndf() * max; + } + + public static float rndf(float min, float max) + { + return min + rndf(max - min); + } + + #endregion + + #region Utilities + + public float DistanceTo(CSDivActor a) + { + return (float)Math.Sqrt(Math.Pow(Position.X - a.Position.X, 2) + Math.Pow(Position.Y - a.Position.Y, 2)); + } + + public bool IsNearestTo(CSDivActor a, float distance) + { + return DistanceTo(a) < distance; + } + + #endregion + + public virtual bool Active { get; set; } = true; + public virtual bool Visible { get; set; } = true; + public virtual PointF Position { get; set; } + public virtual float X { get => Position.X; set => Position = new PointF(value, Position.Y); } + public virtual float Y { get => Position.Y; set => Position = new PointF(Position.X, value); } + public virtual float Angle { get; set; } + public virtual float Size { get; set; } = 1f; + public virtual float Radious { get; set; } + public virtual Image Sprite { get; set; } + } + #endregion +} diff --git a/Gola2/CSDivLayeredWinForm.cs b/Gola2/CSDivLayeredWinForm.cs new file mode 100644 index 0000000..c68ffde --- /dev/null +++ b/Gola2/CSDivLayeredWinForm.cs @@ -0,0 +1,210 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace XWolf +{ + #region WindowsForms Layered Canvas + public class CSDivLayeredWinForm : Form, ICSDivCanvas + { + class WinApi + { + public const Int32 WS_EX_LAYERED = 0x80000; + public const Int32 HTCAPTION = 0x02; + public const Int32 WM_NCHITTEST = 0x84; + public const Int32 ULW_ALPHA = 0x02; + public const byte AC_SRC_OVER = 0x00; + public const byte AC_SRC_ALPHA = 0x01; + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct ARGB + { + public byte Blue; + public byte Green; + public byte Red; + public byte Alpha; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct BLENDFUNCTION + { + public byte BlendOp; + public byte BlendFlags; + public byte SourceConstantAlpha; + public byte AlphaFormat; + } + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, + ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, + Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern IntPtr CreateCompatibleDC(IntPtr hDC); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern IntPtr GetDC(IntPtr hWnd); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DeleteDC(IntPtr hdc); + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); + + [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DeleteObject(IntPtr hObject); + } + + private WinApi.BLENDFUNCTION blend = new WinApi.BLENDFUNCTION(); + private Bitmap bitmap; + + public CSDivLayeredWinForm() + { + SuspendLayout(); + Name = "CSDivLayeredWinForm"; + StartPosition = FormStartPosition.Manual; + FormBorderStyle = FormBorderStyle.None; + ShowInTaskbar = false; + ResumeLayout(false); + // Blending + blend.BlendOp = WinApi.AC_SRC_OVER; + blend.BlendFlags = 0; + blend.AlphaFormat = WinApi.AC_SRC_ALPHA; + TopMost = true; + } + + protected override CreateParams CreateParams + { + get + { + // Add the layered extended style (WS_EX_LAYERED) to this window. + CreateParams createParams = base.CreateParams; + if (!DesignMode) + createParams.ExStyle |= WinApi.WS_EX_LAYERED; + return createParams; + } + } + + public void SetBitmap(Bitmap bitmap) + { + this.bitmap = bitmap; + Frame(); + } + + public void Frame() + { + UpdateBitmap(bitmap); + } + + ///// + ///// Let Windows drag this window for us (thinks its hitting the title + ///// bar of the window) + ///// + ///// + //protected override void WndProc(ref Message message) + //{ + // if (message.Msg == WinApi.WM_NCHITTEST) + // { + // // Tell Windows that the user is on the title bar (caption) + // message.Result = (IntPtr)WinApi.HTCAPTION; + // } + // else + // { + // base.WndProc(ref message); + // } + //} + + delegate void UpdateBitmapDelegate(Bitmap bmp); + + private void UpdateBitmap(Bitmap bmp) + { + if (InvokeRequired) + { + Invoke((UpdateBitmapDelegate)((ibmp) => UpdateBitmap(ibmp)), bmp); + return; + } + SelectBitmap(bmp); + } + + public void SelectBitmap(Bitmap bitmap) + { + SelectBitmap(bitmap, 255); + } + + public void SelectBitmap(Bitmap bitmap, int opacity) + { + // Does this bitmap contain an alpha channel? + if (bitmap.PixelFormat != PixelFormat.Format32bppArgb) + { + throw new ApplicationException("The bitmap must be 32bpp with alpha-channel."); + } + + // Get device contexts + IntPtr screenDc = WinApi.GetDC(IntPtr.Zero); + IntPtr memDc = WinApi.CreateCompatibleDC(screenDc); + IntPtr hBitmap = IntPtr.Zero; + IntPtr hOldBitmap = IntPtr.Zero; + + try + { + // Get handle to the new bitmap and select it into the current + // device context. + hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); + hOldBitmap = WinApi.SelectObject(memDc, hBitmap); + + // Set parameters for layered window update. + Size newSize = new Size(bitmap.Width, bitmap.Height); + Point sourceLocation = new Point(0, 0); + Point newLocation = new Point(Left, Top); + blend.SourceConstantAlpha = (byte)opacity; + + // Update the window. + WinApi.UpdateLayeredWindow( + Handle, // Handle to the layered window + screenDc, // Handle to the screen DC + ref newLocation, // New screen position of the layered window + ref newSize, // New size of the layered window + memDc, // Handle to the layered window surface DC + ref sourceLocation, // Location of the layer in the DC + 0, // Color key of the layered window + ref blend, // Transparency of the layered window + WinApi.ULW_ALPHA // Use blend as the blend function + ); + } + finally + { + // Release device context. + WinApi.ReleaseDC(IntPtr.Zero, screenDc); + if (hBitmap != IntPtr.Zero) + { + WinApi.SelectObject(memDc, hOldBitmap); + WinApi.DeleteObject(hBitmap); + } + WinApi.DeleteDC(memDc); + } + } + + #region GET/SET + + public void SetCanvasBounds(Rectangle bounds) + { + Location = bounds.Location; + Size = bounds.Size; + } + + #endregion + + public Rectangle DeviceBounds => Screen.GetWorkingArea(this); + public Rectangle CanvasBounds { get => new Rectangle(Location, Size); set => SetCanvasBounds(value); } + } + + #endregion +} diff --git a/Gola2/Gola.cs b/Gola2/Gola.cs index 52413b8..18ce218 100644 --- a/Gola2/Gola.cs +++ b/Gola2/Gola.cs @@ -1,38 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; +using System.Drawing; +using XWolf; namespace Gola2 { - class Gola:Actor + class Gola : CSDivActor { - private const float GRAV = 0.01f; + private const float GRAV = 0.6f; private PointF force = new Point(0, 0); private float elasticity = 0.8f; private float nofriction = 0.99f; - private int size = 64; + private int radious = 32; + private Color color; + private Brush fillBrush; + private RectangleF fillRectangle; public Gola() { - SetBitmap(Properties.Resources.ball); - Y = ScreenBottom; - X = rndf(ScreenLeft,ScreenRight); - force.Y = -rndf(5); - force.X = rndf(-3, 3); + Sprite = Properties.Resources.Ball2; + Position = new PointF(rndf(ScreenLeft, ScreenRight), ScreenBottom); + force.Y = -rndf(40); + force.X = rndf(-20, 20); + color = Color.FromArgb(rnd(0, 255), rnd(0, 255), rnd(0, 255)); + fillBrush = new SolidBrush(Color.FromArgb(rnd(40, 70), color)); + fillRectangle = new RectangleF(-radious, -radious, radious * 2, radious * 2); } - protected override void Step() + protected internal override void Start() { - X += force.X; - Y += force.Y; + } + + protected internal override void Step() + { + Position = new PointF(Position.X + force.X, Position.Y + force.Y); force.Y += GRAV; CheckBounds(); CheckCollision(); } + protected internal override void Render(Graphics g) + { + RenderTransform(g); + g.FillEllipse(fillBrush, fillRectangle); + g.FillEllipse(fillBrush, fillRectangle); + RenderSprite(g); + } + private void CheckBounds() { if (Y > ScreenBottom) @@ -60,22 +72,22 @@ private void CheckCollision() { - Gola[] golas = ActorEngine.GetActors(); - foreach(Gola g in golas) - { - if (g == this) - continue; - if (IsNearestTo(g, size)) - { - force.X = rndf(-3,3); - force.Y = -5; - } - } + //Gola[] golas = ActorEngine.GetActors(); + //foreach (Gola g in golas) + //{ + // if (g == this) + // continue; + // if (IsNearestTo(g, size)) + // { + // force.X = rndf(-3, 3); + // force.Y = -5; + // } + //} } - private int ScreenLeft => Screen.WorkingArea.Left; - private int ScreenRight => Screen.WorkingArea.Right - size; - private int ScreenTop => Screen.WorkingArea.Top; - private int ScreenBottom => Screen.WorkingArea.Bottom - size; + private int ScreenLeft => CSDiv.Bounds.Left + radious; + private int ScreenRight => CSDiv.Bounds.Right - radious; + private int ScreenTop => CSDiv.Bounds.Top + radious; + private int ScreenBottom => CSDiv.Bounds.Bottom - radious; } } diff --git a/Gola2/Gola2.csproj b/Gola2/Gola2.csproj index ec308ac..26a659a 100644 --- a/Gola2/Gola2.csproj +++ b/Gola2/Gola2.csproj @@ -30,6 +30,9 @@ prompt 4 + + Gola2.ico + @@ -43,8 +46,10 @@ - - + + Form + + Form @@ -52,17 +57,11 @@ MainForm.cs - - Form - MainForm.cs - - PerPixelAlphaForm.cs - ResXFileCodeGenerator Resources.Designer.cs @@ -86,5 +85,14 @@ + + + + + + + + + \ No newline at end of file diff --git a/Gola2/Gola2.ico b/Gola2/Gola2.ico new file mode 100644 index 0000000..f7abd88 --- /dev/null +++ b/Gola2/Gola2.ico Binary files differ diff --git a/Gola2/MainForm.Designer.cs b/Gola2/MainForm.Designer.cs index e71ab4f..2d15846 100644 --- a/Gola2/MainForm.Designer.cs +++ b/Gola2/MainForm.Designer.cs @@ -28,60 +28,139 @@ /// private void InitializeComponent() { - this.button1 = new System.Windows.Forms.Button(); - this.button2 = new System.Windows.Forms.Button(); - this.button3 = new System.Windows.Forms.Button(); + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.trayMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.addGolaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeGolaToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.trayMenuStrip.SuspendLayout(); this.SuspendLayout(); // - // button1 + // notifyIcon // - this.button1.Location = new System.Drawing.Point(12, 12); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 0; - this.button1.Text = "Start"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); + this.notifyIcon.ContextMenuStrip = this.trayMenuStrip; + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); + this.notifyIcon.Text = "Gola2"; + this.notifyIcon.Visible = true; + this.notifyIcon.Click += new System.EventHandler(this.notifyIcon_Click); + this.notifyIcon.DoubleClick += new System.EventHandler(this.notifyIcon_DoubleClick); // - // button2 + // trayMenuStrip // - this.button2.Location = new System.Drawing.Point(93, 12); - this.button2.Name = "button2"; - this.button2.Size = new System.Drawing.Size(75, 23); - this.button2.TabIndex = 1; - this.button2.Text = "Create Ball"; - this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.trayMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addGolaToolStripMenuItem, + this.removeGolaToolStripMenuItem, + this.toolStripSeparator2, + this.aboutToolStripMenuItem, + this.toolStripSeparator1, + this.exitToolStripMenuItem}); + this.trayMenuStrip.Name = "trayMenuStrip"; + this.trayMenuStrip.Size = new System.Drawing.Size(181, 126); // - // button3 + // exitToolStripMenuItem // - this.button3.Location = new System.Drawing.Point(174, 12); - this.button3.Name = "button3"; - this.button3.Size = new System.Drawing.Size(75, 23); - this.button3.TabIndex = 2; - this.button3.Text = "Stop"; - this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6); + // + // addGolaToolStripMenuItem + // + this.addGolaToolStripMenuItem.Name = "addGolaToolStripMenuItem"; + this.addGolaToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.addGolaToolStripMenuItem.Text = "Add gola"; + this.addGolaToolStripMenuItem.Click += new System.EventHandler(this.addGolaToolStripMenuItem_Click); + // + // removeGolaToolStripMenuItem + // + this.removeGolaToolStripMenuItem.Name = "removeGolaToolStripMenuItem"; + this.removeGolaToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.removeGolaToolStripMenuItem.Text = "Remove gola"; + this.removeGolaToolStripMenuItem.Click += new System.EventHandler(this.removeGolaToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.aboutToolStripMenuItem.Text = "About"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); + // + // label1 + // + this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(143, 14); + this.label1.TabIndex = 1; + this.label1.Text = "Gola2"; + // + // label2 + // + this.label2.Location = new System.Drawing.Point(12, 23); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(143, 18); + this.label2.TabIndex = 2; + this.label2.Text = "(C) 2019 XWolf Override"; + this.label2.TextAlign = System.Drawing.ContentAlignment.TopRight; + // + // label3 + // + this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(12, 48); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(143, 23); + this.label3.TabIndex = 3; + this.label3.Text = "USE WITH CAUTION!"; + this.label3.TextAlign = System.Drawing.ContentAlignment.BottomCenter; // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(354, 49); - this.Controls.Add(this.button3); - this.Controls.Add(this.button2); - this.Controls.Add(this.button1); + this.ClientSize = new System.Drawing.Size(167, 80); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; - this.Text = "MainForm"; + this.Text = "About..."; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); + this.trayMenuStrip.ResumeLayout(false); this.ResumeLayout(false); } #endregion - private System.Windows.Forms.Button button1; - private System.Windows.Forms.Button button2; - private System.Windows.Forms.Button button3; + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.ContextMenuStrip trayMenuStrip; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addGolaToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeGolaToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; } } \ No newline at end of file diff --git a/Gola2/MainForm.cs b/Gola2/MainForm.cs index 5d09f2e..07b8b9c 100644 --- a/Gola2/MainForm.cs +++ b/Gola2/MainForm.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Windows.Forms; +using XWolf; namespace Gola2 { @@ -14,21 +15,63 @@ public MainForm() { InitializeComponent(); + CSDiv.Start(); + CreateGola(); } - private void button1_Click(object sender, EventArgs e) - { - ActorEngine.Start(); - } - - private void button3_Click(object sender, EventArgs e) - { - ActorEngine.Stop(); - } - - private void button2_Click(object sender, EventArgs e) + public void CreateGola() { new Gola(); } + + public void DestroyGola() + { + + } + + private void notifyIcon_DoubleClick(object sender, EventArgs e) + { + CreateGola(); + } + + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + Application.Exit(); + } + + private void notifyIcon_Click(object sender, EventArgs e) + { + //trayMenuStrip.Show(Cursor.Position); + } + + private void addGolaToolStripMenuItem_Click(object sender, EventArgs e) + { + CreateGola(); + } + + private void removeGolaToolStripMenuItem_Click(object sender, EventArgs e) + { + DestroyGola(); + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + switch (e.CloseReason) + { + case CloseReason.ApplicationExitCall: + case CloseReason.TaskManagerClosing: + case CloseReason.WindowsShutDown: + return; + default: + e.Cancel = true; + Hide(); + break; + } + } + + private void aboutToolStripMenuItem_Click(object sender, EventArgs e) + { + Show(); + } } } diff --git a/Gola2/MainForm.resx b/Gola2/MainForm.resx index 1af7de1..3ed3648 100644 --- a/Gola2/MainForm.resx +++ b/Gola2/MainForm.resx @@ -117,4 +117,267 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 123, 17 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANMcEAAAAAABkzTgyTMkKqUTI + BM8/xAX2RMoC9UbMAc1LzAWoYcEcNwAAAABYxB8AAAAAAAAAAACYzpAAAAAAAI/HkwZjy0SaU8wN/1DN + Bv9P0Ab/UdID/0/SAv9O0gL/Ts8F/07PCP9YyBePcrlFBQAAAAAAAAAAAAAAAAAAAABuzFLIVc4g/1PP + Gv9V1Bj/V9ca/1fYHv9T1RT/WNEd/1fSI/9T0hT/V84P/13QK8R502MFX8AdAAAAAAB5y2asYNA4/1nV + LP9c1Cb/X9Yw/1zbJ/9d1iz/V9ge/1rcJP9Z1yH/Wdgn/1nUIP9g0jf/Y8gtjwAAAACFzm0oadBD+l3S + Mv9c0h3/V9Qt/1rVMf9T0w3/W9ow/1vcJ/9c2DH/UNIR/1vZKP9c2iX/W9Ei/2LJPP9+x1w3e81jg2PQ + P/9e2jL/Vc0c/1vbJP9a1xz/Wdwe/2DQNv9b3CH/X901/1jYG/9a0iX/Xdos/1vUKf9h0zn/b8lSqHDO + UtNf1Df/Xtsz/1rVJP9X3R3/U9QO/1rdF/9S0w//VNoJ/1rcF/9PyQv/Wtsj/17cLf9b1Cv/X9Q4/2zR + TM1q0E76XtYw/1rVLv9Y0CD/VNUS/1bbD/9U3gX/XNcj/1TYD/9W2g3/XNch/1ncHP9c3ij/U8oY/17V + M/9pyEr1aM1N+VnWLf9Z2ir/V9we/1bdE/9U3Qb/TdYC/1DaAv9R2gP/UtoC/07NCf9V3Q//V9wg/1rZ + Jv9f1jT/Zs1H9mjLSNNZ1i7/X9wx/1vcLf9Y2if/VNsJ/0jIAf9J0QL/UNoB/07WBP9U3QX/VdwQ/1jc + KP9Z2B//XdUw/2bSS89qyD2FWNIg/1zcM/9j4EL/X+A5/1neHv9U3gj/TdAJ/1LbB/9c3R3/W+Ac/2Df + Lv9f3jX/Xdgq/13XNP9pzUipdMtcKmDRNfpc1zD/aN9I/2jeSP9k3zb/Y9co/2nhPP9w3kz/aOM8/2Pi + O/9p4k//Zt4//1nYHP9j00H/gcdwMgAAAABozU20XdUx/17dP/9j1zb/ceNT/2TfNP9h4Dn/YOAz/2Le + LP9t4kv/Z9wy/17bMv9c1Dn/c89UmgAAAAAAAAAA5eb/AmjPSblf1jb/X9sv/2PcKv9y4Vj/d+VZ/3Pj + Vv902kj/Y9kz/13XNf9j1z7/aM1DyJHMjAZUzCAAAAAAAITMaQD/rP8Cas9FtGLSM/pi10j/ZdtC/2Td + Qf9g2j7/cddX/2HXO/9i1D36bc1QrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3zVcqbs9PhWvQ + R9Nn00L5Y9I9+mXRPdNty0eDcdFQKAAAAAAAAAAAicZrAAAAAADwDwAAwAMAAMABAACAAQAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAAgAEAAMAHAADwDwAAKAAAACAAAABAAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIbR + YgAAAAAAZ8o3Qk/CGqlCxgjyLrgE/z3AAf9AxgH/Q8oD/0TLAvNFzQSpRM0BQ0mcFgFjwzUAAAAAAG7K + KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQrYrAAAA + AAB70GUrVckloVDLDvBFygH/RcgB/0XKAP9Cxwb/R8sE/0jNAv9HzQH/R84B/0fNAf9IzAj/T80F7lXD + FKF3xSgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh9N8AAAA + AAD///8CcshfhlnKG/9VzAD/UMsH/0/LBv9LzgT/TM0E/1DRAP9N0AP/TdIA/03SAf9N0QL/S88A/0vQ + A/9MzQT/TNAD/0/NBv9nwCKObLNFBgAAAABmuTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAm9yaHGjFTdZTzx//T80J/0/LBP9Q0Af/UNEI/1LTBf9T0gr/UdMF/1HSBP9T1Qb/UNMG/07R + BP9P0wT/UdIE/1HPCv9TzxD/UM0E/1PMEf9dzRbWbKpFJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACYzpAAAAAAAI/Fiylpx07/WNIq/1LNGP9VzCf/XNYx/1LSFv9V1xP/U9YQ/1fWGv9U1hL/UtQR/0LE + Bf9S1Qv/UtkC/1PWDf9T0xT/U9MV/1PSFf9Pzwr/UMgD/1TOF/9ezCjzZ8MwIwAAAABjvi0AAAAAAAAA + AAAAAAAAAAAAAAAAAACz1bUXdM1c8V3LNf9Zzy3/VNIX/1bPGv9Szw3/VNUb/1fWHP9Y2Rz/WdYj/1vX + Jf9W2yf/W9sj/1TVFv9Z1Rv/ZsJR/1vWJP9W1CH/VNUe/1fUFP9Wzw3/WM4X/1nSIf9n0zvzYrIpJwAA + AAAAAAAAAAAAAAAAAACfyp4AuuG4CX7IbOhj0j7/X9A3/1vULf9U1Cj/WtYq/1vYH/9d2Cj/W9km/13X + LP9f3Cf/Xdsj/1zaK/9b2Cb/Vtcj/1fcJP9h2TH/WtYg/1rXI/9X1yX/Wdge/1jSF/9a0iP/W9Er/2bT + Rv9fxyTWa6xNBgAAAAAAAAAAz+bKAAAAAACLyYeBZNBK/2XHQP9i0zf/W9cr/1/XLv9h1i3/TsYP/2bU + Qf9l207/Xtsr/1zcHv9b1in/Xsg1/1vXJv9W2hf/VdUY/1veH/9c2xv/VtQe/1rZKv9Z2Sf/WtYk/1nV + Jf9Y0ir/ZNhH/2nQP/9gux2OAAAAAHOmTgAAAAAA19HVFXXOWf9m0Dr/YtQ+/2LUOv9a0CH/Xdos/1vQ + Kf9XwSX/Vbot/1zSOv9V1R3/UNQT/1vWM/9i0kT/Xdwf/1rcHP9a2Sr/WN0c/1nYG/9Izwv/WNsu/1vb + J/9d1yX/Wtcj/1zRJv9izzH/YdJA/2jGOf+AsGEoAAAAAAAAAACHyXm7btJG/2PTOP9f1jj/YNIv/0/D + AP9g3Sj/T9Ei/1bbMf9V2yL/Wtwk/1XRB/9OzQf/WNom/1zeJv9Z3SP/Xd0t/2LWSf9b2C7/W9we/0vN + C/9b1Cb/XNgm/13bKP9a2SP/WtMg/1zQI/9n0jr/Ysk//3TLUqGTr3gAl8eRGHTPXfBmzUD/YtM9/2DX + Nv9e2DP/WNke/1vYK/9f3S7/X9wm/1zcIP9b2yX/WeAf/1fcHP9c3CP/X9Au/1vdFP9c3Cn/beFY/1za + Lv9W3h3/W9ki/1vLMP9b1yb/Wtsm/1zYK/9c1Sn/VMke/2DWOv9l0ED/cMlU7v//3wGO0H0/cc9V/2PP + O/9k1jv/Xtky/1zaMv9eziD/RrYF/1zaKf9W2Bz/TckH/1vVG/9X2R3/Wtsh/2XWQf9ixEr/Wdkd/1ne + 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 + LftRyRL/UMsB/1HMAP9NzQH/Ts0C/0/NBP9Q0AT/T84E/0/NBv9R0QX/UdED/1DRA/9Q0gP/UdED/0/S + Av9O0gL/TdEC/0zRAf9P0QH/UNAD/07LBv9RzQ3/Ts0B/1LNB/9VyxT4UcgY0my2MjMAAAAAZrk1AAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAInFgAAAAAAAwP/EAn/M + dVdowlPvW8ss/1LRF/9Qzg7/T8wH/0/MB/9Pzwn/U9MM/1HSCf9R0wf/VNUJ/1PTC/9R0wb/UdME/1HT + BP9S1Qb/U9UH/1DSCP9P0Qb/T9MF/1DTBf9R0gb/UdEI/1LRDv9T0BL/T84E/1DMB/9TzA7/VcwT/l7P + Fe5ntjdjAAAAAGLAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAob6TAAAA + AACWxZ0EgsV0ZGjKTv5Y0TL/WNEf/0/KGP9Oxhz/X9cz/1vWKv9T0xX/UtMS/1TWEP9T1g3/VNYS/1fX + GP9U1hH/U9YO/07QC/9CxAL/TM4K/1PXB/9S2gH/U9oD/1LVCv9S0hD/UtIS/1PTFP9T0hX/UNEN/07N + CP9OxwT/WtAM/1LNG/9fzCr3Yr4leAAAAABsxjsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACYzpAAAAAAAMSwtQSUwodiastX/17HL/9h0TL/VM4f/07KEf9TziP/T84l/0zOHv9T0hz/VdUZ/1TX + Ev9S1RT/VdMf/1nWJf9Z2SL/Wdkf/1fXHv9X1x7/S8sS/1DPD/9R0wv/U9EW/1rNM/9Y1SL/VNUb/1XW + G/9T1Bf/UtUU/1LRDf9PyQH/VcsA/1zOHf9S0SD/YdUv+G3EPHgAAAAAY74tAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAK7cpgAAAAAAqM6nA4/NhE51zF//ZNE//13NNf9a0S//Vc8k/1fUG/9Y0Rv/Vc8P/1XT + Dv9U1xv/VtQe/1nXHf9a2hz/W9oi/1jUIv9Z1CT/V9ko/1fcKf9b3CX/Wtgg/1bZFv9Z2Rr/Yc03/2y9 + YP9f0TH/V9Mj/1bVI/9V1SL/VdIZ/1nWFf9X0RH/WtEW/1bPGP9a0xv/X801/2fVPfdjuyxjAAAAAGa0 + NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADr+O0BnNORKn7IbfJn00b/Y9A8/17QNv9c0y//WNQp/1XV + J/9a1in/WtYg/1rWIP9c1ir/Wtgk/1rXKP9c1yz/Xtop/2DeKP9f3CT/W9oo/1rZK/9c2Sn/XNgo/1bX + KP9W2ib/X9ws/2PVOP9c1ib/WtYi/1jWI/9W1iT/WNcg/1nYG/9X0hX/WtEb/1rSI/9Z0SL/Yc9A/2bT + Qv9exyPuaK84MwAAAABwqWIAAAAAAAAAAADP5soAAAAAAAAAAACPzYYLhs16xmfMTP9fyzj/YM44/17S + NP9a0yz/VtMm/1fTLf9a1S//XNco/17YIv9h2Sj/X9ot/1vcKv9b2yv/Xtoq/1nYHf9Z1x//Xdcn/2Hc + Kf9Z2B3/VNcT/0zWCv9S2xT/V9wj/1vYMP9Z1h7/Wtgf/1zaJf9Z2Cj/Wdco/1fWIP9Z1R7/W9Mj/1bQ + JP9Z0yj/ZtVJ/2XUR/9m0zj+XMQQ0p5l/wUAAAAAc6ZOAAAAAAAAAAAAAAAAAKfNpwSXypRwcMpi/2LQ + RP9pxkf/YNA2/2HVNv9c1y3/Xdgr/2HYL/9i1i7/WMwc/03CDf9fzTP/bdZd/2HbRv9a3Cn/Xtwj/1vb + Hf9a1yf/W8g1/2DKOP9e1iz/WNsb/1raHf9W1Rv/Wdoc/1vgG/9e3hz/TcwQ/1jXIv9a2Sr/Wtot/1nZ + Jv9a1yT/XNQo/1jWJP9W0iP/X9JA/2XYRv9p0EX/aNA4+GC5G4sAAAAAAAAAAAAAAAAAAAAA/+j/AKjY + nBl80Gb1a8xG/2XQO/9j0kD/Y9U8/2DUNv9c1ib/XdUv/13bKv9d0yb/VMEa/1a6HP9auC7/Vrw4/13V + PP9Y2ir/UdUZ/1bZHf9c2C//YM5I/2LSQP9f2yP/XNsX/1ndHP9b2yj/Wt8d/1XaGP9a2Rz/RMcF/07V + FP9V2i3/Wtwp/1rZJv9c1yX/XtUk/1nWJP9c0Sr/X9Ql/2TPOP9h0z7/Ys1I/23GOet3nlgnAAAAAIy1 + bgAAAAAAptCZA5nKioxwzFH/Z80+/2HSNv9g1Tn/YdQ9/1/SLf9PwwX/W8wX/1/YMv9b1DT/YNhC/2Hc + Pv9Y1ij/WdMw/1raKv9U0g//TccA/1DQDf9Y2Cn/Xdk1/13cL/9a3SX/Wdwl/1vdJv9Y1S7/Xdst/13d + Kv9c3CL/TM8K/0zRDP9a2yT/XNon/13bKP9d2Sf/XNcl/1rYIf9Z0iP/WdEY/2DPLP9m0zX/YchG/16+ + Nvp9x1qkAAAAAAAAAAC+3cIAotWdEoDLbvZv0kj/aNJA/2HVOP9g2Db/YNM5/1vQJf9MxQD/WtAR/1/d + Kf9U1CL/TtMl/1LaJf9R2hv/W94n/1rcIf9X1hD/UM0D/1LSD/9Y2yH/W90m/1vdJP9a3SL/WNwe/2Hd + N/9n2VH/XtU8/1vZLf9b3CD/VdgT/0zLDf9Z0CX/Vc8e/1/bKf9d2yj/XNso/1rYJP9d1ib/UcoP/17P + Jv9m0zf/Zs9A/2XLQ/9vzk7omK14IgAAAACJu4YBlMeNanHPWf9q0EP/Yss+/2HVPf9e1jb/ZNg6/17Y + Lv9W2Bb/Wdch/13XMP9g3C//YN4s/1vZIf9Z1xz/Xt0n/1rbJP9a3yH/Vd0b/1bbHP9b3h7/X9km/2DY + Jv9e3Bv/V9sJ/2TcQP9z4Gn/YtdG/1zcK/9Y3Rz/W94c/1zUIf9bxzH/TsUX/2HcKv9c2yj/Wdso/1zX + K/9f1iz/UswU/1TFH/9f1D7/YtYz/2jPR/9vzFf1fsFVhQAAAAC/87EChM1zx3DQU/9mz0D/Xcc3/2PV + Of9g2S//Xdk1/1jZL/9b2Cv/W9Mh/1TVHf9Z3Cv/Xd0s/1jZG/9Q1Q7/XNwi/1zbI/9Z2x7/Wd4c/1zd + IP9g1y//YcNH/13IM/9X2xP/Vt8b/1ffK/9a4Sz/Wt4n/13eKP9W3yH/Vdwg/1rbJf9e2Sr/W9cx/1ra + KP9a2yX/W9kp/1/ZL/9d1y3/Xtgv/1jTKf9e2DD/YNFA/2LQPv9qzlD/a8NKzwAAAAC14KYXfMpo/2zR + TP9k0Tv/YtA8/2TYOv9f2jH/W9g1/17aMv9h0yb/TrcI/0q7Cv9e2Sj/Wdsl/1TVFP9OyQP/UcsN/1nR + Fv9X1Rr/WNwd/1rZI/9h1Tn/ZstP/1/KOv9Z1h//W90h/1feIv9X3h//Wt4d/1veGv9X1RH/Uc0N/1nU + Ef9c2A7/Wtsj/13dKf9e3S//Xto0/2DaMP9f2S//X9kv/1nTKf9X0Cv/YdI+/2TTPf9pz0v/bMhP5Wil + QDaXx4VYbMxT/2nSRP9i1Db/YtY8/2LaO/9b2DH/Xdo1/13bMv9c0ST/S7gJ/1HFE/9c2ib/W98i/1na + Ff9RzAX/S8YB/1HHC/9X0xn/Wd8b/1XXGP9Wzib/W9Eq/1TSF/9U1gz/Wt4O/1jeGP9Z3xr/Wd0V/1nd + Ev9UzQT/TsID/0rABf9a1g7/Wdwe/17dLP9d2jD/Xtsy/1/ZL/9d1y3/X9kv/17YLv9e1jP/YdI9/2XV + Of9p0Uf/btBV8XvITXONx3mQZc5H/2bRQP9e0zP/X9Q4/17XN/9d2zP/YNs3/1vbMv9d3C7/Xdgo/1nc + Jf9W3CT/V94d/1ncFf9V1g7/TtAH/1rYF/9e3h//WuEX/1XbDf9W1xL/UNML/0fMAP9R1gb/WNwL/1fc + Ef9a3hn/WtwW/1rcEv9VzgT/Sr8F/03EFP9X1h3/V9kh/1vaLP9d2zD/Xt0r/2DaL/9g2i//XNYs/1nT + Kf9e1TT/YNI+/2TWN/9o0kX/atBS+33SUKSEznK8ZNBF/2bQQf9f1Dr/X9Q2/1zUL/9h2zL/X9k2/1nO + Lv9b0Cn/W9Ik/1zZI/9Z2h//Vdwc/1PcFf9Y3BT/WdwZ/1reFv9Z3hT/WdwW/1jdEv9W3Q3/VdMP/1PN + Ff9V2Qr/UtwE/1LcBP9X3hD/Wd0W/1feEP9U0Qv/TcoI/1fZGf9Z3h7/Wtsl/1vaLP9e3S7/Xd0o/17b + K/9d1yj/TsQZ/0m8FP9h1jb/X9Q//2DUN/9r0UX/btBQ/3jNWcuCy3DdY9NC/17NN/9e0zb/X9Y0/2DZ + Mv9e2S3/XtQz/1jEOP9Wxyf/WM8V/13LKv9WzRv/XNwZ/1ndEv9W2hL/WNoX/1rdF/9Y3hH/WN4O/1bc + DP9U3gf/Y9U4/2nQUP9a1CT/T9YH/1HZBv9W3gr/Vt0L/1fdD/9Z1SD/WNcc/1zdF/9e3BT/Wdoh/13c + K/9e3Sz/Xd4m/13cLv9e1yj/SbYJ/0uzCf9f2DD/Ydc+/2DVNv9nzUP/actL/3PNV+WAy27yX9U9/1fL + L/9b0DD/XtYx/1/ZLv9c2Cr/Wtgy/13UOf9Y0Sn/WNIc/0++G/9Mww//WtkU/1TYCf9T2gn/UtgM/1Xc + Df9U3AX/VN4E/1PcBf9R2wL/X9E1/2bNT/9Y1SD/T9oC/1HaBv9T3QP/UtoH/1raIP9ezDr/WtAp/1na + F/9X2xD/Wd0h/1zcKP9c3Cn/Wt0i/13bLf9f2Sj/S74J/0/ACf9RzB3/YNg7/2DUNf9jyED/Y8ZF/23O + U/V7zWn9XtM7/1TLLP9a0TH/W9Qu/1vXKv9b2Sr/VNor/1fcKP9Y3Cj/WNgl/1XRG/9W1hn/UtgR/0vU + A/9S2wL/U9sG/1TdBf9T3gH/Ut4A/1HdAv9Q2wP/U9oF/1TYCf9S2wP/UdsC/1DZBf9T3QH/UtQK/1/N + OP9nykr/W80o/1XZEf9U3RT/Wt4e/1ncIP9Z3CD/Wd0g/1vZK/9c2ir/V9Ue/0jHDP9GwhH/Yto5/2HV + Of9kzUL/Zs1K/2rLTf5yzGT9Yc9B/17SN/9b1Df/W9gu/1jXKP9a2Cz/Vdcl/1fZJf9Y3CT/V90g/1Pd + F/9T3Rb/UdwS/07ZCf9S2gX/U9wG/1LcAv9R3QH/UN0C/0/eAf9O3wD/UNwA/1HaAf9R2gL/UdoC/1Db + BP9T3gH/U9EJ/1/CM/9byir/U9EP/1XbB/9V2w7/VtwX/1bdFP9W3hX/Wt4f/1nbLf9b2yz/XNon/1bU + Hv9Myhb/Ydg1/2HUPf9h1ED/ZdJL/3HJT/51zGfyYMw//1/SNf9b1Tf/WtYt/1nYKf9b2S3/WNop/1fa + Jv9Y3CT/V9wf/1XdFP9V3hH/Vt4U/1jeFf9W3Av/VN0F/1LbBP9P2AT/TNUC/03WAf9P2QL/UdoC/1Ha + Av9R2gL/UdoC/1HaBv9S3QL/UdkA/1LRBv9S0gb/RsQE/1DSDf9T3An/U9sS/1XdEv9W3Bb/Wdwh/1ba + Jv9b3Cj/Wtkk/1zZJf9d2Sn/X9Y1/17TOf9e0jr/ZNFL/3DIVPV4zWrdZctB/1vLLf9X0TP/WdYs/1rZ + Kv9c2S7/W90s/1ncKP9Y3SX/V9sf/1rcGP9U2g7/VdgW/1nYHv9V2g3/U90E/1DYA/9JzgP/RsoC/0fL + AP9M0AL/UNgD/1LbA/9R2gL/UdoC/1LbA/9S3AP/Ut0D/1LeAf9V2QP/S84A/1DXBv9S2wf/U9sO/1Td + D/9V2xb/Wdoj/1TbHv9Y2yL/V9Yh/1vYJf9e2C3/X9U2/17TN/9d0jb/ZdFN/3HIW+V+zG28YNA9/1fE + Kf9Uyi//W9kx/1jZLP9d2jH/W98p/1ncJ/9Z3Cj/V9ol/1rcI/9V2hj/UdQZ/1DRGP9R1wn/UdwB/0zV + AP9KyQL/S8QD/0bCAf9JywL/T9cD/1LbA/9R2wL/UdoB/1LcAf9T3AP/UdoE/1HcBf9W2wj/Vd4D/1Te + Av9T3AX/U9wK/1XcEv9V2x7/V9om/1jbJP9X2CD/WNYf/17ZJ/9c1yr/XtUz/17TOP9i1j7/ZdJP/3LM + X8uIyXSQWtI6/13JL/9ZzTT/Wdgy/1jZLf9h2jL/XN4v/1zdL/9c3C//Wtss/1jeKP9Y3Cz/XNw7/1va + Mv9X3A7/VN0G/03VA/9NywP/TcMB/0XCAf9EzAH/StQB/07WAv9Q2QL/UdsB/1LbAf9Q2QD/S9UA/0vU + Af9S2wT/Vd4G/1XeB/9W3gb/Vd0M/1fdHP9W2yj/Vdsq/1zaK/9W1x7/W9of/1zXIP9c2Cj/XdYv/1/T + Of9j1UX/ZdFQ+3bNZKWQyn9XYspD/13LJv9a0i3/Wdcu/1vYK/9k2i3/YNs//1/cOf9e3DX/Xt4z/1ve + MP9b3TD/YeA+/2DdOP9a2xj/V9wR/1LZC/9N0gX/Ss8B/0fQAf9F0QL/RMsB/0TJAP9M0wL/UtsD/1Db + Af9K0gD/TdMI/0vQBf9R2QX/Vt0K/1fdDv9X3Q//Wd0X/1veI/9Z3Cv/WN4t/1zcKf9Y2h7/XNse/1bS + Gv9b1yf/Xtcv/17TOf9i00L/Zs1L8XzHcnOg0pMabslQ/1bFFf9YyhD/W9Qm/1rYMP9c2TD/Xtw5/2Dd + Of9h3jv/Y989/1/fOv9d4DH/XeEx/1zeKv9c3Rr/Wd0T/1XdCf9R2gP/UNoC/1DbAf9M0wL/RcYE/0DB + Af9KzwT/U9sF/1HdAP9P1Qf/W9sb/1fZFf9V3An/WN4N/1vgFf9b3hn/Xd4g/17dK/9a3TD/WN8u/1zZ + L/9e3Cj/Wtch/1rUI/9b1yb/YNgw/1/TOP9i0kH/actH5ovFjzb///8AecddyFPLHf9SxgD/WNEc/1jY + K/9W2iv/XNov/2PePv9l30L/ZN9B/2DgP/9e4Dr/X989/17fO/9c4Sv/WN4d/1jeE/9V3Av/Ut4E/1Lf + BP9Q2QP/TNAH/0vPCP9Q2Qf/U90J/1PfBP9Y3RT/YN8k/13eHf9W3w//WN8X/17hJf9e4Sb/X94w/2Hf + Nv9g3zj/XN00/2DdM/9f2zD/XNYo/13WJ/9c1yr/XNc0/1/UP/9l0kX/a8hHzAAAAABkqkkAgcJqaWDO + Ov9Z0R7/WtMm/1rVJv9Z1yL/XNkw/2TdP/9m3UT/Z+BG/2ThSP9g3z//YeM7/2TiQP9l3UX/YOAy/1rf + J/9Z3h//Wt4V/1fcEf9X2hX/WNkb/1nbG/9e4CD/Xtwo/1rcG/9a3xT/WeAR/1rgEf9Z4Bz/X+Ew/2Xh + Qf9m4EX/ZOA//2PfPf9h3jv/X9w5/2HcNv9h2zT/X9ku/13VKf9c1i//W9Y3/2DUQP9pz0j2dsVhhgAA + AACNw30AhcRxF3TIWPFe0Tz/X9M2/13TKv9d1Cb/Xdk0/2PdO/9l3kL/aN9J/2rhTv9o4Uf/Wtsv/0rJ + GP9c0Sz/a+VB/2zmUP9t5U3/Y9on/1nTD/9Z2RD/XN8c/13eIP9W0Bv/YdIw/2HcKf9a3hb/W98X/2Lg + Kv9r4U7/buZS/2njSP9m4kL/ZeBC/2bhQ/9k30L/ZeBD/1/ZN/9h3DH/X9or/17VLf9c1TL/WtQ0/2TR + Q/9vylHom8inIwAAAAAAAAAAgLk8AIHEaIxlzkP/YtI4/1rVLv9Z1i//XNc0/2HeN/9j3D//ad1L/3Dj + U/9w4lP/Zd49/1fVJP9c2Sr/Z+A3/2/hSv9x4U3/aNYy/2zTKv903Uf/dOVZ/3fpWv9x2VD/fNhf/3/l + aP965mT/d+da/3HmSf9r403/aONF/2TiO/9k4D3/Zt9G/2rjS/9o4Ur/aOFL/2DbN/9c3Cb/V9Ud/17W + Kv9b1TP/XdQ5/2zOVPt7yWqiAAAAAAAAAAAAAAAApMGKAIzHdB9yzlzvXNU0/17GKv9V0yn/XtYz/2Db + Nf9f3Db/Yt0//23fV/925GX/deRe/2jcR/9h3Tf/YN4v/2TgM/9h3S//WtIX/1vLDf9h1if/aeE//3Hk + TP955ln/dt5X/2vhS/9p4Uz/a+JH/2fjNP9h4i3/XOIr/1vcPP9n4Uj/buFc/3DlWf9s403/aeBG/2HZ + G/9W2Ab/UdQJ/13ULf9f0jb/YdJE/3jRWuuXy5MoAAAAAKLMrABpskgAAAAAANn/9gGF0XZtYc1E/13O + Lv9c0i//Xdct/1/ZNP9g3Dn/X9w+/2PdSP9t3U7/aNFB/2PTNf9i3zX/Y906/1/eLf9c3yj/XNoj/1vT + F/9Y1yP/W94r/1/gL/9i4jX/X+Av/1vfK/9c3yv/YOAo/1nbF/9e3Sf/XOIp/2biSv956GP/eu1h/2fa + S/9q4Ev/ZNpB/1nWFf9X1hn/W9ko/1rUMv9e0zr/atJG+4TKcYYAAAAAAAAAAAAAAAD///8AAAAAAAAA + AACY0ocSespkvVvPO/9e0Db/XNcs/13XNP9f2j3/YNxC/17gPf9h2zX/YdIp/2XSNf945WX/e+dm/2nf + Pf9h3zD/Yd84/2HeMP9g4TL/YN87/2DeO/9g4Tb/XuAz/2DfMf9j4S//Xdol/1/ZJP9e3iH/a+FN/4Pr + d/9s3Tn/WtUa/13WJv9k3Tj/Xtw0/1zdLv9a1Tn/XNM//1zTOf9h0EX/esxZza3IwgwAAAAApNKTAAAA + AAAAAAAAnNeOAAAAAAAAAAAAitB3L2rOUetZ0Dj/W9Ex/1vUNf9c2Dj/Xtw//17eRP9b3jT/Wtou/2Hb + Nv9t30X/duRb/4breP+E6Xr/eeZq/2/iV/9r5Eb/aeE//2TfNf9j4DD/Y940/2TdOf9o3zz/b+FH/3zk + Xv+A6mn/ceRS/2jXP/9byg//U88A/1vRG/9l2jz/X9o9/13ZPP9d1zf/YNQ5/2XTQ/9uzVTvksuAMwAA + AABdqk4AAAAAAAAAAAAAAAAAAAAAAFCqOwAAAAAAxvTKAoHPbk9tzU3/WdI0/2DRM/9f1TL/XNs1/1/d + P/9f3T7/Wto2/1vaKf9e2Q//Ztsh/3LiU/985Gf/juh4/5Xuhv+U7YP/jOx3/4Xpb/+G6nD/hehv/43r + e/+L7Hn/hOdr/3/fXP9w4VP/auBB/1fJHP9eyhL/VNYk/1vZMv9i3ED/YtpD/2HXP/9e1Sf/ZtNA/2bP + UP6ZwYFXAAAAAAAAAADU/s8AAAAAAAAAAAAAAAAAAAAAAND0wAAAAAAAAAAAAK7VpgaEzWtccstS/1nU + NP9V2Cv/YdU0/1/ZOP9i3D3/Yt47/1vZI/9X1QP/X9kX/2TdOv9p3Uj/dN5V/3nhYP995GT/fuZk/33m + Yv9/6GX/fudi/3ffaf9z4kv/YdgV/2PXCf9f2Cn/Ydw0/2DZNP9h2jb/XtpC/13ZQP9i2UH/ZNhA/2jU + Q/9gz0X/bM5H/4HMbGT/g/8CAAAAAJrQkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACk1qAAAAAAAAAA + AACu1pwIh8xxXGzJV/9b0Tn/YtM1/1/WMf9j1zf/Zds2/1/YIf9d1xj/Yt0w/1/bN/9f2Tv/Ytw7/2bf + P/9q4kX/aeBI/2rfSv9r4Er/at9L/2HiOf9z2lv/es9d/2DLGP9e1SX/Y943/1/cP/9b2kX/YddG/2HW + RP9j1kP/ZdVC/2bTL/9jxzX/fshrYrLMlwQAAAAAqbySAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAnNKMAAAAAAAAAAAAsNqqBojMeE9xy1jrW9Qx/2HTLP9h0i//Y9Yt/2PXJf9m1zX/Y9pN/2Hb + RP9j2UP/ZN06/2TfNf9k3Tn/Yt08/1/dPP9e2zr/X948/1/aOf991mv/itJ+/2vSSP9n2kL/Y9g//2HY + PP9h2Dr/X9k5/2DVO/9j1EH/ZdND/2jLS/J/xlpOkMOZBAAAAACLy3QAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKPWkAAAAAAAAAAAAN311QKLyHwveclfvWPRO/9b0jj/XdMy/2TU + MP9m1Tz/YdZG/2HaRf9m20f/ZtpL/2jdSv9p30n/aN9H/2TcQ/9i2UD/Y9tB/2TYSv9k10f/ZtpE/2LZ + QP9h2ED/YNk7/17WN/9e1Dv/YNE+/1/XN/9o0Ef/d8pexpS8iiqayIIDAAAAAIPGdQAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACq2qAAAAAAAAAAAAAAAAAAjceFEoHJ + bG10y1DvZdA8/2DQOP9i1DT/YtY//2fWQ/9p2Ef/Z9pK/2jcSf9o3Ub/aN5G/2bcQ/9j2ED/Z9xE/2bb + Q/9i2jv/X9g1/1/XOf9j0Tr/ZdQ2/2PWM/9h1Db/Z9Y5/3DIVvWBxnNwfMhnC/+U/wEAAAAAicZrAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx+u9AFSk + PwAAAAAAAAAAAL7fuQGLyXofgcpkjHLNT/FgzkX/WtQ7/1nXMv9f1Tj/Y9NB/2LVP/9i1Tz/YdU7/2DV + Ov9i1jv/YdU7/2DXM/9d1S3/XdMw/1/ROv9f1jX/X9Q0/1/IOf9szU32ecVmjIvRfBmMxYMEAAAAAAAA + AACzs7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACPyIgAAAAAAAAAAACiyKQAAGgAAJvVjheKzHxpeMpeyG/PR/9m0j7/YdI8/1/R + OP9f0jb/YtU4/2PWOf9h1Df/YNM2/1nQKf9Z0Sj/XtI0/2PSRP9szkb/csNOx369Y2qT0n0Shst5A77m + wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6f/lAG64WQAAAAAAAAAAALDarwBovFwA////AMLD + qhqTx3lXfMthkHbKWbxxzFLdbc9N8mvPS/1ny0f9ac9J8m3OTd1yzFO8fMlfkIzLbliw0aAXuM6vAm63 + TwGy16QAAAAAAAAAAAAAAAAAp+KeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD//4AB//8AAP/8AAA//wAA//AAAA//AAD/wAAAA/8AAP+AAAAB/wAA/gAAAAD/AAD8AAAAAH8AAPgA + AAAAPwAA8AAAAAAfAADgAAAAAA8AAOAAAAAABwAAwAAAAAAHAADAAAAAAAMAAIAAAAAAAwAAgAAAAAAB + AAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAcAAOAA + AAAABwAA8AAAAAAPAADwAAAAAB8AAPgAAAAAHwAA/AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/8AAAAH/ + AAD/4AAAB/8AAP/8AAAf/wAA//+AAH//AAA= + + \ No newline at end of file diff --git a/Gola2/PerPixelAlphaForm.cs b/Gola2/PerPixelAlphaForm.cs deleted file mode 100644 index ee65114..0000000 --- a/Gola2/PerPixelAlphaForm.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using System.Drawing.Imaging; -using System.Runtime.InteropServices; - -namespace Gola2 -{ - public partial class PerPixelAlphaForm : Form - { - public PerPixelAlphaForm() - { - FormBorderStyle = FormBorderStyle.None; - ShowInTaskbar = false; - //StartPosition = FormStartPosition.CenterScreen; - Load += PerPixelAlphaForm_Load; - InitActor(); - } - - #region Actor management - private delegate void SetPositionDelegate(System.Drawing.Point position); - - private Screen currentScreen; - - private void InitActor() - { - currentScreen = Screen.FromControl(this); - } - - public void SetPosition(System.Drawing.Point position) - { - if (InvokeRequired) - Invoke((Action)delegate () { SetPosition(position); }); - else - { - Location = position; - currentScreen = Screen.FromControl(this); - } - } - - public Screen Screen => currentScreen; - #endregion - - void PerPixelAlphaForm_Load(object sender, EventArgs e) - { - TopMost = true; - } - - protected override CreateParams CreateParams - { - get - { - // Add the layered extended style (WS_EX_LAYERED) to this window. - CreateParams createParams = base.CreateParams; - if (!DesignMode) - createParams.ExStyle |= WS_EX_LAYERED; - return createParams; - } - } - /// - /// Let Windows drag this window for us (thinks its hitting the title - /// bar of the window) - /// - /// - protected override void WndProc(ref Message message) - { - if (message.Msg == WM_NCHITTEST) - { - // Tell Windows that the user is on the title bar (caption) - message.Result = (IntPtr)HTCAPTION; - } - else - { - base.WndProc(ref message); - } - } - /// - /// - /// - /// - public void SelectBitmap(Bitmap bitmap) - { - SelectBitmap(bitmap, 255); - } - /// - /// - /// - /// - /// - /// - /// - /// Specifies an alpha transparency value to be used on the entire source - /// bitmap. The SourceConstantAlpha value is combined with any per-pixel - /// alpha values in the source bitmap. The value ranges from 0 to 255. If - /// you set SourceConstantAlpha to 0, it is assumed that your image is - /// transparent. When you only want to use per-pixel alpha values, set - /// the SourceConstantAlpha value to 255 (opaque). - /// - public void SelectBitmap(Bitmap bitmap, int opacity) - { - // Does this bitmap contain an alpha channel? - if (bitmap.PixelFormat != PixelFormat.Format32bppArgb) - { - throw new ApplicationException("The bitmap must be 32bpp with alpha-channel."); - } - - // Get device contexts - IntPtr screenDc = GetDC(IntPtr.Zero); - IntPtr memDc = CreateCompatibleDC(screenDc); - IntPtr hBitmap = IntPtr.Zero; - IntPtr hOldBitmap = IntPtr.Zero; - - try - { - // Get handle to the new bitmap and select it into the current - // device context. - hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); - hOldBitmap = SelectObject(memDc, hBitmap); - - // Set parameters for layered window update. - Size newSize = new Size(bitmap.Width, bitmap.Height); - Point sourceLocation = new Point(0, 0); - Point newLocation = new Point(this.Left, this.Top); - BLENDFUNCTION blend = new BLENDFUNCTION(); - blend.BlendOp = AC_SRC_OVER; - blend.BlendFlags = 0; - blend.SourceConstantAlpha = (byte)opacity; - blend.AlphaFormat = AC_SRC_ALPHA; - - // Update the window. - UpdateLayeredWindow( - this.Handle, // Handle to the layered window - screenDc, // Handle to the screen DC - ref newLocation, // New screen position of the layered window - ref newSize, // New size of the layered window - memDc, // Handle to the layered window surface DC - ref sourceLocation, // Location of the layer in the DC - 0, // Color key of the layered window - ref blend, // Transparency of the layered window - ULW_ALPHA // Use blend as the blend function - ); - } - finally - { - // Release device context. - ReleaseDC(IntPtr.Zero, screenDc); - if (hBitmap != IntPtr.Zero) - { - SelectObject(memDc, hOldBitmap); - DeleteObject(hBitmap); - } - DeleteDC(memDc); - } - } - #region Native Methods and Structures - - const Int32 WS_EX_LAYERED = 0x80000; - const Int32 HTCAPTION = 0x02; - const Int32 WM_NCHITTEST = 0x84; - const Int32 ULW_ALPHA = 0x02; - const byte AC_SRC_OVER = 0x00; - const byte AC_SRC_ALPHA = 0x01; - - [StructLayout(LayoutKind.Sequential)] - struct Point - { - public Int32 x; - public Int32 y; - - public Point(Int32 x, Int32 y) - { this.x = x; this.y = y; } - } - - [StructLayout(LayoutKind.Sequential)] - struct Size - { - public Int32 cx; - public Int32 cy; - - public Size(Int32 cx, Int32 cy) - { this.cx = cx; this.cy = cy; } - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct ARGB - { - public byte Blue; - public byte Green; - public byte Red; - public byte Alpha; - } - - [StructLayout(LayoutKind.Sequential, Pack = 1)] - struct BLENDFUNCTION - { - public byte BlendOp; - public byte BlendFlags; - public byte SourceConstantAlpha; - public byte AlphaFormat; - } - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, - ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, - Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern IntPtr CreateCompatibleDC(IntPtr hDC); - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern IntPtr GetDC(IntPtr hWnd); - - [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool DeleteDC(IntPtr hdc); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); - - [DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true)] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool DeleteObject(IntPtr hObject); - - #endregion - - private void InitializeComponent() - { - this.SuspendLayout(); - // - // PerPixelAlphaForm - // - this.ClientSize = new System.Drawing.Size(284, 261); - this.Name = "PerPixelAlphaForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - this.ResumeLayout(false); - - } - } -} diff --git a/Gola2/PerPixelAlphaForm.resx b/Gola2/PerPixelAlphaForm.resx deleted file mode 100644 index 1af7de1..0000000 --- a/Gola2/PerPixelAlphaForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Gola2/Program.cs b/Gola2/Program.cs index 110352a..bf2b482 100644 --- a/Gola2/Program.cs +++ b/Gola2/Program.cs @@ -7,6 +7,7 @@ { static class Program { + static MainForm main; /// /// The main entry point for the application. /// @@ -15,7 +16,8 @@ { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new MainForm()); + main = new MainForm(); + Application.Run(); } } } diff --git a/Gola2/Properties/Resources.Designer.cs b/Gola2/Properties/Resources.Designer.cs index aee73fb..bb0e325 100644 --- a/Gola2/Properties/Resources.Designer.cs +++ b/Gola2/Properties/Resources.Designer.cs @@ -63,9 +63,9 @@ /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap ball { + internal static System.Drawing.Bitmap Ball2 { get { - object obj = ResourceManager.GetObject("ball", resourceCulture); + object obj = ResourceManager.GetObject("Ball2", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } diff --git a/Gola2/Properties/Resources.resx b/Gola2/Properties/Resources.resx index 03ac2fd..2f941fe 100644 --- a/Gola2/Properties/Resources.resx +++ b/Gola2/Properties/Resources.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\ball.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\Ball2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Gola2/Resources/Ball2.png b/Gola2/Resources/Ball2.png new file mode 100644 index 0000000..24e2c03 --- /dev/null +++ b/Gola2/Resources/Ball2.png Binary files differ diff --git a/Gola2/Resources/ball.png b/Gola2/Resources/ball.png deleted file mode 100644 index b537d6c..0000000 --- a/Gola2/Resources/ball.png +++ /dev/null Binary files differ diff --git a/res/Ball2.png b/res/Ball2.png new file mode 100644 index 0000000..24e2c03 --- /dev/null +++ b/res/Ball2.png Binary files differ diff --git a/res/Gola2.ico b/res/Gola2.ico new file mode 100644 index 0000000..f7abd88 --- /dev/null +++ b/res/Gola2.ico Binary files differ diff --git a/res/RubberBall.png b/res/RubberBall.png new file mode 100644 index 0000000..47624f0 --- /dev/null +++ b/res/RubberBall.png Binary files differ